1 /*============================================================================= 2 Copyright (c) 2001-2011 Joel de Guzman 3 4 Distributed under the Boost Software License, Version 1.0. (See accompanying 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 ==============================================================================*/ 7 #if !defined(BOOST_SPIRIT_RANGE_RUN_MAY_16_2006_0801_PM) 8 #define BOOST_SPIRIT_RANGE_RUN_MAY_16_2006_0801_PM 9 10 #if defined(_MSC_VER) 11 #pragma once 12 #endif 13 14 #include <boost/spirit/home/support/char_set/range.hpp> 15 #include <vector> 16 17 namespace boost { namespace spirit { namespace support { namespace detail 18 { 19 /////////////////////////////////////////////////////////////////////////// 20 // range_run 21 // 22 // An implementation of a sparse bit (boolean) set. The set uses 23 // a sorted vector of disjoint ranges. This class implements the 24 // bare minimum essentials from which the full range of set 25 // operators can be implemented. The set is constructed from 26 // ranges. Internally, adjacent or overlapping ranges are 27 // coalesced. 28 // 29 // range_runs are very space-economical in situations where there 30 // are lots of ranges and a few individual disjoint values. 31 // Searching is O(log n) where n is the number of ranges. 32 // 33 // { Low level interface } 34 /////////////////////////////////////////////////////////////////////////// 35 template <typename Char> 36 class range_run 37 { 38 public: 39 40 typedef range<Char> range_type; 41 typedef std::vector<range_type> storage_type; 42 43 void swap(range_run& other); 44 bool test(Char v) const; 45 void set(range_type const& range); 46 void clear(range_type const& range); 47 void clear(); 48 49 private: 50 51 storage_type run; 52 }; 53 }}}} 54 55 #include <boost/spirit/home/support/char_set/range_run_impl.hpp> 56 #endif 57