51 using Range = std::pair<unsigned, unsigned>;
57 RangeMask(
unsigned _begin,
unsigned _end): m_all(_begin, _end) {}
69 for (
auto i = m_ranges.begin(); i != m_ranges.end() && _items; ++i)
70 _items -= (ret.m_ranges[i->first] = std::min(i->first + _items, i->second)) - i->first;
81 unsigned last = m_all.first;
82 for (
auto i: m_ranges)
85 ret.m_ranges[last] = i.first;
88 if (last != m_all.second)
89 ret.m_ranges[last] = m_all.second;
97 template <
class S>
RangeMask operator-(S
const& _m)
const {
auto ret = *
this;
return ret -= _m; }
104 m_all.first = std::min(_m.m_all.first, m_all.first);
105 m_all.second = std::max(_m.m_all.second, m_all.second);
106 for (
auto const& i: _m.m_ranges)
125 auto it = m_ranges.upper_bound(_i);
126 if (it == m_ranges.begin())
128 return (--it)->second > _i;
133 return m_ranges.empty();
138 return m_all.first == m_all.second || (m_ranges.size() == 1 && m_ranges.begin()->first == m_all.first && m_ranges.begin()->second == m_all.second);
149 m_all = std::make_pair(0, 0);
153 std::pair<unsigned, unsigned>
const&
all()
const {
return m_all; }
155 void extendAll(
unsigned _i) { m_all = std::make_pair(std::min(m_all.first, _i), std::max(m_all.second, _i + 1)); }
176 unsigned m_value = 0;
183 unsigned next(
unsigned _t)
const
187 auto uit = m_ranges.upper_bound(_t);
188 auto it = uit == m_ranges.begin() ? m_ranges.end() : std::prev(uit);
189 if (it != m_ranges.end() && it->first <= _t && it->second > _t)
191 return uit == m_ranges.end() ? m_all.second : uit->first;
198 for (
auto const& r: this->m_ranges)
199 c += r.second - r.first;
205 if (m_ranges.empty() || !m_ranges.count(m_all.first))
207 return m_ranges.at(m_all.first);
212 if (m_ranges.empty())
214 return m_ranges.rbegin()->second - 1;
221 std::map<unsigned, unsigned> m_ranges;
226 _out << _r.m_all.first <<
"{ ";
227 for (
auto const& i: _r.m_ranges)
228 _out <<
"[" << i.first <<
", " << i.second <<
") ";
229 _out <<
"}" << _r.m_all.second;
235 for (
auto i = _m.first; i < _m.second;)
237 assert(i >= m_all.first);
238 assert(i < m_all.second);
241 auto rangeAfter = m_ranges.upper_bound(i);
243 auto it = rangeAfter == m_ranges.begin() ? m_ranges.end() : std::prev(rangeAfter);
244 if (it == m_ranges.end() || it->second < i)
250 if (rangeAfter == m_ranges.end() || rangeAfter->first > _m.second)
253 m_ranges[i] = _m.second;
258 if (rangeAfter->first == i)
260 i = rangeAfter->second;
265 i = m_ranges[i] = rangeAfter->second;
266 m_ranges.erase(rangeAfter);
270 else if (it->second == i)
274 if (rangeAfter == m_ranges.end() || rangeAfter->first > _m.second)
277 m_ranges[it->first] = _m.second;
283 i = m_ranges[it->first] = rangeAfter->second;
284 m_ranges.erase(rangeAfter);