@@ -35,7 +35,7 @@ const std::string input_path = "test/";
3535#endif
3636
3737TEST_CASE (" req sketch: empty" , " [req_sketch]" ) {
38- std::cout << " sizeof(req_float_sketch)=" << sizeof (req_sketch<float >) << " \n " ;
38+ // std::cout << "sizeof(req_float_sketch)=" << sizeof(req_sketch<float>) << "\n";
3939 req_sketch<float > sketch (12 );
4040 REQUIRE (sketch.get_k () == 12 );
4141 REQUIRE (sketch.is_HRA ());
@@ -245,7 +245,7 @@ TEST_CASE("req sketch: byte serialize-deserialize single item", "[req_sketch]")
245245 auto bytes = sketch.serialize ();
246246 REQUIRE (bytes.size () == sketch.get_serialized_size_bytes ());
247247 auto sketch2 = req_sketch<float >::deserialize (bytes.data (), bytes.size ());
248- std::cout << sketch2.to_string (true );
248+ // std::cout << sketch2.to_string(true);
249249 REQUIRE (bytes.size () == sketch2.get_serialized_size_bytes ());
250250 REQUIRE (sketch2.is_empty () == sketch.is_empty ());
251251 REQUIRE (sketch2.is_estimation_mode () == sketch.is_estimation_mode ());
@@ -282,7 +282,7 @@ TEST_CASE("req sketch: byte serialize-deserialize exact mode", "[req_sketch]") {
282282 auto bytes = sketch.serialize ();
283283 REQUIRE (bytes.size () == sketch.get_serialized_size_bytes ());
284284 auto sketch2 = req_sketch<float >::deserialize (bytes.data (), bytes.size ());
285- std::cout << sketch2.to_string (true );
285+ // std::cout << sketch2.to_string(true);
286286 REQUIRE (bytes.size () == sketch2.get_serialized_size_bytes ());
287287 REQUIRE (sketch2.is_empty () == sketch.is_empty ());
288288 REQUIRE (sketch2.is_estimation_mode () == sketch.is_estimation_mode ());
@@ -485,6 +485,72 @@ TEST_CASE("req sketch: merge incompatible HRA and LRA", "[req_sketch]") {
485485 REQUIRE_THROWS_AS (sketch1.merge (sketch2), std::invalid_argument);
486486}
487487
488+ TEST_CASE (" req sketch: type conversion - empty" , " [req_sketch]" ) {
489+ req_sketch<double > req_double (12 );
490+ req_sketch<float > req_float (req_double);
491+ REQUIRE (req_float.is_empty ());
492+ REQUIRE (req_float.get_k () == req_double.get_k ());
493+ REQUIRE (req_float.get_n () == 0 );
494+ REQUIRE (req_float.get_num_retained () == 0 );
495+ }
496+
497+ TEST_CASE (" req sketch: type conversion - several levels" , " [req_sketch]" ) {
498+ req_sketch<double > req_double (12 );
499+ for (int i = 0 ; i < 1000 ; ++i) req_double.update (static_cast <double >(i));
500+ req_sketch<float > req_float (req_double);
501+ REQUIRE (!req_float.is_empty ());
502+ REQUIRE (req_float.get_k () == req_double.get_k ());
503+ REQUIRE (req_float.get_n () == req_double.get_n ());
504+ REQUIRE (req_float.get_num_retained () == req_double.get_num_retained ());
505+
506+ auto sv_float = req_float.get_sorted_view (false );
507+ auto sv_double = req_double.get_sorted_view (false );
508+ auto sv_float_it = sv_float.begin ();
509+ auto sv_double_it = sv_double.begin ();
510+ while (sv_float_it != sv_float.end ()) {
511+ REQUIRE (sv_double_it != sv_double.end ());
512+ auto float_pair = *sv_float_it;
513+ auto double_pair = *sv_double_it;
514+ REQUIRE (float_pair.first == Approx (double_pair.first ).margin (0.01 ));
515+ REQUIRE (float_pair.second == double_pair.second );
516+ ++sv_float_it;
517+ ++sv_double_it;
518+ }
519+ REQUIRE (sv_double_it == sv_double.end ());
520+ }
521+
522+ class A {
523+ int val;
524+ public:
525+ A (int val): val(val) {}
526+ int get_val () const { return val; }
527+ };
528+
529+ struct less_A {
530+ bool operator ()(const A& a1, const A& a2) const { return a1.get_val () < a2.get_val (); }
531+ };
532+
533+ class B {
534+ int val;
535+ public:
536+ explicit B (const A& a): val(a.get_val()) {}
537+ int get_val () const { return val; }
538+ };
539+
540+ struct less_B {
541+ bool operator ()(const B& b1, const B& b2) const { return b1.get_val () < b2.get_val (); }
542+ };
543+
544+ TEST_CASE (" req sketch: type conversion - custom types" ) {
545+ req_sketch<A, less_A> sa (4 );
546+ sa.update (1 );
547+ sa.update (2 );
548+ sa.update (3 );
549+
550+ req_sketch<B, less_B> sb (sa);
551+ REQUIRE (sb.get_n () == 3 );
552+ }
553+
488554// TEST_CASE("for manual comparison with Java") {
489555// req_sketch<float> sketch(12, false);
490556// for (size_t i = 0; i < 100000; ++i) sketch.update(i);
0 commit comments