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.
205 lines
6.4 KiB
205 lines
6.4 KiB
// 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_ANY_RANGE_HPP_INCLUDED |
|
#define BOOST_RANGE_ANY_RANGE_HPP_INCLUDED |
|
|
|
#include <boost/config.hpp> |
|
#include <boost/iterator/iterator_categories.hpp> |
|
#include <boost/iterator/iterator_traits.hpp> |
|
#include <boost/iterator/iterator_facade.hpp> |
|
#include <boost/iterator/iterator_adaptor.hpp> |
|
#include <boost/range/detail/any_iterator.hpp> |
|
#include <boost/range/concepts.hpp> |
|
#include <boost/range/reference.hpp> |
|
#include <boost/range/value_type.hpp> |
|
#include <boost/range/iterator_range_core.hpp> |
|
#include <boost/cast.hpp> |
|
|
|
namespace boost |
|
{ |
|
namespace range_detail |
|
{ |
|
// If T is use_default, return the result of Default, otherwise |
|
// return T. |
|
// |
|
// This is an implementation artifact used to pick intelligent default |
|
// values when the user specified boost::use_default as a template |
|
// parameter. |
|
template< |
|
class T, |
|
class Default |
|
> |
|
struct any_range_default_help |
|
: mpl::eval_if< |
|
is_same<T, use_default> |
|
, Default |
|
, mpl::identity<T> |
|
> |
|
{ |
|
}; |
|
|
|
template< |
|
class WrappedRange |
|
, class Value |
|
, class Reference |
|
> |
|
struct any_range_value_type |
|
{ |
|
# ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY |
|
typedef typename any_range_default_help< |
|
Value |
|
, mpl::eval_if< |
|
is_same<Reference, use_default> |
|
, range_value< |
|
typename remove_const<WrappedRange> |
|
::type> |
|
, remove_reference<Reference> |
|
> |
|
>::type type; |
|
# else |
|
typedef typename any_range_default_help< |
|
Value |
|
, range_value< |
|
typename remove_const<WrappedRange> |
|
::type> |
|
>::type type; |
|
# endif |
|
}; |
|
|
|
template< |
|
class Value |
|
, class Traversal |
|
, class Reference |
|
, class Difference |
|
, class Buffer = use_default |
|
> |
|
class any_range |
|
: public iterator_range< |
|
any_iterator< |
|
Value |
|
, Traversal |
|
, Reference |
|
, Difference |
|
, typename any_range_default_help< |
|
Buffer |
|
, mpl::identity<any_iterator_default_buffer> |
|
>::type |
|
> |
|
> |
|
{ |
|
typedef iterator_range< |
|
any_iterator< |
|
Value |
|
, Traversal |
|
, Reference |
|
, Difference |
|
, typename any_range_default_help< |
|
Buffer |
|
, mpl::identity<any_iterator_default_buffer> |
|
>::type |
|
> |
|
> base_type; |
|
|
|
struct enabler {}; |
|
struct disabler {}; |
|
public: |
|
any_range() |
|
{ |
|
} |
|
|
|
any_range(const any_range& other) |
|
: base_type(other) |
|
{ |
|
} |
|
|
|
template<class WrappedRange> |
|
any_range(WrappedRange& wrapped_range) |
|
: base_type(boost::begin(wrapped_range), |
|
boost::end(wrapped_range)) |
|
{ |
|
} |
|
|
|
template<class WrappedRange> |
|
any_range(const WrappedRange& wrapped_range) |
|
: base_type(boost::begin(wrapped_range), |
|
boost::end(wrapped_range)) |
|
{ |
|
} |
|
|
|
template< |
|
class OtherValue |
|
, class OtherTraversal |
|
, class OtherReference |
|
, class OtherDifference |
|
> |
|
any_range(const any_range< |
|
OtherValue |
|
, OtherTraversal |
|
, OtherReference |
|
, OtherDifference |
|
, Buffer |
|
>& other) |
|
: base_type(boost::begin(other), boost::end(other)) |
|
{ |
|
} |
|
|
|
template<class Iterator> |
|
any_range(Iterator first, Iterator last) |
|
: base_type(first, last) |
|
{ |
|
} |
|
}; |
|
|
|
template< |
|
class WrappedRange |
|
, class Value = use_default |
|
, class Traversal = use_default |
|
, class Reference = use_default |
|
, class Difference = use_default |
|
, class Buffer = use_default |
|
> |
|
struct any_range_type_generator |
|
{ |
|
BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<WrappedRange> )); |
|
typedef any_range< |
|
typename any_range_value_type< |
|
WrappedRange |
|
, Value |
|
, typename any_range_default_help< |
|
Reference |
|
, range_reference<WrappedRange> |
|
>::type |
|
>::type |
|
, typename any_range_default_help< |
|
Traversal |
|
, iterator_traversal< |
|
typename range_iterator<WrappedRange>::type |
|
> |
|
>::type |
|
, typename any_range_default_help< |
|
Reference |
|
, range_reference<WrappedRange> |
|
>::type |
|
, typename any_range_default_help< |
|
Difference |
|
, range_difference<WrappedRange> |
|
>::type |
|
, typename any_range_default_help< |
|
Buffer |
|
, mpl::identity<any_iterator_default_buffer> |
|
>::type |
|
> type; |
|
}; |
|
} // namespace range_detail |
|
|
|
using range_detail::any_range; |
|
using range_detail::any_range_type_generator; |
|
} // namespace boost |
|
|
|
#endif // include guard
|
|
|