filter_iterator_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 273 行
CPP
273 行
// 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 <boost/iterator/filter_iterator.hpp>#include <boost/iterator/reverse_iterator.hpp>#include <boost/iterator/new_iterator_tests.hpp>#include <boost/type_traits/is_convertible.hpp>#include <boost/concept_check.hpp>#include <boost/concept_archetype.hpp>#include <boost/iterator/iterator_concepts.hpp>#include <boost/iterator/iterator_archetypes.hpp>#include <boost/cstdlib.hpp>#include <deque>#include <iostream>using boost::dummyT; struct one_or_four{ bool operator()(dummyT x) const { return x.foo() == 1 || x.foo() == 4; }};template <class T> struct undefined;template <class T> struct see_type;// Test filter iteratorint main(){ // Concept checks // Adapting old-style iterators { typedef boost::filter_iterator<one_or_four, boost::input_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::InputIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept<Iter> >(); } { typedef boost::filter_iterator<one_or_four, boost::input_output_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::InputIteratorConcept<Iter> >(); boost::function_requires< boost::OutputIteratorConcept<Iter, dummyT> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept<Iter> >(); } { typedef boost::filter_iterator<one_or_four, boost::forward_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::ForwardIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >(); } { typedef boost::filter_iterator<one_or_four, boost::mutable_forward_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::Mutable_ForwardIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >(); } { typedef boost::filter_iterator<one_or_four, boost::bidirectional_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); } { typedef boost::filter_iterator<one_or_four, boost::mutable_bidirectional_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::Mutable_BidirectionalIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); } { typedef boost::filter_iterator<one_or_four, boost::random_access_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); } { typedef boost::filter_iterator<one_or_four, boost::mutable_random_access_iterator_archetype<dummyT> > Iter; boost::function_requires< boost::Mutable_BidirectionalIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); } // 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<one_or_four, BaseIter> Iter; boost::function_requires< boost::InputIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept<Iter> >(); }#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<one_or_four, BaseIter> Iter; boost::function_requires< boost::InputIteratorConcept<Iter> >(); boost::function_requires< boost::OutputIteratorConcept<Iter, dummyT> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::SinglePassIteratorConcept<Iter> >(); }#endif { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_iterator_t , boost::forward_traversal_tag > BaseIter; typedef boost::filter_iterator<one_or_four, BaseIter> Iter; boost::function_requires< boost::InputIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >(); } #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<one_or_four, BaseIter> Iter; boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >(); } { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_lvalue_iterator_t , boost::forward_traversal_tag > BaseIter; typedef boost::filter_iterator<one_or_four, BaseIter> Iter; boost::function_requires< boost::ForwardIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >(); } { typedef boost::iterator_archetype< dummyT , boost::iterator_archetypes::writable_lvalue_iterator_t , boost::forward_traversal_tag > BaseIter; typedef boost::filter_iterator<one_or_four, BaseIter> Iter; boost::function_requires< boost::Mutable_ForwardIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >(); }#endif { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_iterator_t , boost::random_access_traversal_tag > BaseIter; typedef boost::filter_iterator<one_or_four, BaseIter> Iter; boost::function_requires< boost::InputIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); } #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<one_or_four, BaseIter> Iter; boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); } { typedef boost::iterator_archetype< const dummyT , boost::iterator_archetypes::readable_lvalue_iterator_t , boost::random_access_traversal_tag > BaseIter; typedef boost::filter_iterator<one_or_four, BaseIter> Iter; boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); } { typedef boost::iterator_archetype< dummyT , boost::iterator_archetypes::writable_lvalue_iterator_t , boost::random_access_traversal_tag > BaseIter; typedef boost::filter_iterator<one_or_four, BaseIter> Iter; boost::function_requires< boost::Mutable_BidirectionalIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >(); }#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<one_or_four, dummyT*> 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<filter_iter>::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<dummyT> 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();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?