// Copyright David Abrahams 2003. Use, modification and distribution is // subject to 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 // std::ptrdiff_t #include #include #include // Last, for BOOST_NO_LVALUE_RETURN_DETECTION #include struct v { v(); ~v(); }; struct value_iterator { typedef std::input_iterator_tag iterator_category; typedef v value_type; typedef std::ptrdiff_t difference_type; typedef v* pointer; typedef v& reference; v operator*() const; }; struct noncopyable_iterator { typedef std::forward_iterator_tag iterator_category; typedef boost::noncopyable value_type; typedef std::ptrdiff_t difference_type; typedef boost::noncopyable* pointer; typedef boost::noncopyable& reference; boost::noncopyable const& operator*() const; }; struct proxy_iterator { typedef std::output_iterator_tag iterator_category; typedef v value_type; typedef std::ptrdiff_t difference_type; typedef v* pointer; typedef v& reference; struct proxy { operator v&(); proxy& operator=(v) const; }; proxy operator*() const; }; struct proxy_iterator2 { typedef std::output_iterator_tag iterator_category; typedef v value_type; typedef std::ptrdiff_t difference_type; typedef v* pointer; typedef v& reference; struct proxy { proxy& operator=(v) const; }; proxy operator*() const; }; int main() { BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); BOOST_STATIC_ASSERT(boost::is_readable_iterator::iterator>::value); BOOST_STATIC_ASSERT(boost::is_readable_iterator::const_iterator>::value); BOOST_STATIC_ASSERT(!boost::is_readable_iterator > >::value); BOOST_STATIC_ASSERT(!boost::is_readable_iterator >::value); BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); BOOST_STATIC_ASSERT(!boost::is_readable_iterator::value); BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); // Make sure inaccessible copy constructor doesn't prevent // readability BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); return 0; }