197 lines
5.6 KiB
Plaintext
197 lines
5.6 KiB
Plaintext
|
// 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_ADAPTOR_TYPE_ERASED_HPP_INCLUDED
|
||
|
#define BOOST_RANGE_ADAPTOR_TYPE_ERASED_HPP_INCLUDED
|
||
|
|
||
|
#include <boost/range/reference.hpp>
|
||
|
#include <boost/range/value_type.hpp>
|
||
|
#include <boost/range/iterator_range_core.hpp>
|
||
|
#include <boost/range/any_range.hpp>
|
||
|
#include <boost/range/concepts.hpp>
|
||
|
|
||
|
namespace boost
|
||
|
{
|
||
|
namespace adaptors
|
||
|
{
|
||
|
template<
|
||
|
class Value = use_default
|
||
|
, class Traversal = use_default
|
||
|
, class Reference = use_default
|
||
|
, class Difference = use_default
|
||
|
, class Buffer = use_default
|
||
|
>
|
||
|
struct type_erased
|
||
|
{
|
||
|
};
|
||
|
|
||
|
template<
|
||
|
class SinglePassRange
|
||
|
, class Value
|
||
|
, class Traversal
|
||
|
, class Reference
|
||
|
, class Difference
|
||
|
, class Buffer
|
||
|
>
|
||
|
typename any_range_type_generator<
|
||
|
SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type
|
||
|
operator|(SinglePassRange& rng,
|
||
|
type_erased<
|
||
|
Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>)
|
||
|
{
|
||
|
BOOST_RANGE_CONCEPT_ASSERT((
|
||
|
SinglePassRangeConcept<SinglePassRange>));
|
||
|
|
||
|
typedef typename any_range_type_generator<
|
||
|
SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type range_type;
|
||
|
return range_type(boost::begin(rng), boost::end(rng));
|
||
|
}
|
||
|
|
||
|
template<
|
||
|
class SinglePassRange
|
||
|
, class Value
|
||
|
, class Traversal
|
||
|
, class Reference
|
||
|
, class Difference
|
||
|
, class Buffer
|
||
|
>
|
||
|
typename any_range_type_generator<
|
||
|
const SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type
|
||
|
operator|(const SinglePassRange& rng,
|
||
|
type_erased<
|
||
|
Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>)
|
||
|
{
|
||
|
BOOST_RANGE_CONCEPT_ASSERT((
|
||
|
SinglePassRangeConcept<const SinglePassRange>));
|
||
|
|
||
|
typedef typename any_range_type_generator<
|
||
|
const SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type range_type;
|
||
|
return range_type(boost::begin(rng), boost::end(rng));
|
||
|
}
|
||
|
|
||
|
template<
|
||
|
class SinglePassRange
|
||
|
, class Value
|
||
|
, class Traversal
|
||
|
, class Reference
|
||
|
, class Difference
|
||
|
, class Buffer
|
||
|
>
|
||
|
typename any_range_type_generator<
|
||
|
SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type
|
||
|
type_erase(SinglePassRange& rng
|
||
|
, type_erased<
|
||
|
Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
> = type_erased<>()
|
||
|
)
|
||
|
{
|
||
|
BOOST_RANGE_CONCEPT_ASSERT((
|
||
|
SinglePassRangeConcept<SinglePassRange>));
|
||
|
|
||
|
typedef typename any_range_type_generator<
|
||
|
SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type range_type;
|
||
|
|
||
|
return range_type(boost::begin(rng), boost::end(rng));
|
||
|
}
|
||
|
|
||
|
template<
|
||
|
class SinglePassRange
|
||
|
, class Value
|
||
|
, class Traversal
|
||
|
, class Reference
|
||
|
, class Difference
|
||
|
, class Buffer
|
||
|
>
|
||
|
typename any_range_type_generator<
|
||
|
const SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type
|
||
|
type_erase(const SinglePassRange& rng
|
||
|
, type_erased<
|
||
|
Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
> = type_erased<>()
|
||
|
)
|
||
|
{
|
||
|
BOOST_RANGE_CONCEPT_ASSERT((
|
||
|
SinglePassRangeConcept<const SinglePassRange>));
|
||
|
|
||
|
typedef typename any_range_type_generator<
|
||
|
const SinglePassRange
|
||
|
, Value
|
||
|
, Traversal
|
||
|
, Reference
|
||
|
, Difference
|
||
|
, Buffer
|
||
|
>::type range_type;
|
||
|
|
||
|
return range_type(boost::begin(rng), boost::end(rng));
|
||
|
}
|
||
|
}
|
||
|
} // namespace boost
|
||
|
|
||
|
#endif // include guard
|