@@ -1408,65 +1408,65 @@ struct seg_search_n {
14081408};
14091409
14101410// --- set_union ---
1411- template <class C , class OutVec >
1411+ template <class C1 , class C2 , class OutT >
14121412struct std_set_union {
1413- const C &c; const C &c2; OutVec &out;
1414- std_set_union (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1413+ const C1 &c; const C2 &c2; OutT &out;
1414+ std_set_union (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14151415 BOOST_CONTAINER_FORCEINLINE void operator ()()
14161416 { clobber (); std::set_union (c.begin (), c.end (), c2.begin (), c2.end (), out.begin ()); escape (&out[0 ]); }
14171417};
1418- template <class C , class OutVec , bool Wrap = false >
1418+ template <class C1 , class C2 , class OutT , bool Wrap = false >
14191419struct seg_set_union {
1420- const C &c; const C &c2; OutVec &out;
1421- seg_set_union (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1420+ const C1 &c; const C2 &c2; OutT &out;
1421+ seg_set_union (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14221422 BOOST_CONTAINER_FORCEINLINE void operator ()()
14231423 { clobber (); bc::segmented_set_union (iter_w<Wrap>::wrap (c.begin ()), iter_w<Wrap>::wrap (c.end ()), iter_w<Wrap>::wrap (c2.begin ()), iter_w<Wrap>::wrap (c2.end ()), iter_w<Wrap>::wrap (out.begin ())); escape (&out[0 ]); }
14241424};
14251425
14261426// --- set_difference ---
1427- template <class C , class OutVec >
1427+ template <class C1 , class C2 , class OutT >
14281428struct std_set_difference {
1429- const C &c; const C &c2; OutVec &out;
1430- std_set_difference (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1429+ const C1 &c; const C2 &c2; OutT &out;
1430+ std_set_difference (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14311431 BOOST_CONTAINER_FORCEINLINE void operator ()()
14321432 { clobber (); std::set_difference (c.begin (), c.end (), c2.begin (), c2.end (), out.begin ()); escape (&out[0 ]); }
14331433};
1434- template <class C , class OutVec , bool Wrap = false >
1434+ template <class C1 , class C2 , class OutT , bool Wrap = false >
14351435struct seg_set_difference {
1436- const C &c; const C &c2; OutVec &out;
1437- seg_set_difference (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1436+ const C1 &c; const C2 &c2; OutT &out;
1437+ seg_set_difference (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14381438 BOOST_CONTAINER_FORCEINLINE void operator ()()
14391439 { clobber (); bc::segmented_set_difference (iter_w<Wrap>::wrap (c.begin ()), iter_w<Wrap>::wrap (c.end ()), iter_w<Wrap>::wrap (c2.begin ()), iter_w<Wrap>::wrap (c2.end ()), iter_w<Wrap>::wrap (out.begin ())); escape (&out[0 ]); }
14401440};
14411441
14421442// --- set_intersection ---
1443- template <class C , class OutVec >
1443+ template <class C1 , class C2 , class OutT >
14441444struct std_set_intersection {
1445- const C &c; const C &c2; OutVec &out;
1446- std_set_intersection (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1445+ const C1 &c; const C2 &c2; OutT &out;
1446+ std_set_intersection (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14471447 BOOST_CONTAINER_FORCEINLINE void operator ()()
14481448 { clobber (); std::set_intersection (c.begin (), c.end (), c2.begin (), c2.end (), out.begin ()); escape (&out[0 ]); }
14491449};
1450- template <class C , class OutVec , bool Wrap = false >
1450+ template <class C1 , class C2 , class OutT , bool Wrap = false >
14511451struct seg_set_intersection {
1452- const C &c; const C &c2; OutVec &out;
1453- seg_set_intersection (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1452+ const C1 &c; const C2 &c2; OutT &out;
1453+ seg_set_intersection (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14541454 BOOST_CONTAINER_FORCEINLINE void operator ()()
14551455 { clobber (); bc::segmented_set_intersection (iter_w<Wrap>::wrap (c.begin ()), iter_w<Wrap>::wrap (c.end ()), iter_w<Wrap>::wrap (c2.begin ()), iter_w<Wrap>::wrap (c2.end ()), iter_w<Wrap>::wrap (out.begin ())); escape (&out[0 ]); }
14561456};
14571457
14581458// --- set_symmetric_difference ---
1459- template <class C , class OutVec >
1459+ template <class C1 , class C2 , class OutT >
14601460struct std_set_symmetric_difference {
1461- const C &c; const C &c2; OutVec &out;
1462- std_set_symmetric_difference (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1461+ const C1 &c; const C2 &c2; OutT &out;
1462+ std_set_symmetric_difference (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14631463 BOOST_CONTAINER_FORCEINLINE void operator ()()
14641464 { clobber (); std::set_symmetric_difference (c.begin (), c.end (), c2.begin (), c2.end (), out.begin ()); escape (&out[0 ]); }
14651465};
1466- template <class C , class OutVec , bool Wrap = false >
1466+ template <class C1 , class C2 , class OutT , bool Wrap = false >
14671467struct seg_set_symmetric_difference {
1468- const C &c; const C &c2; OutVec &out;
1469- seg_set_symmetric_difference (const C &c_, const C &c2_, OutVec &o_) : c(c_), c2(c2_), out(o_) {}
1468+ const C1 &c; const C2 &c2; OutT &out;
1469+ seg_set_symmetric_difference (const C1 &c_, const C2 &c2_, OutT &o_) : c(c_), c2(c2_), out(o_) {}
14701470 BOOST_CONTAINER_FORCEINLINE void operator ()()
14711471 { clobber (); bc::segmented_set_symmetric_difference (iter_w<Wrap>::wrap (c.begin ()), iter_w<Wrap>::wrap (c.end ()), iter_w<Wrap>::wrap (c2.begin ()), iter_w<Wrap>::wrap (c2.end ()), iter_w<Wrap>::wrap (out.begin ())); escape (&out[0 ]); }
14721472};
@@ -2041,52 +2041,48 @@ void bench_search_n(const C &c, std::size_t iters, const char* cname,
20412041 bench_ops::seg_search_n<C, true >(c, count, val, result), label, cname);
20422042}
20432043
2044- template <class C >
2045- void bench_set_union (const C &c, const C &c2, std::size_t iters, const char * cname)
2044+ template <class C1 , class C2 , class OutT >
2045+ void bench_set_union (const C1 &c, const C2 &c2, std::size_t iters,
2046+ const char * cname, const char * label)
20462047{
2047- typedef typename C::value_type VT ;
2048- typedef boost::container::vector<VT > out_vec_t ;
2049- out_vec_t out (c.size () + c2.size ());
2048+ OutT out (c.size () + c2.size ());
20502049 compare_batch (iters, c.size (),
2051- bench_ops::std_set_union<C, out_vec_t >(c, c2, out),
2052- bench_ops::seg_set_union<C, out_vec_t >(c, c2, out),
2053- bench_ops::seg_set_union<C, out_vec_t , true >(c, c2, out), " set_union " , cname);
2050+ bench_ops::std_set_union<C1 , C2 , OutT >(c, c2, out),
2051+ bench_ops::seg_set_union<C1 , C2 , OutT >(c, c2, out),
2052+ bench_ops::seg_set_union<C1 , C2 , OutT, true >(c, c2, out), label , cname);
20542053}
20552054
2056- template <class C >
2057- void bench_set_difference (const C &c, const C &c2, std::size_t iters, const char * cname)
2055+ template <class C1 , class C2 , class OutT >
2056+ void bench_set_difference (const C1 &c, const C2 &c2, std::size_t iters,
2057+ const char * cname, const char * label)
20582058{
2059- typedef typename C::value_type VT ;
2060- typedef boost::container::vector<VT > out_vec_t ;
2061- out_vec_t out (c.size ());
2059+ OutT out (c.size ());
20622060 compare_batch (iters, c.size (),
2063- bench_ops::std_set_difference<C, out_vec_t >(c, c2, out),
2064- bench_ops::seg_set_difference<C, out_vec_t >(c, c2, out),
2065- bench_ops::seg_set_difference<C, out_vec_t , true >(c, c2, out), " set_difference " , cname);
2061+ bench_ops::std_set_difference<C1 , C2 , OutT >(c, c2, out),
2062+ bench_ops::seg_set_difference<C1 , C2 , OutT >(c, c2, out),
2063+ bench_ops::seg_set_difference<C1 , C2 , OutT, true >(c, c2, out), label , cname);
20662064}
20672065
2068- template <class C >
2069- void bench_set_intersection (const C &c, const C &c2, std::size_t iters, const char * cname)
2066+ template <class C1 , class C2 , class OutT >
2067+ void bench_set_intersection (const C1 &c, const C2 &c2, std::size_t iters,
2068+ const char * cname, const char * label)
20702069{
2071- typedef typename C::value_type VT ;
2072- typedef boost::container::vector<VT > out_vec_t ;
2073- out_vec_t out (c.size ());
2070+ OutT out (c.size ());
20742071 compare_batch (iters, c.size (),
2075- bench_ops::std_set_intersection<C, out_vec_t >(c, c2, out),
2076- bench_ops::seg_set_intersection<C, out_vec_t >(c, c2, out),
2077- bench_ops::seg_set_intersection<C, out_vec_t , true >(c, c2, out), " set_intersection " , cname);
2072+ bench_ops::std_set_intersection<C1 , C2 , OutT >(c, c2, out),
2073+ bench_ops::seg_set_intersection<C1 , C2 , OutT >(c, c2, out),
2074+ bench_ops::seg_set_intersection<C1 , C2 , OutT, true >(c, c2, out), label , cname);
20782075}
20792076
2080- template <class C >
2081- void bench_set_symmetric_difference (const C &c, const C &c2, std::size_t iters, const char * cname)
2077+ template <class C1 , class C2 , class OutT >
2078+ void bench_set_symmetric_difference (const C1 &c, const C2 &c2, std::size_t iters,
2079+ const char * cname, const char * label)
20822080{
2083- typedef typename C::value_type VT ;
2084- typedef boost::container::vector<VT > out_vec_t ;
2085- out_vec_t out (c.size () + c2.size ());
2081+ OutT out (c.size () + c2.size ());
20862082 compare_batch (iters, c.size (),
2087- bench_ops::std_set_symmetric_difference<C, out_vec_t >(c, c2, out),
2088- bench_ops::seg_set_symmetric_difference<C, out_vec_t >(c, c2, out),
2089- bench_ops::seg_set_symmetric_difference<C, out_vec_t , true >(c, c2, out), " set_symmetric_difference " , cname);
2083+ bench_ops::std_set_symmetric_difference<C1 , C2 , OutT >(c, c2, out),
2084+ bench_ops::seg_set_symmetric_difference<C1 , C2 , OutT >(c, c2, out),
2085+ bench_ops::seg_set_symmetric_difference<C1 , C2 , OutT, true >(c, c2, out), label , cname);
20902086}
20912087
20922088template <class C , class Pred >
@@ -2289,6 +2285,8 @@ void run_all(const C& c, std::size_t iters, const char* cname)
22892285 bench_merge<C, vec_t , vec_t >(c, c2v, iters, cname, " merge(1S)" );
22902286 // merge(2S): first range = bc::vector, second range = C, out = bc::vector
22912287 bench_merge<vec_t , C, vec_t >(cv, c2, iters, cname, " merge(2S)" );
2288+ // merge(3S): first range = bc::vector, second range = bc::vector, out = C
2289+ bench_merge<vec_t , vec_t , C >(cv, c2v, iters, cname, " merge(3S)" );
22922290 // merge(2xS): both ranges = C, out = bc::vector
22932291 bench_merge<C, C, vec_t >(c, c2, iters, cname, " merge(2xS)" );
22942292 // merge(3xS): both ranges and out = C
@@ -2403,15 +2401,40 @@ void run_all(const C& c, std::size_t iters, const char* cname)
24032401 bench_search_n (c, iters, cname, 1 , half, " search_n(hit)" );
24042402 bench_search_n (c, iters, cname, 3 , min1, " search_n(miss)" );
24052403
2406- // set_difference, set_symmetric_difference, set_union
2404+ // set_difference, set_intersection, set_symmetric_difference, set_union
24072405 {
24082406 C c2 (c);
24092407 for (typename C::iterator it = c2.begin (); it != c2.end (); ++it)
24102408 *it = VT (int_value (*it) * 2 );
2411- bench_set_difference (c, c2, iters, cname);
2412- bench_set_intersection (c, c2, iters, cname);
2413- bench_set_symmetric_difference (c, c2, iters, cname);
2414- bench_set_union (c, c2, iters, cname);
2409+ vec_t c2v (c2.begin (), c2.end ());
2410+
2411+ // set_difference
2412+ bench_set_difference<C, vec_t , vec_t >(c, c2v, iters, cname, " set_difference(1S)" );
2413+ bench_set_difference<vec_t , C, vec_t >(cv, c2, iters, cname, " set_difference(2S)" );
2414+ bench_set_difference<vec_t , vec_t , C >(cv, c2v, iters, cname, " set_difference(3S)" );
2415+ bench_set_difference<C, C, vec_t >(c, c2, iters, cname, " set_difference(2xS)" );
2416+ bench_set_difference<C, C, C >(c, c2, iters, cname, " set_difference(3xS)" );
2417+
2418+ // set_intersection
2419+ bench_set_intersection<C, vec_t , vec_t >(c, c2v, iters, cname, " set_intersection(1S)" );
2420+ bench_set_intersection<vec_t , C, vec_t >(cv, c2, iters, cname, " set_intersection(2S)" );
2421+ bench_set_intersection<vec_t , vec_t , C >(cv, c2v, iters, cname, " set_intersection(3S)" );
2422+ bench_set_intersection<C, C, vec_t >(c, c2, iters, cname, " set_intersection(2xS)" );
2423+ bench_set_intersection<C, C, C >(c, c2, iters, cname, " set_intersection(3xS)" );
2424+
2425+ // set_symmetric_difference
2426+ bench_set_symmetric_difference<C, vec_t , vec_t >(c, c2v, iters, cname, " set_sym_diff(1S)" );
2427+ bench_set_symmetric_difference<vec_t , C, vec_t >(cv, c2, iters, cname, " set_sym_diff(2S)" );
2428+ bench_set_symmetric_difference<vec_t , vec_t , C >(cv, c2v, iters, cname, " set_sym_diff(3S)" );
2429+ bench_set_symmetric_difference<C, C, vec_t >(c, c2, iters, cname, " set_sym_diff(2xS)" );
2430+ bench_set_symmetric_difference<C, C, C >(c, c2, iters, cname, " set_sym_diff(3xS)" );
2431+
2432+ // set_union
2433+ bench_set_union<C, vec_t , vec_t >(c, c2v, iters, cname, " set_union(1S)" );
2434+ bench_set_union<vec_t , C, vec_t >(cv, c2, iters, cname, " set_union(2S)" );
2435+ bench_set_union<vec_t , vec_t , C >(cv, c2v, iters, cname, " set_union(3S)" );
2436+ bench_set_union<C, C, vec_t >(c, c2, iters, cname, " set_union(2xS)" );
2437+ bench_set_union<C, C, C >(c, c2, iters, cname, " set_union(3xS)" );
24152438 }
24162439
24172440 // stable_partition (not tested since it's not optimized for random access iterators)
0 commit comments