6 unsigned long start, end;
8 Mem_region() : start(0), end(0) {}
10 Mem_region(unsigned long start, unsigned long end) : start(start), end(end) {}
12 bool valid() const { return start < end; }
14 bool operator < (Mem_region const &o) const
15 { return end < o.start; }
17 bool overlaps(Mem_region const &o) const
18 { return !(o < *this || *this < o); }
20 bool contains(Mem_region const &o) const
21 { return start <= o.start && end >= o.end; }
23 void merge(Mem_region const &r)
25 start = start < r.start ? start : r.start;
26 end = end > r.end ? end : r.end;
29 unsigned long size() const
30 { return end - start + 1; }
35 class Mem_region_map_base
43 Mem_region_map_base(unsigned size) : _s(size), _l(0) {}
46 template< unsigned E >
47 class Mem_region_map : public Mem_region_map_base
51 Mem_region_map() : Mem_region_map_base(Entries) {}
54 Mem_region _r[Entries];
58 //--------------------------------------------------------------------------
63 Mem_region_map_base::del(unsigned start, unsigned end)
65 register unsigned delta = end - start;
66 for (unsigned p = start; p < end; ++p)
67 _r[p] = _r[p + delta];
72 PUBLIC inline NEEDS[Mem_region_map_base::del]
74 Mem_region_map_base::add(Mem_region const &r)
80 for (;pos < _l && _r[pos] < r; ++pos) ;
81 if (_l > pos && !(r < _r[pos]))
84 for (unsigned p = pos + 1; p < _l; ++p)
86 if (!(_r[pos] < _r[p]))
101 for (unsigned p = _l; p > pos; --p) _r[p] = _r[p-1];
108 PUBLIC inline NEEDS[Mem_region_map_base::del]
110 Mem_region_map_base::sub(Mem_region const &r)
116 for (pos = 0; pos < _l; ++pos)
118 if (_r[pos].overlaps(r))
120 if (r.contains(_r[pos]))
123 --pos; // ensure we do not skip the next element
125 else if (r.start <= _r[pos].start)
126 _r[pos].start = r.end + 1;
127 else if (r.end >= _r[pos].end)
128 _r[pos].end = r.start - 1;
134 for (unsigned p = _l; p > pos; --p) _r[p] = _r[p-1];
136 _r[pos+1].start = r.end + 1;
137 _r[pos+1].end = _r[pos].end;
138 _r[pos].end = r.start - 1;
148 Mem_region_map_base::length() const
154 Mem_region_map_base::capacity() const
159 Mem_region_map_base::operator [] (unsigned idx) const
164 Mem_region_map_base::operator [] (unsigned idx)