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_WRAPPER_HPP_INCLUDED Chris@16: #define BOOST_RANGE_DETAIL_ANY_ITERATOR_WRAPPER_HPP_INCLUDED Chris@16: 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@101: template Chris@101: TargetT& polymorphic_ref_downcast(SourceT& source) Chris@101: { Chris@101: #ifdef BOOST_NO_RTTI Chris@101: return static_cast(source); Chris@101: #else Chris@101: return *boost::polymorphic_downcast(&source); Chris@101: #endif Chris@101: } Chris@101: Chris@101: template Chris@101: Reference dereference_cast(T& x) Chris@101: { Chris@101: return static_cast(x); Chris@101: } Chris@101: template Chris@101: Reference dereference_cast(const T& x) Chris@101: { Chris@101: return static_cast(const_cast(x)); Chris@101: } Chris@101: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Buffer Chris@16: > Chris@16: class any_incrementable_iterator_wrapper Chris@16: : public any_incrementable_iterator_interface< Chris@16: Reference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: BOOST_RANGE_CONCEPT_ASSERT(( IncrementableIteratorConcept )); Chris@16: public: Chris@16: typedef WrappedIterator wrapped_type; Chris@16: Chris@16: BOOST_STATIC_ASSERT(( is_convertible< Chris@16: typename iterator_reference::type Chris@16: , Reference Chris@16: >::value )); Chris@16: Chris@16: any_incrementable_iterator_wrapper() Chris@16: : m_it() Chris@16: {} Chris@16: Chris@16: explicit any_incrementable_iterator_wrapper(wrapped_type it) Chris@16: : m_it(it) Chris@16: {} Chris@16: Chris@16: // any_incrementable_iterator implementation Chris@16: virtual any_incrementable_iterator_wrapper* clone( Chris@16: typename any_incrementable_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: return new (buffer.allocate(sizeof(*this))) Chris@16: any_incrementable_iterator_wrapper(m_it); Chris@16: } Chris@16: Chris@16: virtual any_incrementable_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_incrementable_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: >* clone_const_ref( Chris@16: typename any_incrementable_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_incrementable_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_incrementable_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual any_incrementable_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_incrementable_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: >* clone_reference_as_value( Chris@16: typename any_incrementable_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_incrementable_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_incrementable_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual void increment() Chris@16: { Chris@16: ++m_it; Chris@16: } Chris@16: Chris@16: private: Chris@16: wrapped_type m_it; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Buffer Chris@16: > Chris@16: class any_single_pass_iterator_wrapper Chris@16: : public any_single_pass_iterator_interface< Chris@16: Reference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: struct disabler {}; Chris@16: BOOST_RANGE_CONCEPT_ASSERT(( SinglePassIteratorConcept )); Chris@101: typedef any_single_pass_iterator_interface< Chris@101: Reference, Chris@101: Buffer Chris@101: > base_type; Chris@101: Chris@16: public: Chris@101: typedef typename base_type::reference reference; Chris@16: Chris@16: any_single_pass_iterator_wrapper() Chris@16: : m_it() Chris@16: {} Chris@16: Chris@16: explicit any_single_pass_iterator_wrapper(const WrappedIterator& it) Chris@16: : m_it(it) Chris@16: {} Chris@16: // any_single_pass_iterator_interface implementation Chris@16: virtual any_single_pass_iterator_wrapper* clone( Chris@16: typename any_single_pass_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: return new (buffer.allocate(sizeof(*this))) Chris@16: any_single_pass_iterator_wrapper(m_it); Chris@16: } Chris@16: Chris@16: virtual any_single_pass_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_single_pass_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: >* clone_const_ref( Chris@16: typename any_single_pass_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_single_pass_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_single_pass_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual any_single_pass_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_single_pass_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: >* clone_reference_as_value( Chris@16: typename any_single_pass_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_single_pass_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_single_pass_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual void increment() Chris@16: { Chris@16: ++m_it; Chris@16: } Chris@16: Chris@16: virtual bool equal(const any_single_pass_iterator_interface& other) const Chris@16: { Chris@101: return m_it == range_detail::polymorphic_ref_downcast(other).m_it; Chris@16: } Chris@16: Chris@101: virtual reference dereference() const Chris@16: { Chris@101: return dereference_cast(*m_it); Chris@16: } Chris@16: Chris@16: private: Chris@16: WrappedIterator m_it; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Buffer Chris@16: > Chris@16: class any_forward_iterator_wrapper Chris@16: : public any_forward_iterator_interface< Chris@16: Reference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: BOOST_RANGE_CONCEPT_ASSERT(( ForwardIteratorConcept )); Chris@101: typedef any_forward_iterator_interface< Chris@101: Reference, Chris@101: Buffer Chris@101: > base_type; Chris@101: Chris@16: public: Chris@101: typedef typename base_type::reference reference; Chris@101: Chris@16: any_forward_iterator_wrapper() Chris@16: : m_it() Chris@16: {} Chris@16: Chris@16: explicit any_forward_iterator_wrapper(const WrappedIterator& it) Chris@16: : m_it(it) Chris@16: {} Chris@16: Chris@16: // any_forward_iterator_interface implementation Chris@16: virtual any_forward_iterator_wrapper* clone( Chris@16: typename any_forward_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: return new (buffer.allocate(sizeof(*this))) Chris@16: any_forward_iterator_wrapper(m_it); Chris@16: } Chris@16: Chris@16: virtual any_forward_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_forward_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: >* clone_const_ref( Chris@16: typename any_forward_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_forward_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_forward_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual any_forward_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_forward_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: >* clone_reference_as_value( Chris@16: typename any_forward_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_forward_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_forward_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual void increment() Chris@16: { Chris@16: ++m_it; Chris@16: } Chris@16: Chris@16: virtual bool equal(const any_single_pass_iterator_interface& other) const Chris@16: { Chris@101: return m_it == range_detail::polymorphic_ref_downcast(other).m_it; Chris@16: } Chris@16: Chris@101: virtual reference dereference() const Chris@16: { Chris@101: return dereference_cast(*m_it); Chris@16: } Chris@16: private: Chris@16: WrappedIterator m_it; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Buffer Chris@16: > Chris@16: class any_bidirectional_iterator_wrapper Chris@16: : public any_bidirectional_iterator_interface< Chris@16: Reference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: BOOST_RANGE_CONCEPT_ASSERT(( BidirectionalIteratorConcept )); Chris@101: typedef any_bidirectional_iterator_interface< Chris@101: Reference, Chris@101: Buffer Chris@101: > base_type; Chris@101: Chris@16: public: Chris@101: typedef typename base_type::reference reference; Chris@101: Chris@16: any_bidirectional_iterator_wrapper() Chris@16: : m_it() Chris@16: { Chris@16: } Chris@16: Chris@16: explicit any_bidirectional_iterator_wrapper(const WrappedIterator& it) Chris@16: : m_it(it) Chris@16: { Chris@16: } Chris@16: Chris@16: virtual any_bidirectional_iterator_wrapper* clone( Chris@16: typename any_bidirectional_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: return new (buffer.allocate(sizeof(*this))) Chris@16: any_bidirectional_iterator_wrapper(*this); Chris@16: } Chris@16: Chris@16: virtual any_bidirectional_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_bidirectional_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: >* clone_const_ref( Chris@16: typename any_bidirectional_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_bidirectional_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_bidirectional_iterator_wrapper::const_reference Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual any_bidirectional_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_bidirectional_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: >* clone_reference_as_value( Chris@16: typename any_bidirectional_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_bidirectional_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_bidirectional_iterator_wrapper::reference_as_value_type Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual void increment() Chris@16: { Chris@16: ++m_it; Chris@16: } Chris@16: Chris@16: virtual void decrement() Chris@16: { Chris@16: --m_it; Chris@16: } Chris@16: Chris@16: virtual bool equal(const any_single_pass_iterator_interface& other) const Chris@16: { Chris@101: return m_it == range_detail::polymorphic_ref_downcast(other).m_it; Chris@16: } Chris@16: Chris@101: virtual reference dereference() const Chris@16: { Chris@101: return dereference_cast(*m_it); Chris@16: } Chris@16: Chris@16: private: Chris@16: WrappedIterator m_it; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: class any_random_access_iterator_wrapper Chris@16: : public any_random_access_iterator_interface< Chris@16: Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessIteratorConcept )); Chris@101: typedef any_random_access_iterator_interface< Chris@101: Reference, Chris@101: Difference, Chris@101: Buffer Chris@101: > base_type; Chris@101: Chris@16: public: Chris@101: typedef typename base_type::reference reference; Chris@16: typedef Difference difference_type; Chris@16: Chris@16: any_random_access_iterator_wrapper() Chris@16: : m_it() Chris@16: { Chris@16: } Chris@16: Chris@16: explicit any_random_access_iterator_wrapper(const WrappedIterator& other) Chris@16: : m_it(other) Chris@16: { Chris@16: } Chris@16: Chris@16: virtual any_random_access_iterator_wrapper* clone( Chris@16: typename any_random_access_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: return new (buffer.allocate(sizeof(*this))) Chris@16: any_random_access_iterator_wrapper(*this); Chris@16: } Chris@16: Chris@16: virtual any_random_access_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_random_access_iterator_wrapper::const_reference Chris@16: , Difference Chris@16: , Buffer Chris@16: >* clone_const_ref( Chris@16: typename any_random_access_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_random_access_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_random_access_iterator_wrapper::const_reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual any_random_access_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_random_access_iterator_wrapper::reference_as_value_type Chris@16: , Difference Chris@16: , Buffer Chris@16: >* clone_reference_as_value( Chris@16: typename any_random_access_iterator_wrapper::buffer_type& buffer Chris@16: ) const Chris@16: { Chris@16: typedef any_random_access_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , typename any_random_access_iterator_wrapper::reference_as_value_type Chris@16: , Difference Chris@16: , Buffer Chris@16: > result_type; Chris@16: Chris@16: return new (buffer.allocate(sizeof(result_type))) Chris@16: result_type(m_it); Chris@16: } Chris@16: Chris@16: virtual void increment() Chris@16: { Chris@16: ++m_it; Chris@16: } Chris@16: Chris@16: virtual bool equal(const any_single_pass_iterator_interface& other) const Chris@16: { Chris@101: return m_it == range_detail::polymorphic_ref_downcast(other).m_it; Chris@16: } Chris@16: Chris@16: virtual void decrement() Chris@16: { Chris@16: --m_it; Chris@16: } Chris@16: Chris@16: virtual void advance(Difference offset) Chris@16: { Chris@16: m_it += offset; Chris@16: } Chris@16: Chris@101: virtual reference dereference() const Chris@16: { Chris@101: return dereference_cast(*m_it); Chris@16: } Chris@16: Chris@16: virtual Difference distance_to(const any_random_access_iterator_interface& other) const Chris@16: { Chris@101: return range_detail::polymorphic_ref_downcast(other).m_it - m_it; Chris@16: } Chris@16: Chris@16: private: Chris@16: WrappedIterator m_it; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Traversal Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_wrapper_type_generator; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_wrapper_type_generator< Chris@16: WrappedIterator Chris@16: , incrementable_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_incrementable_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , Reference Chris@16: , Buffer Chris@16: > type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_wrapper_type_generator< Chris@16: WrappedIterator 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_wrapper< Chris@16: WrappedIterator Chris@16: , Reference Chris@16: , Buffer Chris@16: > type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_wrapper_type_generator< Chris@16: WrappedIterator Chris@16: , forward_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_forward_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , Reference Chris@16: , Buffer Chris@16: > type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_wrapper_type_generator< Chris@16: WrappedIterator Chris@16: , bidirectional_traversal_tag Chris@16: , Reference Chris@16: , Difference Chris@16: , Buffer Chris@16: > Chris@16: { Chris@16: typedef any_bidirectional_iterator_wrapper< Chris@16: WrappedIterator Chris@16: , Reference Chris@16: , Buffer Chris@16: > type; Chris@16: }; Chris@16: Chris@16: template< Chris@16: class WrappedIterator Chris@16: , class Reference Chris@16: , class Difference Chris@16: , class Buffer Chris@16: > Chris@16: struct any_iterator_wrapper_type_generator< Chris@16: WrappedIterator 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_wrapper< Chris@16: WrappedIterator 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