| // Boost.Range library |
| // |
| // Copyright Neil Groves 2010. 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) |
| // |
| // For more information, see http://www.boost.org/libs/range/ |
| // |
| #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_WRAPPER_HPP_INCLUDED |
| #define BOOST_RANGE_DETAIL_ANY_ITERATOR_WRAPPER_HPP_INCLUDED |
| |
| #include <boost/range/config.hpp> |
| #include <boost/range/detail/any_iterator_interface.hpp> |
| |
| namespace boost |
| { |
| namespace range_detail |
| { |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Buffer |
| > |
| class any_incrementable_iterator_wrapper |
| : public any_incrementable_iterator_interface< |
| Reference |
| , Buffer |
| > |
| { |
| BOOST_RANGE_CONCEPT_ASSERT(( IncrementableIteratorConcept<WrappedIterator> )); |
| public: |
| typedef WrappedIterator wrapped_type; |
| |
| BOOST_STATIC_ASSERT(( is_convertible< |
| typename iterator_reference<WrappedIterator>::type |
| , Reference |
| >::value )); |
| |
| any_incrementable_iterator_wrapper() |
| : m_it() |
| {} |
| |
| explicit any_incrementable_iterator_wrapper(wrapped_type it) |
| : m_it(it) |
| {} |
| |
| // any_incrementable_iterator implementation |
| virtual any_incrementable_iterator_wrapper* clone( |
| typename any_incrementable_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| return new (buffer.allocate(sizeof(*this))) |
| any_incrementable_iterator_wrapper(m_it); |
| } |
| |
| virtual any_incrementable_iterator_wrapper< |
| WrappedIterator |
| , typename any_incrementable_iterator_wrapper::const_reference |
| , Buffer |
| >* clone_const_ref( |
| typename any_incrementable_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_incrementable_iterator_wrapper< |
| WrappedIterator |
| , typename any_incrementable_iterator_wrapper::const_reference |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual any_incrementable_iterator_wrapper< |
| WrappedIterator |
| , typename any_incrementable_iterator_wrapper::reference_as_value_type |
| , Buffer |
| >* clone_reference_as_value( |
| typename any_incrementable_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_incrementable_iterator_wrapper< |
| WrappedIterator |
| , typename any_incrementable_iterator_wrapper::reference_as_value_type |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual void increment() |
| { |
| ++m_it; |
| } |
| |
| private: |
| wrapped_type m_it; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Buffer |
| > |
| class any_single_pass_iterator_wrapper |
| : public any_single_pass_iterator_interface< |
| Reference |
| , Buffer |
| > |
| { |
| struct disabler {}; |
| BOOST_RANGE_CONCEPT_ASSERT(( SinglePassIteratorConcept<WrappedIterator> )); |
| public: |
| |
| any_single_pass_iterator_wrapper() |
| : m_it() |
| {} |
| |
| explicit any_single_pass_iterator_wrapper(const WrappedIterator& it) |
| : m_it(it) |
| {} |
| // any_single_pass_iterator_interface<Reference> implementation |
| virtual any_single_pass_iterator_wrapper* clone( |
| typename any_single_pass_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| return new (buffer.allocate(sizeof(*this))) |
| any_single_pass_iterator_wrapper(m_it); |
| } |
| |
| virtual any_single_pass_iterator_wrapper< |
| WrappedIterator |
| , typename any_single_pass_iterator_wrapper::const_reference |
| , Buffer |
| >* clone_const_ref( |
| typename any_single_pass_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_single_pass_iterator_wrapper< |
| WrappedIterator |
| , typename any_single_pass_iterator_wrapper::const_reference |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual any_single_pass_iterator_wrapper< |
| WrappedIterator |
| , typename any_single_pass_iterator_wrapper::reference_as_value_type |
| , Buffer |
| >* clone_reference_as_value( |
| typename any_single_pass_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_single_pass_iterator_wrapper< |
| WrappedIterator |
| , typename any_single_pass_iterator_wrapper::reference_as_value_type |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual void increment() |
| { |
| ++m_it; |
| } |
| |
| virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const |
| { |
| return m_it == boost::polymorphic_downcast<const any_single_pass_iterator_wrapper*>(&other)->m_it; |
| } |
| |
| virtual Reference dereference() const |
| { |
| return *m_it; |
| } |
| |
| private: |
| WrappedIterator m_it; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Buffer |
| > |
| class any_forward_iterator_wrapper |
| : public any_forward_iterator_interface< |
| Reference |
| , Buffer |
| > |
| { |
| BOOST_RANGE_CONCEPT_ASSERT(( ForwardIteratorConcept<WrappedIterator> )); |
| public: |
| any_forward_iterator_wrapper() |
| : m_it() |
| {} |
| |
| explicit any_forward_iterator_wrapper(const WrappedIterator& it) |
| : m_it(it) |
| {} |
| |
| // any_forward_iterator_interface<Reference> implementation |
| virtual any_forward_iterator_wrapper* clone( |
| typename any_forward_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| return new (buffer.allocate(sizeof(*this))) |
| any_forward_iterator_wrapper(m_it); |
| } |
| |
| virtual any_forward_iterator_wrapper< |
| WrappedIterator |
| , typename any_forward_iterator_wrapper::const_reference |
| , Buffer |
| >* clone_const_ref( |
| typename any_forward_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_forward_iterator_wrapper< |
| WrappedIterator |
| , typename any_forward_iterator_wrapper::const_reference |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual any_forward_iterator_wrapper< |
| WrappedIterator |
| , typename any_forward_iterator_wrapper::reference_as_value_type |
| , Buffer |
| >* clone_reference_as_value( |
| typename any_forward_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_forward_iterator_wrapper< |
| WrappedIterator |
| , typename any_forward_iterator_wrapper::reference_as_value_type |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual void increment() |
| { |
| ++m_it; |
| } |
| |
| virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const |
| { |
| return m_it == boost::polymorphic_downcast<const any_forward_iterator_wrapper*>(&other)->m_it; |
| } |
| |
| virtual Reference dereference() const |
| { |
| return *m_it; |
| } |
| private: |
| WrappedIterator m_it; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Buffer |
| > |
| class any_bidirectional_iterator_wrapper |
| : public any_bidirectional_iterator_interface< |
| Reference |
| , Buffer |
| > |
| { |
| BOOST_RANGE_CONCEPT_ASSERT(( BidirectionalIteratorConcept<WrappedIterator> )); |
| public: |
| any_bidirectional_iterator_wrapper() |
| : m_it() |
| { |
| } |
| |
| explicit any_bidirectional_iterator_wrapper(const WrappedIterator& it) |
| : m_it(it) |
| { |
| } |
| |
| virtual any_bidirectional_iterator_wrapper* clone( |
| typename any_bidirectional_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| return new (buffer.allocate(sizeof(*this))) |
| any_bidirectional_iterator_wrapper(*this); |
| } |
| |
| virtual any_bidirectional_iterator_wrapper< |
| WrappedIterator |
| , typename any_bidirectional_iterator_wrapper::const_reference |
| , Buffer |
| >* clone_const_ref( |
| typename any_bidirectional_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_bidirectional_iterator_wrapper< |
| WrappedIterator |
| , typename any_bidirectional_iterator_wrapper::const_reference |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual any_bidirectional_iterator_wrapper< |
| WrappedIterator |
| , typename any_bidirectional_iterator_wrapper::reference_as_value_type |
| , Buffer |
| >* clone_reference_as_value( |
| typename any_bidirectional_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_bidirectional_iterator_wrapper< |
| WrappedIterator |
| , typename any_bidirectional_iterator_wrapper::reference_as_value_type |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual void increment() |
| { |
| ++m_it; |
| } |
| |
| virtual void decrement() |
| { |
| --m_it; |
| } |
| |
| virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const |
| { |
| return m_it == boost::polymorphic_downcast<const any_bidirectional_iterator_wrapper*>(&other)->m_it; |
| } |
| |
| virtual Reference dereference() const |
| { |
| return *m_it; |
| } |
| |
| private: |
| WrappedIterator m_it; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Difference |
| , class Buffer |
| > |
| class any_random_access_iterator_wrapper |
| : public any_random_access_iterator_interface< |
| Reference |
| , Difference |
| , Buffer |
| > |
| { |
| BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessIteratorConcept<WrappedIterator> )); |
| public: |
| typedef Difference difference_type; |
| |
| any_random_access_iterator_wrapper() |
| : m_it() |
| { |
| } |
| |
| explicit any_random_access_iterator_wrapper(const WrappedIterator& other) |
| : m_it(other) |
| { |
| } |
| |
| virtual any_random_access_iterator_wrapper* clone( |
| typename any_random_access_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| return new (buffer.allocate(sizeof(*this))) |
| any_random_access_iterator_wrapper(*this); |
| } |
| |
| virtual any_random_access_iterator_wrapper< |
| WrappedIterator |
| , typename any_random_access_iterator_wrapper::const_reference |
| , Difference |
| , Buffer |
| >* clone_const_ref( |
| typename any_random_access_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_random_access_iterator_wrapper< |
| WrappedIterator |
| , typename any_random_access_iterator_wrapper::const_reference |
| , Difference |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual any_random_access_iterator_wrapper< |
| WrappedIterator |
| , typename any_random_access_iterator_wrapper::reference_as_value_type |
| , Difference |
| , Buffer |
| >* clone_reference_as_value( |
| typename any_random_access_iterator_wrapper::buffer_type& buffer |
| ) const |
| { |
| typedef any_random_access_iterator_wrapper< |
| WrappedIterator |
| , typename any_random_access_iterator_wrapper::reference_as_value_type |
| , Difference |
| , Buffer |
| > result_type; |
| |
| return new (buffer.allocate(sizeof(result_type))) |
| result_type(m_it); |
| } |
| |
| virtual void increment() |
| { |
| ++m_it; |
| } |
| |
| virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const |
| { |
| return m_it == boost::polymorphic_downcast<const any_random_access_iterator_wrapper*>(&other)->m_it; |
| } |
| |
| virtual void decrement() |
| { |
| --m_it; |
| } |
| |
| virtual void advance(Difference offset) |
| { |
| m_it += offset; |
| } |
| |
| virtual Reference dereference() const |
| { |
| return *m_it; |
| } |
| |
| virtual Difference distance_to(const any_random_access_iterator_interface<Reference, Difference, Buffer>& other) const |
| { |
| return boost::polymorphic_downcast<const any_random_access_iterator_wrapper*>(&other)->m_it - m_it; |
| } |
| |
| private: |
| WrappedIterator m_it; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Traversal |
| , class Reference |
| , class Difference |
| , class Buffer |
| > |
| struct any_iterator_wrapper_type_generator; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Difference |
| , class Buffer |
| > |
| struct any_iterator_wrapper_type_generator< |
| WrappedIterator |
| , incrementable_traversal_tag |
| , Reference |
| , Difference |
| , Buffer |
| > |
| { |
| typedef any_incrementable_iterator_wrapper< |
| WrappedIterator |
| , Reference |
| , Buffer |
| > type; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Difference |
| , class Buffer |
| > |
| struct any_iterator_wrapper_type_generator< |
| WrappedIterator |
| , single_pass_traversal_tag |
| , Reference |
| , Difference |
| , Buffer |
| > |
| { |
| typedef any_single_pass_iterator_wrapper< |
| WrappedIterator |
| , Reference |
| , Buffer |
| > type; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Difference |
| , class Buffer |
| > |
| struct any_iterator_wrapper_type_generator< |
| WrappedIterator |
| , forward_traversal_tag |
| , Reference |
| , Difference |
| , Buffer |
| > |
| { |
| typedef any_forward_iterator_wrapper< |
| WrappedIterator |
| , Reference |
| , Buffer |
| > type; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Difference |
| , class Buffer |
| > |
| struct any_iterator_wrapper_type_generator< |
| WrappedIterator |
| , bidirectional_traversal_tag |
| , Reference |
| , Difference |
| , Buffer |
| > |
| { |
| typedef any_bidirectional_iterator_wrapper< |
| WrappedIterator |
| , Reference |
| , Buffer |
| > type; |
| }; |
| |
| template< |
| class WrappedIterator |
| , class Reference |
| , class Difference |
| , class Buffer |
| > |
| struct any_iterator_wrapper_type_generator< |
| WrappedIterator |
| , random_access_traversal_tag |
| , Reference |
| , Difference |
| , Buffer |
| > |
| { |
| typedef any_random_access_iterator_wrapper< |
| WrappedIterator |
| , Reference |
| , Difference |
| , Buffer |
| > type; |
| }; |
| |
| } // namespace range_detail |
| } // namespace boost |
| |
| #endif // include guard |