// 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/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 |