You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
590 lines
19 KiB
590 lines
19 KiB
// 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
|
|
|