128 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/*=============================================================================
							 | 
						||
| 
								 | 
							
								    Copyright (c) 2001-2003 Joel de Guzman
							 | 
						||
| 
								 | 
							
								    http://spirit.sourceforge.net/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Distributed under 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)
							 | 
						||
| 
								 | 
							
								=============================================================================*/
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_SPIRIT_RANGE_RUN_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_SPIRIT_RANGE_RUN_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								#include <vector>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/spirit/home/classic/namespace.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								namespace boost { namespace spirit { 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace utility { namespace impl {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ///////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //  range class
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //      Implements a closed range of values. This class is used in
							 | 
						||
| 
								 | 
							
								    //      the implementation of the range_run class.
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //      { Low level implementation detail }
							 | 
						||
| 
								 | 
							
								    //      { Not to be confused with BOOST_SPIRIT_CLASSIC_NS::range }
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    ///////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								    template <typename CharT>
							 | 
						||
| 
								 | 
							
								    struct range {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        range(CharT first, CharT last);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool            is_valid() const;
							 | 
						||
| 
								 | 
							
								        bool            includes(CharT v) const;
							 | 
						||
| 
								 | 
							
								        bool            includes(range const& r) const;
							 | 
						||
| 
								 | 
							
								        bool            overlaps(range const& r) const;
							 | 
						||
| 
								 | 
							
								        void            merge(range const& r);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        CharT first;
							 | 
						||
| 
								 | 
							
								        CharT last;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //////////////////////////////////
							 | 
						||
| 
								 | 
							
								    template <typename CharT>
							 | 
						||
| 
								 | 
							
								    struct range_char_compare {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool operator()(range<CharT> const& x, const CharT y) const
							 | 
						||
| 
								 | 
							
								        { return x.first < y; }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        bool operator()(const CharT x, range<CharT> const& y) const
							 | 
						||
| 
								 | 
							
								        { return x < y.first; }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        // This additional operator is required for the checked STL shipped
							 | 
						||
| 
								 | 
							
								        // with VC8 testing the ordering of the iterators passed to the
							 | 
						||
| 
								 | 
							
								        // std::lower_bound algo this range_char_compare<> predicate is passed
							 | 
						||
| 
								 | 
							
								        // to.
							 | 
						||
| 
								 | 
							
								        bool operator()(range<CharT> const& x, range<CharT> const& y) const
							 | 
						||
| 
								 | 
							
								        { return x.first < y.first; }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //////////////////////////////////
							 | 
						||
| 
								 | 
							
								    template <typename CharT>
							 | 
						||
| 
								 | 
							
								    struct range_compare {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool operator()(range<CharT> const& x, range<CharT> const& y) const
							 | 
						||
| 
								 | 
							
								        { return x.first < y.first; }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ///////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //  range_run
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //      An implementation of a sparse bit (boolean) set. The set uses
							 | 
						||
| 
								 | 
							
								    //      a sorted vector of disjoint ranges. This class implements the
							 | 
						||
| 
								 | 
							
								    //      bare minimum essentials from which the full range of set
							 | 
						||
| 
								 | 
							
								    //      operators can be implemented. The set is constructed from
							 | 
						||
| 
								 | 
							
								    //      ranges. Internally, adjacent or overlapping ranges are
							 | 
						||
| 
								 | 
							
								    //      coalesced.
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //      range_runs are very space-economical in situations where there
							 | 
						||
| 
								 | 
							
								    //      are lots of ranges and a few individual disjoint values.
							 | 
						||
| 
								 | 
							
								    //      Searching is O(log n) where n is the number of ranges.
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //      { Low level implementation detail }
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    ///////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								    template <typename CharT>
							 | 
						||
| 
								 | 
							
								    class range_run {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typedef range<CharT> range_t;
							 | 
						||
| 
								 | 
							
								        typedef std::vector<range_t> run_t;
							 | 
						||
| 
								 | 
							
								        typedef typename run_t::iterator iterator;
							 | 
						||
| 
								 | 
							
								        typedef typename run_t::const_iterator const_iterator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void            swap(range_run& rr);
							 | 
						||
| 
								 | 
							
								        bool            test(CharT v) const;
							 | 
						||
| 
								 | 
							
								        void            set(range_t const& r);
							 | 
						||
| 
								 | 
							
								        void            clear(range_t const& r);
							 | 
						||
| 
								 | 
							
								        void            clear();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        const_iterator  begin() const;
							 | 
						||
| 
								 | 
							
								        const_iterator  end() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void            merge(iterator iter, range_t const& r);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        run_t run;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								BOOST_SPIRIT_CLASSIC_NAMESPACE_END
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}} // namespace BOOST_SPIRIT_CLASSIC_NS::utility::impl
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/spirit/home/classic/utility/impl/chset/range_run.ipp>
							 |