| // 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/cast.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 |
| >) |
| { |
| 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 |
| >) |
| { |
| 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<>() |
| ) |
| { |
| 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<>() |
| ) |
| { |
| 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 |