5 #ifndef HOBBES_UTIL_RMAP_HPP_INCLUDED 6 #define HOBBES_UTIL_RMAP_HPP_INCLUDED 16 template <
typename K,
typename V,
typename Ord>
25 if (this->
rs.size() != this->
vs.size()) {
26 out <<
"INVALID (" << this->
rs.size() <<
" != " << this->
vs.size() <<
")";
27 }
else if (this->
rs.size() > 0) {
28 out <<
"'" << this->
rs[0].first <<
"-" << this->
rs[0].second <<
"' => " << this->
vs[0];
29 for (
size_t i = 1; i < this->
rs.size(); ++i) {
30 out <<
", '" << this->
rs[i].first <<
"-" << this->
rs[i].second <<
"' => " << this->
vs[i];
39 if (i < this->
vs.size()) {
48 size_t i =
find(kr.first);
49 size_t j =
find(kr.second);
51 if (i == j && i < this->
vs.size()) {
60 void insert(
const range& rr,
const V& v) {
61 for (
size_t i = 0; i < this->
rs.size(); ++i) {
62 range& lr = this->
rs[i];
77 lr.second = rr.second;
87 lr.second = Ord::pred(rr.first);
97 range er(
Ord::succ(rr.second), lr.second);
98 lr.second = Ord::pred(rr.first);
107 lr.second = rr.second;
114 lr.second = Ord::pred(rr.first);
129 this->
rs.push_back(rr);
130 this->
vs.push_back(v);
133 void insert(
const K& k0,
const K& k1,
const V& v) {
137 void mergeRange(range rr,
const std::function<
void(V&)>& f) {
138 for (
size_t i = 0; i < this->
rs.size(); ++i) {
139 range& lr = this->
rs[i];
158 range er(
Ord::succ(rr.second), lr.second);
161 lr.second = rr.second;
168 lr.second = Ord::pred(rr.first);
174 insAt(i,
range(rr.first, Ord::pred(lr.first)), V());
180 range er(
Ord::succ(rr.second), lr.second);
181 lr.second = Ord::pred(rr.first);
191 range nr(
Ord::succ(lr.second), rr.second);
192 insAt(i,
range(rr.first, Ord::pred(lr.first)), V());
199 range mr(rr.first, lr.second);
200 range er(
Ord::succ(lr.second), rr.second);
201 lr.second = Ord::pred(rr.first);
208 range br(rr.first, Ord::pred(lr.first));
209 range er(
Ord::succ(rr.second), lr.second);
212 lr.second = rr.second;
226 this->
rs.push_back(rr);
227 this->
vs.resize(this->
vs.size()+1);
232 void mergeRange(
const K& k0,
const K& k1,
const std::function<
void(V&)>& f) {
236 void keys(std::set<K>* ks)
const {
237 for (
const auto&
r : this->
rs) {
238 Ord::copyRange(
r.first,
r.second, ks);
242 typedef std::vector<std::pair<range, V>>
Mapping;
245 for (
size_t i = 0; i < this->
rs.size(); ++i) {
246 r.push_back(std::make_pair(this->
rs[i], this->
vs[i]));
252 ranges lrs = this->
rs;
257 while (i < lrs.size() && j < rrs.size()) {
286 r.push_back(
range(lr.first, rr.first));
287 if (Ord::lt(rr.first, rr.second)) {
294 r.push_back(
range(rr.first, lr.first));
295 if (Ord::lt(lr.first, lr.second)) {
302 r.push_back(
range(lr.first, Ord::pred(rr.first)));
303 r.push_back(
range(rr.first, rr.second));
308 r.push_back(
range(rr.first, Ord::pred(lr.first)));
309 r.push_back(
range(lr.first, lr.second));
314 r.push_back(
range(lr.first, Ord::pred(rr.first)));
315 r.push_back(
range(rr.first, Ord::pred(lr.second)));
317 rr.first = lr.second;
320 r.push_back(
range(rr.first, lr.first-1));
321 r.push_back(
range(lr.first, rr.second-1));
323 lr.first = rr.second;
329 for (; i < lrs.size(); ++i) r.push_back(lrs[i]);
330 for (; j < rrs.size(); ++j) r.push_back(rrs[j]);
338 if (this->
rs.size() >= 2) {
340 while (i < this->
rs.size()-1) {
341 range& tr = this->
rs[i];
342 range& nr = this->
rs[i+1];
344 if (tr.second == Ord::pred(nr.first) && this->
vs[i] == this->
vs[i+1]) {
345 tr.second = nr.second;
346 this->
rs.erase(this->
rs.begin()+i+1);
347 this->
vs.erase(this->
vs.begin()+i+1);
361 for (
const auto&
r : rs) {
362 if (
r.first !=
r.second && !(Ord::lt(
r.first,
r.second))) {
370 size_t find(
const K& k)
const {
371 for (
size_t i = 0; i < this->rs.size(); ++i) {
372 const range&
r = this->rs[i];
374 if (k == r.first || k == r.second || (Ord::lt(r.first, k) && Ord::lt(k, r.second))) {
376 }
else if (Ord::lt(k, r.first)) {
380 return this->vs.size();
383 void insAt(
size_t i,
const range&
r,
const V& v) {
384 this->rs.insert(this->rs.begin() + i,
r);
385 this->vs.insert(this->vs.begin() + i, v);
409 if (Ord::lt(lr.second, rr.first)) {
411 }
else if (Ord::lt(rr.second, lr.first)) {
413 }
else if (lr.first == rr.first) {
414 if (lr.second == rr.second) {
416 }
else if (Ord::lt(lr.second, rr.second)) {
421 }
else if (lr.second == rr.second) {
422 if (Ord::lt(lr.first, rr.first)) {
427 }
else if (Ord::lt(lr.first, rr.first) && Ord::lt(rr.second, lr.second)) {
429 }
else if (Ord::lt(rr.first, lr.first) && Ord::lt(lr.second, rr.second)) {
431 }
else if (Ord::lt(rr.first, lr.first) && Ord::lt(rr.second, lr.second)) {
440 while (i < this->rs.size()) {
441 range& lr = this->rs[i];
450 this->rs.erase(this->rs.begin()+i);
451 this->vs.erase(this->vs.begin()+i);
454 this->rs.erase(this->rs.begin()+i);
455 this->vs.erase(this->vs.begin()+i);
461 lr.second = Ord::pred(rr.first);
464 this->rs.erase(this->rs.begin()+i);
465 this->vs.erase(this->vs.begin()+i);
468 range er(
Ord::succ(rr.second), lr.second);
469 lr.second = Ord::pred(rr.first);
470 this->rs.insert(this->rs.begin()+i+1, er);
471 this->vs.insert(this->vs.begin()+i+1, this->vs[i]);
475 this->rs.erase(this->rs.begin()+i);
476 this->vs.erase(this->vs.begin()+i);
479 lr.second = Ord::pred(rr.first);
std::vector< range > ranges
Definition: rmap.H:20
Mapping mapping() const
Definition: rmap.H:243
std::pair< K, K > range
Definition: rmap.H:19
RangeIntersection
Definition: rmap.H:391
void show(std::ostream &out) const
Definition: rmap.H:23
void insAt(size_t i, const range &r, const V &v)
Definition: rmap.H:383
ranges rs
Definition: rmap.H:357
void mergeRange(const K &k0, const K &k1, const std::function< void(V &)> &f)
Definition: rmap.H:232
std::vector< std::pair< range, V > > Mapping
Definition: rmap.H:242
void keys(std::set< K > *ks) const
Definition: rmap.H:236
void insert(const range &rr, const V &v)
Definition: rmap.H:60
item succ(const item &i)
Definition: lalr.C:279
ranges disjointRanges(const ranges &trs) const
Definition: rmap.H:251
const V * lookupRangeSubset(const range &kr) const
Definition: rmap.H:47
bool rangesValid() const
Definition: rmap.H:368
const V * lookup(const K &k) const
Definition: rmap.H:37
void mergeRange(range rr, const std::function< void(V &)> &f)
Definition: rmap.H:137
size_t find(const K &k) const
Definition: rmap.H:370
void compact()
Definition: rmap.H:337
size_t r(const reader::MetaData &md, size_t o, T *t)
Definition: storage.H:1730
values vs
Definition: rmap.H:358
#define out
Definition: netio.H:19
std::vector< V > values
Definition: rmap.H:356
void insert(const K &k0, const K &k1, const V &v)
Definition: rmap.H:133
static bool rangesValid(const ranges &rs)
Definition: rmap.H:360
void deleteFrom(size_t i, const range &rr)
Definition: rmap.H:439
static RangeIntersection classifyIntersection(const range &lr, const range &rr)
Definition: rmap.H:408