diff --git a/iterator_traits_test.cpp b/iterator_traits_test.cpp new file mode 100644 index 0000000..6eb9e65 --- /dev/null +++ b/iterator_traits_test.cpp @@ -0,0 +1,133 @@ +// (C) Copyright David Abrahams 2001. 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. + +// See http://www.boost.org for most recent version including documentation. + +// Revision History +// 19 Jan 2001 Initial version with iterator operators (David Abrahams) + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct my_iterator + : public boost::forward_iterator_helper +{ + my_iterator(const char* p) : m_p(p) {} + + bool operator==(const my_iterator& rhs) const + { return this->m_p == rhs.m_p; } + + my_iterator& operator++() { ++this->m_p; return *this; } + const char operator*() { return *m_p; } + private: + 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)); + +BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits >::difference_type, + std::ptrdiff_t + >::value)); + +// ostream_iterator (output_iterator_tag, void) +BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits >::iterator_category, + std::output_iterator_tag + >::value)); + +BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits >::difference_type, + void + >::value)); + +// 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)); + +BOOST_STATIC_ASSERT(( + boost::is_same< + boost::detail::iterator_traits::iterator>::difference_type, + std::ptrdiff_t + >::value)); + +// 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)); + +int main() +{ + char chars[100]; + int ints[100]; + + for (std::ptrdiff_t length = 3; length < 100; length += length / 3) + { + std::list l(length); + assert(boost::detail::distance(l.begin(), l.end()) == length); + + std::vector v(length); + assert(boost::detail::distance(v.begin(), v.end()) == length); + + assert(boost::detail::distance(&ints[0], ints + length) == length); + assert(boost::detail::distance(my_iterator(chars), my_iterator(chars + length)) == length); + } + return 0; +}