Chris@16: // Boost.Range library Chris@16: // Chris@16: // Copyright Neil Groves 2010. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/range/ Chris@16: // Chris@16: #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED Chris@16: #define BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace range_detail Chris@16: { Chris@16: template Chris@16: struct const_reference_type_generator Chris@16: { Chris@16: typedef typename mpl::if_< Chris@16: typename is_reference::type, Chris@101: typename add_const< Chris@101: typename remove_reference::type Chris@101: >::type&, Chris@101: T Chris@101: >::type type; Chris@101: }; Chris@101: Chris@101: template Chris@101: struct mutable_reference_type_generator Chris@101: { Chris@101: typedef typename mpl::if_< Chris@101: typename mpl::and_< Chris@101: typename is_const::type, Chris@101: typename mpl::not_::type>::type Chris@16: >::type, Chris@101: T, Chris@101: typename add_reference::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_incrementable_iterator_interface Chris@16: { Chris@101: typedef typename mutable_reference_type_generator< Chris@101: Reference Chris@101: >::type reference; Chris@101: Chris@16: typedef typename const_reference_type_generator< Chris@16: Reference Chris@16: >::type const_reference; Chris@101: Chris@16: typedef typename remove_const< Chris@16: typename remove_reference::type Chris@16: >::type reference_as_value_type; Chris@16: Chris@16: typedef Buffer buffer_type; Chris@16: Chris@16: virtual ~any_incrementable_iterator_interface() {} Chris@16: Chris@16: virtual any_incrementable_iterator_interface* Chris@16: clone(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_incrementable_iterator_interface* Chris@16: clone_const_ref(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_incrementable_iterator_interface* Chris@16: clone_reference_as_value(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual void increment() = 0; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_single_pass_iterator_interface Chris@16: : any_incrementable_iterator_interface Chris@16: { Chris@16: typedef typename any_incrementable_iterator_interface::reference reference; Chris@16: typedef typename any_incrementable_iterator_interface::const_reference const_reference; Chris@16: typedef typename any_incrementable_iterator_interface::buffer_type buffer_type; Chris@16: typedef typename any_incrementable_iterator_interface::reference_as_value_type reference_as_value_type; Chris@16: Chris@16: virtual any_single_pass_iterator_interface* Chris@16: clone(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_single_pass_iterator_interface* Chris@16: clone_const_ref(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_single_pass_iterator_interface* Chris@16: clone_reference_as_value(buffer_type& buffer) const = 0; Chris@16: Chris@101: virtual reference dereference() const = 0; Chris@16: Chris@16: virtual bool equal(const any_single_pass_iterator_interface& other) const = 0; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_forward_iterator_interface Chris@16: : any_single_pass_iterator_interface Chris@16: { Chris@16: typedef typename any_single_pass_iterator_interface::reference reference; Chris@16: typedef typename any_single_pass_iterator_interface::const_reference const_reference; Chris@16: typedef typename any_single_pass_iterator_interface::buffer_type buffer_type; Chris@16: typedef typename any_single_pass_iterator_interface::reference_as_value_type reference_as_value_type; Chris@16: Chris@16: virtual any_forward_iterator_interface* Chris@16: clone(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_forward_iterator_interface* Chris@16: clone_const_ref(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_forward_iterator_interface* Chris@16: clone_reference_as_value(buffer_type& buffer) const = 0; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_bidirectional_iterator_interface Chris@16: : any_forward_iterator_interface Chris@16: { Chris@16: typedef typename any_forward_iterator_interface::reference reference; Chris@16: typedef typename any_forward_iterator_interface::const_reference const_reference; Chris@16: typedef typename any_forward_iterator_interface::buffer_type buffer_type; Chris@16: typedef typename any_forward_iterator_interface::reference_as_value_type reference_as_value_type; Chris@16: Chris@16: virtual any_bidirectional_iterator_interface* Chris@16: clone(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_bidirectional_iterator_interface* Chris@16: clone_const_ref(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_bidirectional_iterator_interface* Chris@16: clone_reference_as_value(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual void decrement() = 0; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_random_access_iterator_interface Chris@16: : any_bidirectional_iterator_interface< Chris@16: Reference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef typename any_bidirectional_iterator_interface::reference reference; Chris@16: typedef typename any_bidirectional_iterator_interface::const_reference const_reference; Chris@16: typedef typename any_bidirectional_iterator_interface::buffer_type buffer_type; Chris@16: typedef typename any_bidirectional_iterator_interface::reference_as_value_type reference_as_value_type; Chris@16: typedef Difference difference_type; Chris@16: Chris@16: virtual any_random_access_iterator_interface* Chris@16: clone(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_random_access_iterator_interface* Chris@16: clone_const_ref(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual any_random_access_iterator_interface* Chris@16: clone_reference_as_value(buffer_type& buffer) const = 0; Chris@16: Chris@16: virtual void advance(Difference offset) = 0; Chris@16: Chris@16: virtual Difference distance_to(const any_random_access_iterator_interface& other) const = 0; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Traversal Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_interface_type_generator; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_interface_type_generator< Chris@16: incrementable_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_incrementable_iterator_interface type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_interface_type_generator< Chris@16: single_pass_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_single_pass_iterator_interface type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_interface_type_generator< Chris@16: forward_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_forward_iterator_interface type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_interface_type_generator< Chris@16: bidirectional_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_bidirectional_iterator_interface type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_interface_type_generator< Chris@16: random_access_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_random_access_iterator_interface< Chris@16: Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > type; Chris@16: }; Chris@16: Chris@16: } // namespace range_detail Chris@16: } // namespace boost Chris@16: Chris@16: #endif // include guard