// Copyright David Abrahams 2003, Jeremy Siek 2004. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include #include #include #include using boost::dummyT; struct one_or_four { bool operator()(dummyT x) const { return x.foo() == 1 || x.foo() == 4; } }; template struct undefined; template struct see_type; // Test filter iterator int main() { // Concept checks // Adapting old-style iterators { typedef boost::filter_iterator > Iter; boost::function_requires< boost::InputIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); } { typedef boost::filter_iterator > Iter; boost::function_requires< boost::InputIteratorConcept >(); boost::function_requires< boost::OutputIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); } { typedef boost::filter_iterator > Iter; boost::function_requires< boost::ForwardIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::ForwardTraversalConcept >(); } { typedef boost::filter_iterator > Iter; boost::function_requires< boost::Mutable_ForwardIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::ForwardTraversalConcept >(); } { typedef boost::filter_iterator > Iter; boost::function_requires< boost::BidirectionalIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } { typedef boost::filter_iterator > Iter; boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } { typedef boost::filter_iterator > Iter; boost::function_requires< boost::BidirectionalIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } { typedef boost::filter_iterator > Iter; boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } // Adapting new-style iterators { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_iterator_t , boost::single_pass_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::InputIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); } #if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. { typedef boost::iterator_archetype< dummyT , boost::iterator_archetypes::readable_writable_iterator_t , boost::single_pass_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::InputIteratorConcept >(); boost::function_requires< boost::OutputIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); } #endif { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_iterator_t , boost::forward_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::InputIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::ForwardTraversalConcept >(); } #if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. { typedef boost::iterator_archetype< dummyT , boost::iterator_archetypes::readable_writable_iterator_t , boost::forward_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::ForwardTraversalConcept >(); } { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_lvalue_iterator_t , boost::forward_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::ForwardIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::LvalueIteratorConcept >(); boost::function_requires< boost_concepts::ForwardTraversalConcept >(); } { typedef boost::iterator_archetype< dummyT , boost::iterator_archetypes::writable_lvalue_iterator_t , boost::forward_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::Mutable_ForwardIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::LvalueIteratorConcept >(); boost::function_requires< boost_concepts::ForwardTraversalConcept >(); } #endif { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_iterator_t , boost::random_access_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::InputIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } #if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. { typedef boost::iterator_archetype< dummyT , boost::iterator_archetypes::readable_writable_iterator_t , boost::random_access_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_lvalue_iterator_t , boost::random_access_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::BidirectionalIteratorConcept >(); boost::function_requires< boost_concepts::ReadableIteratorConcept >(); boost::function_requires< boost_concepts::LvalueIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } { typedef boost::iterator_archetype< dummyT , boost::iterator_archetypes::writable_lvalue_iterator_t , boost::random_access_traversal_tag > BaseIter; typedef boost::filter_iterator Iter; boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); boost::function_requires< boost_concepts::WritableIteratorConcept >(); boost::function_requires< boost_concepts::LvalueIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } #endif // Run-time tests dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), dummyT(3), dummyT(4), dummyT(5) }; const int N = sizeof(array)/sizeof(dummyT); typedef boost::filter_iterator filter_iter; boost::bidirectional_readable_iterator_test( filter_iter(one_or_four(), array, array+N) , dummyT(1), dummyT(4)); BOOST_STATIC_ASSERT( (!boost::is_convertible< boost::iterator_traversal::type , boost::random_access_traversal_tag >::value )); //# endif // On compilers not supporting partial specialization, we can do more type // deduction with deque iterators than with pointers... unless the library // is broken ;-( std::deque array2; std::copy(array+0, array+N, std::back_inserter(array2)); boost::bidirectional_readable_iterator_test( boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), dummyT(1), dummyT(4)); boost::bidirectional_readable_iterator_test( boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), dummyT(1), dummyT(4)); boost::bidirectional_readable_iterator_test( boost::make_filter_iterator( one_or_four() , boost::make_reverse_iterator(array2.end()) , boost::make_reverse_iterator(array2.begin()) ), dummyT(4), dummyT(1)); boost::bidirectional_readable_iterator_test( filter_iter(array+0, array+N), dummyT(1), dummyT(4)); boost::bidirectional_readable_iterator_test( filter_iter(one_or_four(), array, array + N), dummyT(1), dummyT(4)); return boost::report_errors(); }