170 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			170 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// Boost.Range library
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Copyright Neil Groves 2007. 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_REPLACED_IMPL_HPP_INCLUDED
							 | 
						||
| 
								 | 
							
								#define BOOST_RANGE_ADAPTOR_REPLACED_IMPL_HPP_INCLUDED
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/config.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/adaptor/argument_fwd.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/iterator_range.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/begin.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/end.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/value_type.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/concepts.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/iterator/iterator_adaptor.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/iterator/transform_iterator.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/optional/optional.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    namespace range_detail
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        template< class Value >
							 | 
						||
| 
								 | 
							
								        class replace_value
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            typedef const Value& result_type;
							 | 
						||
| 
								 | 
							
								            typedef const Value& first_argument_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Rationale:
							 | 
						||
| 
								 | 
							
								            // The default constructor is required to allow the transform
							 | 
						||
| 
								 | 
							
								            // iterator to properly model the iterator concept.
							 | 
						||
| 
								 | 
							
								            replace_value()
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            replace_value(const Value& from, const Value& to)
							 | 
						||
| 
								 | 
							
								                :   m_impl(data(from, to))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            const Value& operator()(const Value& x) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return (x == m_impl->m_from) ? m_impl->m_to : x;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private:
							 | 
						||
| 
								 | 
							
								            struct data
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                data(const Value& from, const Value& to)
							 | 
						||
| 
								 | 
							
								                    : m_from(from)
							 | 
						||
| 
								 | 
							
								                    , m_to(to)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                Value m_from;
							 | 
						||
| 
								 | 
							
								                Value m_to;
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            boost::optional<data> m_impl;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template< class R >
							 | 
						||
| 
								 | 
							
								        class replaced_range :
							 | 
						||
| 
								 | 
							
								            public boost::iterator_range<
							 | 
						||
| 
								 | 
							
								                boost::transform_iterator<
							 | 
						||
| 
								 | 
							
								                    replace_value< BOOST_DEDUCED_TYPENAME range_value<R>::type >,
							 | 
						||
| 
								 | 
							
								                    BOOST_DEDUCED_TYPENAME range_iterator<R>::type > >
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								        private:
							 | 
						||
| 
								 | 
							
								            typedef replace_value< BOOST_DEDUCED_TYPENAME range_value<R>::type > Fn;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef boost::iterator_range<
							 | 
						||
| 
								 | 
							
								                boost::transform_iterator<
							 | 
						||
| 
								 | 
							
								                    replace_value< BOOST_DEDUCED_TYPENAME range_value<R>::type >,
							 | 
						||
| 
								 | 
							
								                    BOOST_DEDUCED_TYPENAME range_iterator<R>::type > > base_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            typedef BOOST_DEDUCED_TYPENAME range_value<R>::type value_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            replaced_range( R& r, value_type from, value_type to )
							 | 
						||
| 
								 | 
							
								                : base_t( make_transform_iterator( boost::begin(r), Fn(from, to) ),
							 | 
						||
| 
								 | 
							
								                          make_transform_iterator( boost::end(r), Fn(from, to) ) )
							 | 
						||
| 
								 | 
							
								            { }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template< class T >
							 | 
						||
| 
								 | 
							
								        class replace_holder : public holder2<T>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            replace_holder( const T& from, const T& to )
							 | 
						||
| 
								 | 
							
								                : holder2<T>(from, to)
							 | 
						||
| 
								 | 
							
								            { }
							 | 
						||
| 
								 | 
							
								        private:
							 | 
						||
| 
								 | 
							
								            // not assignable
							 | 
						||
| 
								 | 
							
								            void operator=(const replace_holder&);
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template< class SinglePassRange >
							 | 
						||
| 
								 | 
							
								        inline replaced_range<SinglePassRange>
							 | 
						||
| 
								 | 
							
								        operator|(
							 | 
						||
| 
								 | 
							
								            SinglePassRange& r,
							 | 
						||
| 
								 | 
							
								            const replace_holder<
							 | 
						||
| 
								 | 
							
								                BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type>& f )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<SinglePassRange>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return replaced_range<SinglePassRange>(r, f.val1, f.val2);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template< class SinglePassRange >
							 | 
						||
| 
								 | 
							
								        inline replaced_range<const SinglePassRange>
							 | 
						||
| 
								 | 
							
								        operator|(
							 | 
						||
| 
								 | 
							
								            const SinglePassRange& r,
							 | 
						||
| 
								 | 
							
								            const replace_holder<
							 | 
						||
| 
								 | 
							
								                BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type>& f)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<const SinglePassRange>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return replaced_range<const SinglePassRange>(r, f.val1, f.val2);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } // 'range_detail'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    using range_detail::replaced_range;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace adaptors
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        namespace
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            const range_detail::forwarder2<range_detail::replace_holder>
							 | 
						||
| 
								 | 
							
								                replaced =
							 | 
						||
| 
								 | 
							
								                    range_detail::forwarder2<range_detail::replace_holder>();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class SinglePassRange>
							 | 
						||
| 
								 | 
							
								        inline replaced_range<SinglePassRange>
							 | 
						||
| 
								 | 
							
								        replace(SinglePassRange& rng,
							 | 
						||
| 
								 | 
							
								                BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type from,
							 | 
						||
| 
								 | 
							
								                BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type to)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<SinglePassRange>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return replaced_range<SinglePassRange>(rng, from, to);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class SinglePassRange>
							 | 
						||
| 
								 | 
							
								        inline replaced_range<const SinglePassRange>
							 | 
						||
| 
								 | 
							
								        replace(const SinglePassRange& rng,
							 | 
						||
| 
								 | 
							
								                BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type from,
							 | 
						||
| 
								 | 
							
								                BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type to)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<const SinglePassRange>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return replaced_range<const SinglePassRange>(rng, from ,to);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } // 'adaptors'
							 | 
						||
| 
								 | 
							
								} // 'boost'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // include guard
							 |