From 78831a2f67e03cc4bfe59010d286b45aaaa18395 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sat, 24 Jan 2004 18:41:14 +0000 Subject: [PATCH] merged from trunk [SVN r21898] --- test/filter_iterator_test.cpp | 129 +++++++++++++++++++++++++++++++-- test/reverse_iterator_test.cpp | 2 + 2 files changed, 125 insertions(+), 6 deletions(-) diff --git a/test/filter_iterator_test.cpp b/test/filter_iterator_test.cpp index edf3ccf..8b4d190 100644 --- a/test/filter_iterator_test.cpp +++ b/test/filter_iterator_test.cpp @@ -1,13 +1,20 @@ -// Copyright David Abrahams 2003. Permission to copy, use, -// modify, sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. +// Copyright David Abrahams 2003, Jeremy Siek 2004. + +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all +// copies. This software is provided "as is" without express or +// implied warranty, and with no claim as to its suitability for any +// purpose. #include #include #include #include +#include +#include +#include +#include +#include #include #include @@ -24,9 +31,118 @@ struct one_or_four 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 >(); + } + // 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::ReadableLvalueIteratorConcept >(); + 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::WritableLvalueIteratorConcept >(); + boost::function_requires< boost_concepts::ForwardTraversalConcept >(); + } +#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); @@ -75,6 +191,7 @@ int main() filter_iter(one_or_four(), array, array + N), dummyT(1), dummyT(4)); + std::cout << "test successful " << std::endl; - return 0; + return boost::exit_success; } diff --git a/test/reverse_iterator_test.cpp b/test/reverse_iterator_test.cpp index 4f9d13d..dd9b88a 100644 --- a/test/reverse_iterator_test.cpp +++ b/test/reverse_iterator_test.cpp @@ -66,6 +66,7 @@ int main() boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } #endif +#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. { typedef boost::iterator_archetype< dummyT @@ -100,6 +101,7 @@ int main() boost::function_requires< boost_concepts::WritableLvalueIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); } +#endif // Test reverse_iterator {