forked from boostorg/range
[boost][range] - Updated begin/end to be protected against accidental ADL to improve compatibility with C++0x. Added any_range which adds type erasure support. Added a type_erased adaptor to utilise the any_range. Implemented the any_iterator using a small buffer optimization to avoid heap usage.
[SVN r67541]
This commit is contained in:
204
include/boost/range/any_range.hpp
Normal file
204
include/boost/range/any_range.hpp
Normal file
@ -0,0 +1,204 @@
|
||||
// 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
|
Reference in New Issue
Block a user