/*=============================================================================
    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
