@@ -184,6 +184,18 @@ int Field_template::assign_append() noexcept
184184 return 0 ;
185185}
186186
187+ template <typename T>
188+ int Field_template::assign_unique_count () noexcept
189+ {
190+ typename_size = sizeof (T);
191+ ag_fnc = unique_count<T>;
192+ post_proc_fnc = Unique_count_data<T>::postprocessing;
193+ init_fnc = Unique_count_data<T>::init;
194+ deinit_fnc = Unique_count_data<T>::deinit;
195+ ag_data_size = sizeof (Unique_count_data<T>);
196+ return 0 ;
197+ }
198+
187199template <Field_type ag_type, typename T>
188200int Field_template::assign_min_max () noexcept
189201{
@@ -431,6 +443,23 @@ int Field_template::set_templates(const Field_type ag_type, const ur_field_type_
431443 std::cerr << " Only string and int, uint, float, double, mac, time, and IP array can be used to APPEND function." << std::endl;
432444 return 1 ;
433445 }
446+ case UNIQUE_COUNT:
447+ switch (ur_f_type) {
448+ case UR_TYPE_UINT8: return assign_unique_count<uint8_t >();
449+ case UR_TYPE_INT8: return assign_unique_count<int8_t >();
450+ case UR_TYPE_UINT16: return assign_unique_count<uint16_t >();
451+ case UR_TYPE_INT16: return assign_unique_count<int16_t >();
452+ case UR_TYPE_UINT32: return assign_unique_count<uint32_t >();
453+ case UR_TYPE_INT32: return assign_unique_count<int32_t >();
454+ case UR_TYPE_UINT64: return assign_unique_count<uint64_t >();
455+ case UR_TYPE_INT64: return assign_unique_count<int64_t >();
456+ case UR_TYPE_MAC: return assign_unique_count<Mac_addr>();
457+ case UR_TYPE_IP: return assign_unique_count<uint128_t >();
458+ case UR_TYPE_STRING: return assign_unique_count<char >();
459+ default :
460+ std::cerr << " Only string and int, uint, float, double, mac, time, and IP array can be used to UNIQUE_COUNT function." << std::endl;
461+ return 1 ;
462+ }
434463 default :
435464 assert (" Invalid case option.\n " );
436465 return 1 ;
@@ -732,8 +761,10 @@ int Field_template::set_templates_dir(const ur_field_type_t ur_f_type, const ur_
732761 }
733762}
734763
735- Field::Field (const Field_config cfg, const ur_field_id_t ur_fid, const ur_field_id_t ur_r_fid) :
736- ur_fid(ur_fid), ur_r_fid(ur_r_fid), ur_sort_key_id(0 ), ur_sort_key_type()
764+ Field::Field (const Field_config cfg, const ur_field_id_t ur_fid_in, const ur_field_id_t ur_r_fid_in,
765+ const ur_field_id_t ur_fid_out, const ur_field_id_t ur_r_fid_out)
766+ : ur_fid(ur_fid_in), ur_r_fid(ur_r_fid_in), ur_fid_out(ur_fid_out),
767+ ur_r_fid_out(ur_r_fid_out), ur_sort_key_id(0 ), ur_sort_key_type()
737768{
738769 ur_field_type_t ur_field_type = ur_get_type (ur_fid);
739770
@@ -813,6 +844,11 @@ void Fields::init(uint8_t *memory)
813844 data.first .init (memory, &cfg);
814845 break ;
815846 }
847+ case UNIQUE_COUNT: {
848+ struct Config_unique_count cfg = {data.first .limit };
849+ data.first .init (memory, &cfg);
850+ break ;
851+ }
816852 case SORTED_MERGE:
817853 case SORTED_MERGE_DIR: {
818854 struct Config_sorted_merge cfg = {data.first .limit , data.first .delimiter , data.first .sort_type };
0 commit comments