| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | //  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>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 = Value&          , class Difference = std::ptrdiff_t          , 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
 |