@@ -150,6 +150,9 @@ int UnirecExporter::init_trap(std::string& ifcs, int verbosity)
150150 return ifc_cnt;
151151}
152152
153+ template <typename T>
154+ constexpr bool always_false = false ;
155+
153156template <typename Type>
154157static ur_field_id_t defineField (std::string_view name) noexcept
155158{
@@ -175,9 +178,47 @@ static ur_field_id_t defineField(std::string_view name) noexcept
175178 return ur_define_field (name.data (), UR_TYPE_DOUBLE);
176179 } else if constexpr (std::is_same_v<Type, std::string_view>) {
177180 return ur_define_field (name.data (), UR_TYPE_STRING);
181+ } else if constexpr (std::is_same_v<Type, MACAddress>) {
182+ return ur_define_field (name.data (), UR_TYPE_MAC);
183+ } else if constexpr (std::is_same_v<Type, IPAddress>) {
184+ return ur_define_field (name.data (), UR_TYPE_IP);
185+ } else if constexpr (std::is_same_v<Type, Timestamp>) {
186+ return ur_define_field (name.data (), UR_TYPE_TIME);
187+ } else if constexpr (std::is_same_v<Type, std::span<const std::byte>>) {
188+ return ur_define_field (name.data (), UR_TYPE_BYTES);
189+ } else if constexpr (std::is_same_v<Type, std::span<const std::string>>) {
190+ return ur_define_field (name.data (), UR_TYPE_STRING);
191+ } else if constexpr (std::is_same_v<Type, std::span<const MACAddress>>) {
192+ return ur_define_field (name.data (), UR_TYPE_A_MAC);
193+ } else if constexpr (std::is_same_v<Type, std::span<const IPAddress>>) {
194+ return ur_define_field (name.data (), UR_TYPE_A_IP);
195+ } else if constexpr (std::is_same_v<Type, std::span<const Timestamp>>) {
196+ return ur_define_field (name.data (), UR_TYPE_A_TIME);
197+ } else if constexpr (std::is_same_v<Type, std::span<const double >>) {
198+ return ur_define_field (name.data (), UR_TYPE_A_DOUBLE);
199+ } else if constexpr (std::is_same_v<Type, std::span<const float >>) {
200+ return ur_define_field (name.data (), UR_TYPE_A_FLOAT);
201+ } else if constexpr (std::is_same_v<Type, std::span<const uint8_t >>) {
202+ return ur_define_field (name.data (), UR_TYPE_A_UINT8);
203+ } else if constexpr (std::is_same_v<Type, std::span<const uint16_t >>) {
204+ return ur_define_field (name.data (), UR_TYPE_A_UINT16);
205+ } else if constexpr (std::is_same_v<Type, std::span<const uint32_t >>) {
206+ return ur_define_field (name.data (), UR_TYPE_A_UINT32);
207+ } else if constexpr (std::is_same_v<Type, std::span<const uint64_t >>) {
208+ return ur_define_field (name.data (), UR_TYPE_A_UINT64);
209+ } else if constexpr (std::is_same_v<Type, std::span<const int8_t >>) {
210+ return ur_define_field (name.data (), UR_TYPE_A_INT8);
211+ } else if constexpr (std::is_same_v<Type, std::span<const int16_t >>) {
212+ return ur_define_field (name.data (), UR_TYPE_A_INT16);
213+ } else if constexpr (std::is_same_v<Type, std::span<const int32_t >>) {
214+ return ur_define_field (name.data (), UR_TYPE_A_INT32);
215+ } else if constexpr (std::is_same_v<Type, std::span<const int64_t >>) {
216+ return ur_define_field (name.data (), UR_TYPE_A_INT64);
178217 } else {
179- throw std::logic_error ( " unsupported field type" );
218+ static_assert (always_false<Type>, " Unsupported type" );
180219 }
220+
221+ __builtin_unreachable ();
181222}
182223
183224void UnirecExporter::init (const char * params)
@@ -222,19 +263,11 @@ void UnirecExporter::init(const char* params)
222263
223264 std::ranges::transform (m_fieldManager.getBiflowFields (), std::back_inserter (m_field_ids),
224265 [&](const FieldDescriptor& fieldDescriptor) {
225- // const auto& getter = ;
226-
227266 return std::visit (
228267 [&](const auto & variant) {
229- // using GetterT = std::decay_t<decltype(variant)>;
230268 return std::visit ([&](const auto & accessor) {
231269 return defineField<decltype (accessor (nullptr ))>(fieldDescriptor.getName ());
232270 }, variant);
233- /* if constexpr (std::is_same_v<GetterT, ScalarValueGetter>) {
234- defineScalar(, variant, pluginExportData, tmplt_ptr, record_ptr);
235- } else if constexpr (std::is_same_v<GetterT, VectorValueGetter>) {
236- fillFromVectorVariant(outputField, variant, pluginExportData, tmplt_ptr, record_ptr);
237- }*/
238271 }, fieldDescriptor.getValueGetter ());
239272 });
240273}
@@ -394,7 +427,7 @@ void UnirecExporter::free_unirec_resources()
394427
395428/* template<typename T>
396429static void
397- printVector (const FieldDescriptor& field, const VectorAccessor<T>& accessor, const void* data)
430+ fillFromVectorVariant (const FieldDescriptor& field, const VectorAccessor<T>& accessor, const void* data)
398431{
399432 std::cout << "[" << field.getGroup() << "] " << field.getName() << ": [";
400433
@@ -412,17 +445,46 @@ printVector(const FieldDescriptor& field, const VectorAccessor<T>& accessor, con
412445void UnirecExporter::fillFromScalarVariant (const FieldDescriptor& field, const ScalarValueGetter& variant, const void * data, ur_template_t * tmplt_ptr, void * record_ptr) noexcept
413446{
414447 const auto visitor = [&](const auto & accessor) {
415- *reinterpret_cast <decltype (accessor (data))*>(
416- ur_get_ptr_by_id (tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex ()])) = accessor (data);
448+ if constexpr (std::is_same_v<std::decay_t <decltype (accessor (data))>, std::string_view>) {
449+ ur_set_string (tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex ()], accessor (data).data ());
450+ } else {
451+ *reinterpret_cast <decltype (accessor (data))*>(
452+ ur_get_ptr_by_id (tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex ()])) = accessor (data);
453+ }
417454 };
418455 std::visit (visitor, variant);
419456}
420457
421- static void
422- fillFromVectorVariant (const FieldDescriptor& field, const VectorValueGetter& variant, const void * data)
458+ void UnirecExporter::fillFromVectorVariant (const FieldDescriptor& field, const VectorValueGetter& variant, const void * data, ur_template_t * tmplt_ptr, void * record_ptr) noexcept
423459{
424- /* const auto visitor = [&](const auto& accessor) { printVector(field, accessor, data); };
425- std::visit(visitor, variant);*/
460+ const auto visitor = [&](const auto & accessor) {
461+ if constexpr (std::is_same_v<std::decay_t <decltype (accessor (data))>, std::span<const Timestamp>>) {
462+ ur_set_var_len (tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex ()], accessor (data).size () * sizeof (ur_time_t ));
463+ auto * buffer = reinterpret_cast <ur_time_t *>(ur_get_ptr_by_id (tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex ()]));
464+ std::ranges::transform (accessor (data), buffer, [](const Timestamp& ts) {
465+ return ur_time_from_sec_usec (ts.toTimeval ().tv_sec , ts.toTimeval ().tv_usec );
466+ });
467+ } else if constexpr (std::is_same_v<std::decay_t <decltype (accessor (data))>, std::span<const std::string>>) {
468+ const std::size_t totalLength = std::accumulate (accessor (data).begin (), accessor (data).end (), 0 ,
469+ [](std::size_t sum, const std::string& str) { return sum + str.size () + sizeof (' ;' ); });
470+ ur_set_var_len (tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex ()], totalLength);
471+ auto * buffer = reinterpret_cast <char *>(ur_get_ptr_by_id (tmplt_ptr, record_ptr, m_field_ids[field.getBitIndex ()]));
472+ std::ranges::for_each (accessor (data), [&buffer](const std::string& str) {
473+ std::memcpy (buffer, str.data (), str.size ());
474+ buffer += str.size ();
475+ *(buffer++) = ' ;' ;
476+ });
477+ } /* else if constexpr (std::is_same_v<std::decay_t<decltype(accessor(data))>, std::span<const IPAddress>>) {}*/
478+ else {
479+ ur_set_var (
480+ tmplt_ptr,
481+ record_ptr,
482+ m_field_ids[field.getBitIndex ()],
483+ accessor (data).data (),
484+ accessor (data).size () * sizeof (decltype (accessor (data)[0 ])));
485+ }
486+ };
487+ std::visit (visitor, variant);
426488}
427489
428490
@@ -482,7 +544,7 @@ void UnirecExporter::processRecord(FlowRecordUniquePtr& flowRecord)
482544 if constexpr (std::is_same_v<GetterT, ScalarValueGetter>) {
483545 fillFromScalarVariant (fieldDescriptor, variant, pluginExportData, tmplt_ptr, record_ptr);
484546 } else if constexpr (std::is_same_v<GetterT, VectorValueGetter>) {
485- // fillFromVectorVariant(outputField , variant, pluginExportData, tmplt_ptr, record_ptr);
547+ fillFromVectorVariant (fieldDescriptor , variant, pluginExportData, tmplt_ptr, record_ptr);
486548 }
487549 },
488550 getter);
0 commit comments