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>
 |