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