@@ -1037,12 +1037,13 @@ void bench_copy(const C &c, std::size_t iters, const char* cname, const char* la
10371037 print_ratio (label, cname, r1, r2);
10381038}
10391039
1040- template <class C , class Pred >
1040+ template <bool DequeOut, class C , class Pred >
10411041void bench_copy_if (const C &c, std::size_t iters, const char * cname,
10421042 Pred pred, const char * label)
10431043{
10441044 typedef typename C::value_type VT;
1045- boost::container::vector<VT> out (c.size ());
1045+ typedef typename boost::move_detail::if_c<DequeOut, bc::deque<VT>, boost::container::vector<VT> >::type out_t ;
1046+ out_t out (c.size ());
10461047
10471048 cpu_timer t1;
10481049 { std::size_t n_ = (iters + 7 ) / 8 ;
@@ -1795,39 +1796,42 @@ void bench_find_last_if_not(const C &c, std::size_t iters, const char* cname,
17951796 print_ratio (label, cname, r1, r2);
17961797}
17971798
1798- template <class C >
1799+ template <bool DequeSecond, class C >
17991800void bench_equal (const C &c, const C &c2, std::size_t iters, const char * cname,
18001801 const char * label)
18011802{
1803+ typedef typename C::value_type VT;
1804+ typedef typename boost::move_detail::if_c<DequeSecond, bc::deque<VT>, boost::container::vector<VT> >::type range2_t ;
1805+ range2_t range2 (c2.begin (), c2.end ());
18021806 int result = 0 ;
18031807
18041808 cpu_timer t1;
18051809 { std::size_t n_ = (iters + 7 ) / 8 ;
18061810 t1.resume ();
18071811 switch (iters % 8 ) {
18081812 case 0 : do {
1809- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1813+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18101814 BOOST_FALLTHROUGH;
18111815 case 7 :
1812- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1816+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18131817 BOOST_FALLTHROUGH;
18141818 case 6 :
1815- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1819+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18161820 BOOST_FALLTHROUGH;
18171821 case 5 :
1818- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1822+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18191823 BOOST_FALLTHROUGH;
18201824 case 4 :
1821- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1825+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18221826 BOOST_FALLTHROUGH;
18231827 case 3 :
1824- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1828+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18251829 BOOST_FALLTHROUGH;
18261830 case 2 :
1827- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1831+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18281832 BOOST_FALLTHROUGH;
18291833 case 1 :
1830- { clobber (); result = std::equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1834+ { clobber (); result = std::equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18311835 if (BOOST_UNLIKELY (--n_ == 0 )) { t1.stop (); break ; }
18321836 } while (true );
18331837 }
@@ -1838,28 +1842,28 @@ void bench_equal(const C &c, const C &c2, std::size_t iters, const char* cname,
18381842 t2.resume ();
18391843 switch (iters % 8 ) {
18401844 case 0 : do {
1841- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1845+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18421846 BOOST_FALLTHROUGH;
18431847 case 7 :
1844- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1848+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18451849 BOOST_FALLTHROUGH;
18461850 case 6 :
1847- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1851+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18481852 BOOST_FALLTHROUGH;
18491853 case 5 :
1850- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1854+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18511855 BOOST_FALLTHROUGH;
18521856 case 4 :
1853- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1857+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18541858 BOOST_FALLTHROUGH;
18551859 case 3 :
1856- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1860+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18571861 BOOST_FALLTHROUGH;
18581862 case 2 :
1859- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1863+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18601864 BOOST_FALLTHROUGH;
18611865 case 1 :
1862- { clobber (); result = bc::segmented_equal (c.begin (), c.end (), c2 .begin ()) ? 1 : 0 ; escape (&result); }
1866+ { clobber (); result = bc::segmented_equal (c.begin (), c.end (), range2 .begin ()) ? 1 : 0 ; escape (&result); }
18631867 if (BOOST_UNLIKELY (--n_ == 0 )) { t2.stop (); break ; }
18641868 } while (true );
18651869 }
@@ -2192,11 +2196,12 @@ void bench_fill_n(const C &c, std::size_t iters, const char* cname)
21922196 print_ratio (" fill_n" , cname, r1, r2);
21932197}
21942198
2195- template <class C >
2196- void bench_copy_n (const C &c, std::size_t iters, const char * cname)
2199+ template <bool DequeOut, class C >
2200+ void bench_copy_n (const C &c, std::size_t iters, const char * cname, const char * label )
21972201{
21982202 typedef typename C::value_type VT;
2199- boost::container::vector<VT> out (c.size ());
2203+ typedef typename boost::move_detail::if_c<DequeOut, bc::deque<VT>, boost::container::vector<VT> >::type out_t ;
2204+ out_t out (c.size ());
22002205 typename C::difference_type n =
22012206 static_cast <typename C::difference_type>(c.size ());
22022207
@@ -2266,7 +2271,7 @@ void bench_copy_n(const C &c, std::size_t iters, const char* cname)
22662271
22672272 double r1 = calc_ns_per_elem (t1.elapsed ().wall , iters, c.size ());
22682273 double r2 = calc_ns_per_elem (t2.elapsed ().wall , iters, c.size ());
2269- print_ratio (" copy_n " , cname, r1, r2);
2274+ print_ratio (label , cname, r1, r2);
22702275}
22712276
22722277template <class C >
@@ -3200,39 +3205,42 @@ void bench_merge(const C &c, const C &c2, std::size_t iters, const char* cname)
32003205 print_ratio (" merge" , cname, r1, r2);
32013206}
32023207
3203- template <class C >
3208+ template <bool DequeSecond, class C >
32043209void bench_mismatch (const C &c, const C &c2, std::size_t iters, const char * cname,
32053210 const char * label)
32063211{
3212+ typedef typename C::value_type VT;
3213+ typedef typename boost::move_detail::if_c<DequeSecond, bc::deque<VT>, boost::container::vector<VT> >::type range2_t ;
3214+ range2_t range2 (c2.begin (), c2.end ());
32073215 int result = 0 ;
32083216
32093217 cpu_timer t1;
32103218 { std::size_t n_ = (iters + 7 ) / 8 ;
32113219 t1.resume ();
32123220 switch (iters % 8 ) {
32133221 case 0 : do {
3214- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3222+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32153223 BOOST_FALLTHROUGH;
32163224 case 7 :
3217- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3225+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32183226 BOOST_FALLTHROUGH;
32193227 case 6 :
3220- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3228+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32213229 BOOST_FALLTHROUGH;
32223230 case 5 :
3223- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3231+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32243232 BOOST_FALLTHROUGH;
32253233 case 4 :
3226- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3234+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32273235 BOOST_FALLTHROUGH;
32283236 case 3 :
3229- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3237+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32303238 BOOST_FALLTHROUGH;
32313239 case 2 :
3232- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3240+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32333241 BOOST_FALLTHROUGH;
32343242 case 1 :
3235- { clobber (); result = (std::mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3243+ { clobber (); result = (std::mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32363244 if (BOOST_UNLIKELY (--n_ == 0 )) { t1.stop (); break ; }
32373245 } while (true );
32383246 }
@@ -3243,28 +3251,28 @@ void bench_mismatch(const C &c, const C &c2, std::size_t iters, const char* cnam
32433251 t2.resume ();
32443252 switch (iters % 8 ) {
32453253 case 0 : do {
3246- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3254+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32473255 BOOST_FALLTHROUGH;
32483256 case 7 :
3249- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3257+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32503258 BOOST_FALLTHROUGH;
32513259 case 6 :
3252- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3260+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32533261 BOOST_FALLTHROUGH;
32543262 case 5 :
3255- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3263+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32563264 BOOST_FALLTHROUGH;
32573265 case 4 :
3258- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3266+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32593267 BOOST_FALLTHROUGH;
32603268 case 3 :
3261- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3269+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32623270 BOOST_FALLTHROUGH;
32633271 case 2 :
3264- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3272+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32653273 BOOST_FALLTHROUGH;
32663274 case 1 :
3267- { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), c2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
3275+ { clobber (); result = (bc::segmented_mismatch (c.begin (), c.end (), range2 .begin ()).first == c.end ()) ? 1 : 0 ; escape (&result); }
32683276 if (BOOST_UNLIKELY (--n_ == 0 )) { t2.stop (); break ; }
32693277 } while (true );
32703278 }
@@ -4164,11 +4172,14 @@ void run_all(const C& c, std::size_t iters, const char* cname)
41644172 bench_copy<true >(c, iters, cname, " copy(2xS)" );
41654173
41664174 // copy_if
4167- bench_copy_if (c, iters, cname, is_odd<VT>(), " copy_if(hit)" );
4168- bench_copy_if (c, iters, cname, is_negative<VT>(), " copy_if(miss)" );
4175+ bench_copy_if<false >(c, iters, cname, is_odd<VT>(), " copy_if(hit)" );
4176+ bench_copy_if<true >(c, iters, cname, is_odd<VT>(), " copy_if(2xS hit)" );
4177+ bench_copy_if<false >(c, iters, cname, is_negative<VT>(), " copy_if(miss)" );
4178+ bench_copy_if<true >(c, iters, cname, is_negative<VT>(), " copy_if(2xS miss)" );
41694179
41704180 // copy_n
4171- bench_copy_n (c, iters, cname);
4181+ bench_copy_n<false >(c, iters, cname, " copy_n" );
4182+ bench_copy_n<true >(c, iters, cname, " copy_n(2xS)" );
41724183
41734184 // count
41744185 bench_count (c, iters, cname, zero, " count(hit)" );
@@ -4181,9 +4192,11 @@ void run_all(const C& c, std::size_t iters, const char* cname)
41814192 // equal
41824193 {
41834194 C c2 (c);
4184- bench_equal (c, c2, iters, cname, " equal(hit)" );
4195+ bench_equal<false >(c, c2, iters, cname, " equal(hit)" );
4196+ bench_equal<true >(c, c2, iters, cname, " equal(2xS hit)" );
41854197 *boost::container::make_iterator_uadvance (c2.begin (), c2.size ()/2 ) = min1;
4186- bench_equal (c, c2, iters, cname, " equal(miss)" );
4198+ bench_equal<false >(c, c2, iters, cname, " equal(miss)" );
4199+ bench_equal<true >(c, c2, iters, cname, " equal(2xS miss)" );
41874200 }
41884201
41894202 // fill
@@ -4261,10 +4274,12 @@ void run_all(const C& c, std::size_t iters, const char* cname)
42614274 {
42624275 C c2 (c);
42634276 *boost::container::make_iterator_uadvance (c2.begin (), c2.size ()/2 ) = min1;
4264- bench_mismatch (c, c2, iters, cname, " mismatch(hit)" );
4277+ bench_mismatch<false >(c, c2, iters, cname, " mismatch(hit)" );
4278+ bench_mismatch<true >(c, c2, iters, cname, " mismatch(2xS hit)" );
42654279 *boost::container::make_iterator_uadvance (c2.begin (), c2.size ()/2 ) =
42664280 *boost::container::make_iterator_uadvance (c.begin (), c.size ()/2 );
4267- bench_mismatch (c, c2, iters, cname, " mismatch(miss)" );
4281+ bench_mismatch<false >(c, c2, iters, cname, " mismatch(miss)" );
4282+ bench_mismatch<true >(c, c2, iters, cname, " mismatch(2xS miss)" );
42684283 }
42694284
42704285 // none_of
0 commit comments