// 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 // std::ptrdiff_t #include #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; }; template struct proxy_iterator { typedef T value_type; typedef std::output_iterator_tag iterator_category; typedef std::ptrdiff_t difference_type; typedef T* pointer; typedef T& reference; struct proxy { operator value_type&() const; proxy& operator=(value_type) const; }; proxy operator*() const; }; template struct lvalue_iterator { typedef T value_type; typedef T& reference; typedef T difference_type; typedef std::input_iterator_tag iterator_category; typedef T* pointer; T& operator*() const; lvalue_iterator& operator++(); lvalue_iterator operator++(int); }; template struct constant_lvalue_iterator { typedef T value_type; typedef T const& reference; typedef T difference_type; typedef std::input_iterator_tag iterator_category; typedef T const* pointer; T const& operator*() const; constant_lvalue_iterator& operator++(); constant_lvalue_iterator operator++(int); }; int main() { static_assert(boost::is_lvalue_iterator::value, "boost::is_lvalue_iterator::value is expected to be true."); static_assert(boost::is_lvalue_iterator::value, "boost::is_lvalue_iterator::value is expected to be true."); static_assert(boost::is_lvalue_iterator::iterator>::value, "boost::is_lvalue_iterator::iterator>::value."); static_assert(boost::is_lvalue_iterator::const_iterator>::value, "boost::is_lvalue_iterator::const_iterator>::value is expected to be true."); static_assert(!boost::is_lvalue_iterator>>::value, "boost::is_lvalue_iterator>>::value is expected to be false."); static_assert(!boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_lvalue_iterator::value, "boost::is_lvalue_iterator::value is expected to be false."); // Make sure inaccessible copy constructor doesn't prevent // reference binding static_assert(boost::is_lvalue_iterator::value, "boost::is_lvalue_iterator::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_lvalue_iterator>::value, "boost::is_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_non_const_lvalue_iterator::value, "boost::is_non_const_lvalue_iterator::value is expected to be true."); static_assert(!boost::is_non_const_lvalue_iterator::value, "boost::is_non_const_lvalue_iterator::value is expected to be false."); static_assert(boost::is_non_const_lvalue_iterator::iterator>::value, "boost::is_non_const_lvalue_iterator::iterator>::value is expected to be true."); static_assert(!boost::is_non_const_lvalue_iterator::const_iterator>::value, "boost::is_non_const_lvalue_iterator::const_iterator>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator>>::value, "boost::is_non_const_lvalue_iterator>>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator::value, "boost::is_non_const_lvalue_iterator::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator::value, "boost::is_non_const_lvalue_iterator::value is expected to be false."); static_assert(boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be true."); static_assert(boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be true."); static_assert(!boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be false."); static_assert(!boost::is_non_const_lvalue_iterator>::value, "boost::is_non_const_lvalue_iterator>::value is expected to be false."); return 0; }