diff --git a/test/transform_iterator_test.cpp b/test/transform_iterator_test.cpp index de3f496..57fd75a 100644 --- a/test/transform_iterator_test.cpp +++ b/test/transform_iterator_test.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION @@ -46,6 +47,48 @@ struct mult_functor { int a; }; + +struct select_first +{ + typedef int& result_type; + + int& operator()(std::pair& p) const + { + return p.first; + } +}; + +struct select_second +{ + typedef int& result_type; + + int& operator()(std::pair& p) const + { + return p.second; + } +}; + +struct const_select_first +{ + typedef int const& result_type; + + int const& operator()(std::pairconst& p) const + { + return p.first; + } +}; + +struct value_select_first +{ + typedef int result_type; + + int operator()(std::pairconst& p) const + { + return p.first; + } +}; + + int main() { @@ -76,6 +119,44 @@ main() boost::random_access_readable_iterator_test(i, N, x); } + + // Test transform_iterator as projection iterator + { + typedef std::pair pair_t; + + int x[N]; + int y[N]; + pair_t values[N]; + + for(int i = 0; i < N; ++i) { + + x[i] = i; + y[i] = N - (i + 1); + + } + + std::copy(x, + x + N, + boost::make_transform_iterator((pair_t*)values, select_first())); + + std::copy(y, + y + N, + boost::make_transform_iterator((pair_t*)values, select_second())); + + boost::random_access_readable_iterator_test(boost::make_transform_iterator((pair_t*)values, value_select_first()), + N, + x); + + boost::random_access_readable_iterator_test(boost::make_transform_iterator((pair_t*)values, const_select_first()), + N, + x); + + boost::constant_lvalue_iterator_test(boost::make_transform_iterator((pair_t*)values, const_select_first()), x[0]); + + boost::mutable_lvalue_iterator_test(boost::make_transform_iterator((pair_t*)values, select_first()), x[0], 17); + + } + std::cout << "test successful " << std::endl; return 0; }