/*============================================================================= | |
Copyright (c) 2001-2011 Joel de Guzman | |
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) | |
==============================================================================*/ | |
#if !defined(BOOST_SPIRIT_RANGE_RUN_MAY_16_2006_0801_PM) | |
#define BOOST_SPIRIT_RANGE_RUN_MAY_16_2006_0801_PM | |
#if defined(_MSC_VER) | |
#pragma once | |
#endif | |
#include <boost/spirit/home/support/char_set/range.hpp> | |
#include <vector> | |
namespace boost { namespace spirit { namespace support { namespace detail | |
{ | |
/////////////////////////////////////////////////////////////////////////// | |
// 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 interface } | |
/////////////////////////////////////////////////////////////////////////// | |
template <typename Char> | |
class range_run | |
{ | |
public: | |
typedef range<Char> range_type; | |
typedef std::vector<range_type> storage_type; | |
void swap(range_run& other); | |
bool test(Char v) const; | |
void set(range_type const& range); | |
void clear(range_type const& range); | |
void clear(); | |
private: | |
storage_type run; | |
}; | |
}}}} | |
#include <boost/spirit/home/support/char_set/range_run_impl.hpp> | |
#endif |