diff --git a/iterator_traits_test.cpp b/iterator_traits_test.cpp index e5631a8..d250a29 100644 --- a/iterator_traits_test.cpp +++ b/iterator_traits_test.cpp @@ -7,6 +7,8 @@ // See http://www.boost.org for most recent version including documentation. // Revision History +// 07 Feb 2001 More comprehensive testing; factored out static tests for +// better reuse (David Abrahams) // 21 Jan 2001 Quick fix to my_iterator, which wasn't returning a // reference type from operator* (David Abrahams) // 19 Jan 2001 Initial version with iterator operators (David Abrahams) @@ -35,91 +37,103 @@ struct my_iterator const char* m_p; }; -// Test difference_type and iterator_category -// istream_iterator (forward_iterator_tag, ptrdiff_t) -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits >::iterator_category, - std::input_iterator_tag - >::value)); +template +struct non_portable_tests +{ + // Unfortunately, the VC6 standard library doesn't supply these :( + BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits::pointer, + pointer + >::value)); + + BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits::reference, + reference + >::value)); +}; -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits >::difference_type, - std::ptrdiff_t - >::value)); +template +struct portable_tests +{ + BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits::difference_type, + difference_type + >::value)); + + BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits::iterator_category, + category + >::value)); +}; -// ostream_iterator (output_iterator_tag, void) -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits >::iterator_category, - std::output_iterator_tag - >::value)); +// Test iterator_traits +template +struct input_iterator_test + : portable_tests +{ + BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits::value_type, + value_type + >::value)); +}; -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits >::difference_type, - void - >::value)); +template +struct non_pointer_test + : input_iterator_test +#if !defined(BOOST_MSVC) || defined(__SGI_STL_PORT) + , non_portable_tests +#endif +{ +}; -// list::iterator (bidirectional_iterator_tag, ptrdiff_t) -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::iterator>::iterator_category, - std::bidirectional_iterator_tag - >::value)); +template +struct maybe_pointer_test + : portable_tests +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + , non_portable_tests +#endif +{ +}; + +input_iterator_test, int, std::ptrdiff_t, int*, int&, std::input_iterator_tag> + istream_iterator_test; + +non_pointer_test, +#if !defined(BOOST_MSVC) || defined(__SGI_STL_PORT) + void, +#else // the VC6 standard lib gives ostream_iterator an incorrect value_type + int, +#endif + void, void, void, std::output_iterator_tag> + ostream_iterator_test; #ifdef __KCC typedef long std_list_diff_type; #else typedef std::ptrdiff_t std_list_diff_type; #endif +non_pointer_test::iterator, int, std_list_diff_type, int*, int&, std::bidirectional_iterator_tag> + list_iterator_test; -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::iterator>::difference_type, - std_list_diff_type - >::value)); +maybe_pointer_test::iterator, int, std::ptrdiff_t, int*, int&, std::random_access_iterator_tag> + vector_iterator_test; -// vector::iterator (random_access_iterator_tag, ptrdiff_t) -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::iterator>::iterator_category, - std::random_access_iterator_tag - >::value)); - -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::iterator>::difference_type, - std::ptrdiff_t - >::value)); - -// int* (random_access_iterator_tag, ptrdiff_t) -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::iterator_category, - std::random_access_iterator_tag - >::value)); - -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::difference_type, - std::ptrdiff_t - >::value)); - -// my_iterator (forward_iterator_tag, long) -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::iterator_category, - std::forward_iterator_tag - >::value)); - -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::detail::iterator_traits::difference_type, - long - >::value)); +maybe_pointer_test + int_pointer_test; + +non_pointer_test + my_iterator_test; int main() {