// 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_INTERFACE_HPP_INCLUDED | |
#define BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED | |
#include <boost/range/detail/any_iterator_buffer.hpp> | |
#include <boost/type_traits/add_reference.hpp> | |
#include <boost/type_traits/add_const.hpp> | |
namespace boost | |
{ | |
namespace range_detail | |
{ | |
template<class T> | |
struct const_reference_type_generator | |
{ | |
typedef typename mpl::if_< | |
typename is_reference<T>::type, | |
typename add_reference< | |
typename add_const< | |
typename remove_reference<T>::type | |
>::type | |
>::type, | |
T | |
>::type type; | |
}; | |
template< | |
class Reference | |
, class Buffer | |
> | |
struct any_incrementable_iterator_interface | |
{ | |
typedef Reference reference; | |
typedef typename const_reference_type_generator< | |
Reference | |
>::type const_reference; | |
typedef typename remove_const< | |
typename remove_reference<Reference>::type | |
>::type reference_as_value_type; | |
typedef Buffer buffer_type; | |
virtual ~any_incrementable_iterator_interface() {} | |
virtual any_incrementable_iterator_interface* | |
clone(buffer_type& buffer) const = 0; | |
virtual any_incrementable_iterator_interface<const_reference, Buffer>* | |
clone_const_ref(buffer_type& buffer) const = 0; | |
virtual any_incrementable_iterator_interface<reference_as_value_type, Buffer>* | |
clone_reference_as_value(buffer_type& buffer) const = 0; | |
virtual void increment() = 0; | |
}; | |
template< | |
class Reference | |
, class Buffer | |
> | |
struct any_single_pass_iterator_interface | |
: any_incrementable_iterator_interface<Reference, Buffer> | |
{ | |
typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference reference; | |
typedef typename any_incrementable_iterator_interface<Reference, Buffer>::const_reference const_reference; | |
typedef typename any_incrementable_iterator_interface<Reference, Buffer>::buffer_type buffer_type; | |
typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; | |
virtual any_single_pass_iterator_interface* | |
clone(buffer_type& buffer) const = 0; | |
virtual any_single_pass_iterator_interface<const_reference, Buffer>* | |
clone_const_ref(buffer_type& buffer) const = 0; | |
virtual any_single_pass_iterator_interface<reference_as_value_type, Buffer>* | |
clone_reference_as_value(buffer_type& buffer) const = 0; | |
virtual Reference dereference() const = 0; | |
virtual bool equal(const any_single_pass_iterator_interface& other) const = 0; | |
}; | |
template< | |
class Reference | |
, class Buffer | |
> | |
struct any_forward_iterator_interface | |
: any_single_pass_iterator_interface<Reference, Buffer> | |
{ | |
typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference reference; | |
typedef typename any_single_pass_iterator_interface<Reference, Buffer>::const_reference const_reference; | |
typedef typename any_single_pass_iterator_interface<Reference, Buffer>::buffer_type buffer_type; | |
typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; | |
virtual any_forward_iterator_interface* | |
clone(buffer_type& buffer) const = 0; | |
virtual any_forward_iterator_interface<const_reference, Buffer>* | |
clone_const_ref(buffer_type& buffer) const = 0; | |
virtual any_forward_iterator_interface<reference_as_value_type, Buffer>* | |
clone_reference_as_value(buffer_type& buffer) const = 0; | |
}; | |
template< | |
class Reference | |
, class Buffer | |
> | |
struct any_bidirectional_iterator_interface | |
: any_forward_iterator_interface<Reference, Buffer> | |
{ | |
typedef typename any_forward_iterator_interface<Reference, Buffer>::reference reference; | |
typedef typename any_forward_iterator_interface<Reference, Buffer>::const_reference const_reference; | |
typedef typename any_forward_iterator_interface<Reference, Buffer>::buffer_type buffer_type; | |
typedef typename any_forward_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; | |
virtual any_bidirectional_iterator_interface* | |
clone(buffer_type& buffer) const = 0; | |
virtual any_bidirectional_iterator_interface<const_reference, Buffer>* | |
clone_const_ref(buffer_type& buffer) const = 0; | |
virtual any_bidirectional_iterator_interface<reference_as_value_type, Buffer>* | |
clone_reference_as_value(buffer_type& buffer) const = 0; | |
virtual void decrement() = 0; | |
}; | |
template< | |
class Reference | |
, class Difference | |
, class Buffer | |
> | |
struct any_random_access_iterator_interface | |
: any_bidirectional_iterator_interface< | |
Reference | |
, Buffer | |
> | |
{ | |
typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference reference; | |
typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::const_reference const_reference; | |
typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::buffer_type buffer_type; | |
typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; | |
typedef Difference difference_type; | |
virtual any_random_access_iterator_interface* | |
clone(buffer_type& buffer) const = 0; | |
virtual any_random_access_iterator_interface<const_reference, Difference, Buffer>* | |
clone_const_ref(buffer_type& buffer) const = 0; | |
virtual any_random_access_iterator_interface<reference_as_value_type, Difference, Buffer>* | |
clone_reference_as_value(buffer_type& buffer) const = 0; | |
virtual void advance(Difference offset) = 0; | |
virtual Difference distance_to(const any_random_access_iterator_interface& other) const = 0; | |
}; | |
template< | |
class Traversal | |
, class Reference | |
, class Difference | |
, class Buffer | |
> | |
struct any_iterator_interface_type_generator; | |
template< | |
class Reference | |
, class Difference | |
, class Buffer | |
> | |
struct any_iterator_interface_type_generator< | |
incrementable_traversal_tag | |
, Reference | |
, Difference | |
, Buffer | |
> | |
{ | |
typedef any_incrementable_iterator_interface<Reference, Buffer> type; | |
}; | |
template< | |
class Reference | |
, class Difference | |
, class Buffer | |
> | |
struct any_iterator_interface_type_generator< | |
single_pass_traversal_tag | |
, Reference | |
, Difference | |
, Buffer | |
> | |
{ | |
typedef any_single_pass_iterator_interface<Reference, Buffer> type; | |
}; | |
template< | |
class Reference | |
, class Difference | |
, class Buffer | |
> | |
struct any_iterator_interface_type_generator< | |
forward_traversal_tag | |
, Reference | |
, Difference | |
, Buffer | |
> | |
{ | |
typedef any_forward_iterator_interface<Reference, Buffer> type; | |
}; | |
template< | |
class Reference | |
, class Difference | |
, class Buffer | |
> | |
struct any_iterator_interface_type_generator< | |
bidirectional_traversal_tag | |
, Reference | |
, Difference | |
, Buffer | |
> | |
{ | |
typedef any_bidirectional_iterator_interface<Reference, Buffer> type; | |
}; | |
template< | |
class Reference | |
, class Difference | |
, class Buffer | |
> | |
struct any_iterator_interface_type_generator< | |
random_access_traversal_tag | |
, Reference | |
, Difference | |
, Buffer | |
> | |
{ | |
typedef any_random_access_iterator_interface< | |
Reference | |
, Difference | |
, Buffer | |
> type; | |
}; | |
} // namespace range_detail | |
} // namespace boost | |
#endif // include guard |