5 #include <KrisLibrary/structs/array2d.h> 16 typedef map<IntPair>::iterator iterator;
17 typedef map<IntPair>::const_iterator const_iterator;
21 inline bool empty() {
return items.empty(); }
23 void expandRange(
const IntPair& index);
24 void insert(
const IntPair& index);
26 void insert(It first,It last);
27 void erase(iterator it);
28 void erase(
const IntPair& item);
30 void erase(It first,It last);
31 inline iterator begin() {
return items.begin(); }
32 inline const_iterator begin()
const {
return items.begin(); }
33 inline iterator end() {
return items.end(); }
34 inline const_iterator end()
const {
return items.end(); }
35 size_t size()
const {
return items.size(); }
37 iterator find(
const IntPair& item);
38 const_iterator find(
const IntPair& item)
const;
39 inline bool isRangeEmpty()
const {
return imax.a < imin.a; }
40 inline const IntPair& minimum()
const {
return imin; }
41 inline const IntPair& maximum()
const {
return imax; }
42 inline bool inRange(
const IntPair& item)
const {
return item.a >= imin.a && item.a <= imax.a && item.b >= imin.b && item.b <= imax.b; }
43 inline iterator cacheGet(
const IntPair& item)
const {
return contains(item.a-imin.a,item.b-imin.b); }
44 inline void cacheSet(
const IntPair& item,iterator it) { contains(item.a-imin.a,item.b-imin.b)=it; }
48 inline bool IsCacheBuilt()
const {
return hasContainmentCache; }
53 bool hasContainmentCache;
57 RangeMap2D::RangeMap2D()
58 :imin(1,1),imax(0,0),hasContainmentCache(
false)
61 void RangeMap2D::clear()
65 hasContainmentCache=
false;
70 void RangeMap2D::setRange(
const IntPair& _imin,
const IntPair& _imax)
73 Assert(_imin.a <= imin.a && _imin.b <= imin.b &&
74 _imax.a >= imax.a && _imax.b >= imax.b);
75 if(hasContainmentCache) {
76 FatalError(
"Already have cache set up");
82 void RangeMap2D::expandRange(
const IntPair& item)
88 if(hasContainmentCache) {
90 FatalError(
"RangeMap2D::expandRange(): error, item out of bounds");
93 if(item.a < imin.a) imin.a=item.a;
94 else if(item.a > imax.a) imax.a=item.a;
95 if(item.b < imin.b) imin.b=item.b;
96 else if(item.b > imax.b) imax.b=item.b;
100 void RangeMap2D::insert(
const IntPair& item)
102 if(hasContainmentCache) {
104 FatalError(
"RangeMap2D::insert(): error, item out of bounds");
105 iterator it=cacheGet(item);
107 iterator it=items.insert(item);
113 if(item.a < imin.a) imin.a=item.a;
114 else if(item.a > imax.a) imax.a=item.a;
115 if(item.b < imin.b) imin.b=item.b;
116 else if(item.b > imax.b) imax.b=item.b;
120 void RangeMap2D::erase(
const IntPair& item)
122 if(!inRange(item))
return;
123 if(hasContainmentCache) {
124 iterator it=cacheGet(item);
127 cacheSet(item,items.end());
131 items.erase(items.find(item));
135 int RangeMap2D::count(
const IntPair& item)
137 if(!inRange(item))
return 0;
138 if(hasContainmentCache) {
139 if(cacheGet(item)!=items.end())
return 1;
142 return items.count(item);
145 RangeMap2D::iterator RangeMap2D::find(
const IntPair& item)
147 if(!inRange(item))
return items.end();
148 if(hasContainmentCache)
149 return cacheGet(item);
151 return items.find(item);
154 RangeMap2D::const_iterator RangeMap2D::find(
const IntPair& item)
const 156 if(!inRange(item))
return items.end();
157 if(hasContainmentCache)
158 return cacheGet(item);
160 return items.find(item);
163 void RangeMap2D::BuildCache()
165 if(imax < imin)
return;
166 if(hasContainmentCache)
return;
167 contains.resize(imax.a-imin.a+1,imax.b-imin.b+1);
168 contains.set(items.end());
169 for(const_iterator i=items.begin();i!=items.end();i++)
171 hasContainmentCache =
true;
174 void RangeMap2D::ClearCache()
176 hasContainmentCache=
false;
A lightweight integer 2-tuple class.
Definition: IntPair.h:9
Definition: rayprimitives.h:132
Same as RangeSet2D but a map. O(1) find as well as count.
Definition: RangeMap2D.h:13