// Boost.TypeErasure library // // Copyright 2011 Steven Watanabe // // Distributed under 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) // // $Id$ #ifndef BOOST_TYPE_ERASURE_ITERATOR_HPP_INCLUDED #define BOOST_TYPE_ERASURE_ITERATOR_HPP_INCLUDED #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace type_erasure { /** INTERNAL ONLY */ template<> struct is_placeholder< ::boost::use_default> : ::boost::mpl::false_ {}; namespace detail { template struct iterator_value_type_impl { typedef typename ::std::iterator_traits::value_type type; }; } /** INTERNAL ONLY */ template struct iterator_value_type { typedef typename ::boost::mpl::eval_if< ::boost::type_erasure::is_placeholder, ::boost::mpl::identity, ::boost::type_erasure::detail::iterator_value_type_impl >::type type; }; template< class Traversal, class T = _self, class Reference = ::boost::use_default, class DifferenceType = ::std::ptrdiff_t, class ValueType = typename deduced >::type > struct iterator; #ifdef BOOST_TYPE_ERASURE_DOXYGEN /** * The @ref iterator concept can be used for any iterator category. * * \tparam Traversal must be one of @c boost::incrementable_traversal_tag, * @c boost::single_pass_traversal_tag, @c boost::forward_traversal_tag, * @c boost::bidirectional_traversal_tag, and @c boost::random_access_traversal_tag. * \tparam T The placeholder representing the iterator. * \tparam Reference The reference type. If it is boost::use_default, then * reference will be value_type&. * \tparam DifferenceType The iterator's difference type. * * The value_type of the iterator is deduced. To force it to be * a specific type, use the @ref same_type concept. * * Example: * * \code * mpl::vector< * iterator, * same_type::value_type, int> > int_it; * \endcode */ template< class Traversal, class T = _self, class Reference = boost::use_default, class DifferenceType = std::ptrdiff_t > struct iterator { typedef detail::unspecified value_type; typedef Reference reference; typedef DifferenceType difference_type; }; template< class T = _self, class Reference = boost::use_default, class DifferenceType = std::ptrdiff_t > struct forward_iterator : iterator {}; template< class T = _self, class Reference = boost::use_default, class DifferenceType = std::ptrdiff_t > struct bidirectional_iterator : iterator {}; template< class T = _self, class Reference = boost::use_default, class DifferenceType = std::ptrdiff_t > struct random_access_iterator : iterator { }; #else /** INTERNAL ONLY */ template struct iterator_reference { typedef Reference type; }; /** INTERNAL ONLY */ template struct iterator_reference< ::boost::use_default, ValueType> { typedef ValueType& type; }; template struct iterator< ::boost::no_traversal_tag, T, Reference, DifferenceType, ValueType> : boost::mpl::vector< copy_constructible, constructible, equality_comparable, dereferenceable::type, T>, assignable > { typedef ValueType value_type; typedef typename iterator_reference::type reference; typedef DifferenceType difference_type; }; template struct iterator< ::boost::incrementable_traversal_tag, T, Reference, DifferenceType, ValueType> : boost::mpl::vector< iterator< ::boost::no_traversal_tag, T, Reference, DifferenceType>, incrementable > { typedef ValueType value_type; typedef typename iterator_reference::type reference; typedef DifferenceType difference_type; }; template struct iterator< ::boost::single_pass_traversal_tag, T, Reference, DifferenceType, ValueType> : iterator< ::boost::incrementable_traversal_tag, T, Reference, DifferenceType, ValueType> {}; template struct iterator< ::boost::forward_traversal_tag, T, Reference, DifferenceType, ValueType> : iterator< ::boost::incrementable_traversal_tag, T, Reference, DifferenceType, ValueType> {}; template struct iterator< ::boost::bidirectional_traversal_tag, T, Reference, DifferenceType, ValueType> : boost::mpl::vector< iterator< ::boost::incrementable_traversal_tag, T, Reference, DifferenceType, ValueType>, decrementable > { typedef ValueType value_type; typedef typename iterator_reference::type reference; typedef DifferenceType difference_type; }; template struct iterator< ::boost::random_access_traversal_tag, T, Reference, DifferenceType, ValueType> : boost::mpl::vector< iterator< ::boost::bidirectional_traversal_tag, T, Reference, DifferenceType, ValueType>, addable, addable, subtractable, subtractable, subscriptable::type, T, DifferenceType> > { typedef ValueType value_type; typedef typename iterator_reference::type reference; typedef DifferenceType difference_type; }; template< class T = _self, class Reference = ::boost::use_default, class DifferenceType = ::std::ptrdiff_t, class ValueType = typename deduced >::type > struct forward_iterator : iterator< ::boost::forward_traversal_tag, T, Reference, DifferenceType, ValueType> {}; template< class T = _self, class Reference = ::boost::use_default, class DifferenceType = ::std::ptrdiff_t, class ValueType = typename deduced >::type > struct bidirectional_iterator : iterator< ::boost::bidirectional_traversal_tag, T, Reference, DifferenceType, ValueType> {}; template< class T = _self, class Reference = ::boost::use_default, class DifferenceType = ::std::ptrdiff_t, class ValueType = typename deduced >::type > struct random_access_iterator : iterator< ::boost::random_access_traversal_tag, T, Reference, DifferenceType, ValueType> { }; #endif /// \cond show_operators template struct concept_interface, Base, T> : Base { typedef typename rebind_any::type value_type; typedef typename rebind_any< Base, typename iterator_reference::type >::type reference; typedef DifferenceType difference_type; typedef typename ::boost::mpl::if_< ::boost::is_reference, typename ::boost::remove_reference::type*, value_type* >::type pointer; }; template struct concept_interface, Base, T> : Base { typedef std::forward_iterator_tag iterator_category; }; template struct concept_interface, Base, T> : Base { typedef std::forward_iterator_tag iterator_category; }; template struct concept_interface, Base, T> : Base { typedef std::bidirectional_iterator_tag iterator_category; }; template struct concept_interface, Base, T> : Base { typedef std::bidirectional_iterator_tag iterator_category; }; template struct concept_interface, Base, T> : Base { typedef std::random_access_iterator_tag iterator_category; }; template struct concept_interface, Base, T> : Base { typedef std::random_access_iterator_tag iterator_category; }; /// \endcond } } #endif