#include #include #include #include #include #include #include // Iterator-based versions template std::pair Foo ( ForwardIterator first, ForwardIterator last, Compare comp ) { return std::make_pair (first, last); } template std::pair Foo ( ForwardIterator first, ForwardIterator last ) { return Foo ( first, last, std::less::value_type> ()); } // Range-based versions namespace detail { template struct range_pair { typedef std::pair::type, typename boost::range_iterator::type> type; }; } template typename detail::range_pair::type Foo ( const Range &r ) { return Foo (boost::begin (r), boost::end (r)); } template typename boost::lazy_disable_if_c< boost::is_same::value, typename detail::range_pair > ::type Foo ( const Range &r, Compare comp ) { return Foo (boost::begin (r), boost::end (r), comp ); } bool comp ( int x ) { return x > 10; } /* template void test_sequence_no_comparison ( Container &v ) { typedef std::pair Pair; Pair res = Foo ( v.begin (), v.end ()); std::reverse ( v.begin (), v.end ()); res = Foo ( v.begin (), v.end ()); std::random_shuffle ( v.begin (), v.end ()); res = Foo ( v.begin (), v.end ()); // One element int v0 = v[0]; res = Foo ( v.begin (), v.begin () + 1 ); // Two elements int v1 = v[1]; res = Foo ( v.begin (), v.begin () + 2 ); // With comparator res = Foo ( v, comp ); } */ void test_sequence_no_comparison ( std::vector &v ) { typedef std::pair ::iterator, std::vector::iterator> Pair; Pair res = Foo ( v.begin (), v.end ()); std::reverse ( v.begin (), v.end ()); res = Foo ( v.begin (), v.end ()); std::random_shuffle ( v.begin (), v.end ()); res = Foo ( v.begin (), v.end ()); // One element int v0 = v[0]; res = Foo ( v.begin (), v.begin () + 1 ); // Two elements int v1 = v[1]; res = Foo ( v.begin (), v.begin () + 2 ); // With comparator res = Foo ( v, comp ); } int main ( int argc, char *argv [] ) { std::vector v; v.clear (); for ( int i = 5; i < 15; ++i ) v.push_back ( i ); test_sequence_no_comparison ( v ); // even # of elements return 0; }