138 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// Boost.Range library
 | 
						|
//
 | 
						|
//  Copyright Thorsten Ottosen, Neil Groves 2006. 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_TOKENIZED_HPP
 | 
						|
#define BOOST_RANGE_ADAPTOR_TOKENIZED_HPP
 | 
						|
 | 
						|
#include <boost/regex.hpp>
 | 
						|
#include <boost/range/iterator_range.hpp>
 | 
						|
 | 
						|
namespace boost
 | 
						|
{
 | 
						|
    namespace range_detail
 | 
						|
    {
 | 
						|
 | 
						|
        template< class R >
 | 
						|
        struct tokenized_range : 
 | 
						|
            public boost::iterator_range< 
 | 
						|
                      boost::regex_token_iterator< 
 | 
						|
                          BOOST_DEDUCED_TYPENAME range_iterator<R>::type 
 | 
						|
                                              >
 | 
						|
                                         >
 | 
						|
        {
 | 
						|
        private:
 | 
						|
            typedef           
 | 
						|
                boost::regex_token_iterator< 
 | 
						|
                          BOOST_DEDUCED_TYPENAME range_iterator<R>::type 
 | 
						|
                                            >
 | 
						|
                regex_iter;
 | 
						|
            
 | 
						|
            typedef BOOST_DEDUCED_TYPENAME regex_iter::regex_type 
 | 
						|
                regex_type;
 | 
						|
        
 | 
						|
            typedef boost::iterator_range<regex_iter> 
 | 
						|
                base;
 | 
						|
 | 
						|
        public:
 | 
						|
            template< class Regex, class Submatch, class Flag >
 | 
						|
            tokenized_range( R& r, const Regex& re, const Submatch& sub, Flag f )
 | 
						|
              : base( regex_iter( boost::begin(r), boost::end(r), 
 | 
						|
                                  regex_type(re), sub, f ),
 | 
						|
                      regex_iter() )
 | 
						|
            { }
 | 
						|
        };
 | 
						|
 | 
						|
        template< class T, class U, class V >
 | 
						|
        struct regex_holder
 | 
						|
        {
 | 
						|
            T  re;
 | 
						|
            U  sub;
 | 
						|
            V  f;
 | 
						|
 | 
						|
            regex_holder( const T& rex, const U& subm, V flag ) :
 | 
						|
                re(rex), sub(subm), f(flag)
 | 
						|
            { }
 | 
						|
        private:
 | 
						|
            // Not assignable
 | 
						|
            void operator=(const regex_holder&);
 | 
						|
        };
 | 
						|
 | 
						|
        struct regex_forwarder
 | 
						|
        {           
 | 
						|
            template< class Regex >
 | 
						|
            regex_holder<Regex,int,regex_constants::match_flag_type>
 | 
						|
            operator()( const Regex& re, 
 | 
						|
                        int submatch = 0,    
 | 
						|
                        regex_constants::match_flag_type f = 
 | 
						|
                            regex_constants::match_default ) const
 | 
						|
            {
 | 
						|
                return regex_holder<Regex,int,
 | 
						|
                           regex_constants::match_flag_type>( re, submatch, f );
 | 
						|
            }
 | 
						|
             
 | 
						|
            template< class Regex, class Submatch >
 | 
						|
            regex_holder<Regex,Submatch,regex_constants::match_flag_type> 
 | 
						|
            operator()( const Regex& re, 
 | 
						|
                        const Submatch& sub, 
 | 
						|
                        regex_constants::match_flag_type f = 
 | 
						|
                            regex_constants::match_default ) const
 | 
						|
            {
 | 
						|
                return regex_holder<Regex,Submatch,
 | 
						|
                           regex_constants::match_flag_type>( re, sub, f ); 
 | 
						|
            }
 | 
						|
        };
 | 
						|
        
 | 
						|
        template< class BidirectionalRng, class R, class S, class F >
 | 
						|
        inline tokenized_range<BidirectionalRng> 
 | 
						|
        operator|( BidirectionalRng& r, 
 | 
						|
                   const regex_holder<R,S,F>& f )
 | 
						|
        {
 | 
						|
            return tokenized_range<BidirectionalRng>( r, f.re, f.sub, f.f );   
 | 
						|
        }
 | 
						|
 | 
						|
        template< class BidirectionalRng, class R, class S, class F  >
 | 
						|
        inline tokenized_range<const BidirectionalRng> 
 | 
						|
        operator|( const BidirectionalRng& r, 
 | 
						|
                   const regex_holder<R,S,F>& f )
 | 
						|
        {
 | 
						|
            return tokenized_range<const BidirectionalRng>( r, f.re, f.sub, f.f );
 | 
						|
        }
 | 
						|
        
 | 
						|
    } // 'range_detail'
 | 
						|
 | 
						|
    using range_detail::tokenized_range;
 | 
						|
 | 
						|
    namespace adaptors
 | 
						|
    { 
 | 
						|
        namespace
 | 
						|
        {
 | 
						|
            const range_detail::regex_forwarder tokenized = 
 | 
						|
                    range_detail::regex_forwarder();
 | 
						|
        }
 | 
						|
        
 | 
						|
        template<class BidirectionalRange, class Regex, class Submatch, class Flag>
 | 
						|
        inline tokenized_range<BidirectionalRange>
 | 
						|
        tokenize(BidirectionalRange& rng, const Regex& reg, const Submatch& sub, Flag f)
 | 
						|
        {
 | 
						|
            return tokenized_range<BidirectionalRange>(rng, reg, sub, f);
 | 
						|
        }
 | 
						|
        
 | 
						|
        template<class BidirectionalRange, class Regex, class Submatch, class Flag>
 | 
						|
        inline tokenized_range<const BidirectionalRange>
 | 
						|
        tokenize(const BidirectionalRange& rng, const Regex& reg, const Submatch& sub, Flag f)
 | 
						|
        {
 | 
						|
            return tokenized_range<const BidirectionalRange>(rng, reg, sub, f);
 | 
						|
        }
 | 
						|
    } // 'adaptors'
 | 
						|
    
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |