91 #include "partitionSafety.hpp"
94 #define __PRETTY_FUNCTION__ ""
105 inline void partitionThrow(
const char* func,
const char* file,
int line,
const char* msg) {
106 std::ostringstream oss;
108 "PartitionException: " << msg <<
"\n" <<
110 " thrown from function: " << func <<
"\n" <<
112 " in file: " << file <<
"\n" <<
113 " at line: " << line <<
"\n";
117 template<
typename M,
typename V>
120 template<
typename M,
typename V>
171 template<
typename InputIterator>
Domain(
172 InputIterator first, InputIterator last,
int min = 0);
192 void addEntry(
int id,
const M& member = M());
195 void resize(
int newSize,
int newMin);
215 Node(
int id,
const M& member);
216 Node(
Group<M,V>* group, Node* prev, Node* next,
int id);
217 Node(
Group<M,V>* group, Node* prev, Node* next,
int id,
221 void _transform(
int newHigh,
int newLow,
int newSize,
int newMin);
222 void _initNodeArray(Node* newNode,
int newLow,
int newSize,
int newMin);
223 const Node* _getNode(
int id)
const;
224 Node* _getNode(
int id);
225 void _verifySize (
const char* func,
const char* file,
int line,
int size)
const;
226 void _verifyRange (
const char* func,
const char* file,
int line,
int id)
const;
227 void _verifyHighLow(
const char* func,
const char* file,
int line,
int high,
int low)
const;
228 void _verifyInGroup(
const char* func,
const char* file,
int line,
const Node* n)
const;
230 friend class Group<M,V>;
231 friend class Group<M,V>::Iterator;
232 friend class
Group<M,V>::ConstIterator;
236 template<typename M, typename V>
241 public:
class Iterator;
242 public:
class ConstIterator;
261 template<
typename InputIterator>
Group(
263 const InputIterator& first,
264 const InputIterator& last);
278 void setValue(
const V& v);
281 bool contains(
int id)
const;
286 const Entry& peekFront()
const;
288 const Entry& peekBack()
const;
292 void addFront(
int id);
293 void addBack(
int id);
294 void addFront(
Group& g);
295 void addBack(
Group& g);
300 Entry& removeFront();
302 Entry&
remove(
int id);
308 ConstIterator front()
const;
310 ConstIterator back()
const;
311 Iterator beforeFront();
312 ConstIterator beforeFront()
const;
313 Iterator afterBack();
314 ConstIterator afterBack()
const;
315 Iterator find(
int id);
316 ConstIterator find(
int id)
const;
319 ConstIterator begin()
const;
321 ConstIterator end()
const;
325 void _addAfter(Node* n1, Node* n2);
326 Node* _remove(Node* node);
327 void _verifyDomain (
const char* func,
const char* file,
int line)
const;
328 void _verifySameDomain (
const char* func,
const char* file,
int line,
const Group<M,V>& g)
const;
329 void _verifyDiffDomain (
const char* func,
const char* file,
int line,
const Group<M,V>& g)
const;
330 void _verifyNotEmpty (
const char* func,
const char* file,
int line)
const;
331 void _verifyInGroup (
const char* func,
const char* file,
int line,
const Node* n)
const;
355 bool isBeforeFront()
const;
356 bool isAfterBack()
const;
357 bool isAtFront()
const;
358 bool isAtBack()
const;
359 Entry& operator*()
const;
360 Entry* operator->()
const;
361 Group* getContainer()
const;
362 bool operator==(
const Iterator& i)
const;
364 bool operator!=(
const Iterator& i)
const;
366 void addBefore(
int id)
const;
367 void addAfter(
int id)
const;
368 Entry& removeAndInc();
369 Entry& removeAndDec();
374 void _verifyGroup(
const char* func,
const char* file,
int line)
const;
375 void _verifyNotAtEnd(
const char* func,
const char* file,
int line)
const;
376 void _verifyCompare(
const char* func,
const char* file,
int line,
const Iterator& i)
const;
377 void _verifyCompare(
const char* func,
const char* file,
int line,
const ConstIterator& i)
const;
399 bool isBeforeFront()
const;
400 bool isAfterBack()
const;
401 bool isAtFront()
const;
402 bool isAtBack()
const;
403 const Entry& operator*()
const;
404 const Entry* operator->()
const;
405 const Group* getContainer()
const;
406 bool operator==(
const Iterator& i)
const;
408 bool operator!=(
const Iterator& i)
const;
414 void _verifyGroup(
const char* func,
const char* file,
int line)
const;
415 void _verifyNotAtEnd(
const char* func,
const char* file,
int line)
const;
416 void _verifyCompare(
const char* func,
const char* file,
int line,
const Iterator& i)
const;
417 void _verifyCompare(
const char* func,
const char* file,
int line,
const ConstIterator& i)
const;
423 #define PARTITION_VERIFY_SIZE(size) _verifySize (__PRETTY_FUNCTION__, __FILE__, __LINE__, size )
424 #define PARTITION_VERIFY_RANGE(id) _verifyRange (__PRETTY_FUNCTION__, __FILE__, __LINE__, id )
425 #define PARTITION_VERIFY_HIGH_LOW(high, low) _verifyHighLow (__PRETTY_FUNCTION__, __FILE__, __LINE__, high, low)
426 #define PARTITION_VERIFY_DOMAIN() _verifyDomain (__PRETTY_FUNCTION__, __FILE__, __LINE__ )
427 #define PARTITION_VERIFY_SAME_DOMAIN(group) _verifySameDomain (__PRETTY_FUNCTION__, __FILE__, __LINE__, group )
428 #define PARTITION_VERIFY_DIFF_DOMAIN(group) _verifyDiffDomain (__PRETTY_FUNCTION__, __FILE__, __LINE__, group )
429 #define PARTITION_VERIFY_NOT_EMPTY() _verifyNotEmpty (__PRETTY_FUNCTION__, __FILE__, __LINE__ )
430 #define PARTITION_VERIFY_IN_GROUP(node) _verifyInGroup (__PRETTY_FUNCTION__, __FILE__, __LINE__, node )
431 #define PARTITION_VERIFY_GROUP() _verifyGroup (__PRETTY_FUNCTION__, __FILE__, __LINE__ )
432 #define PARTITION_VERIFY_NOT_AT_END() _verifyNotAtEnd (__PRETTY_FUNCTION__, __FILE__, __LINE__ )
433 #define PARTITION_VERIFY_COMPARE(i) _verifyCompare (__PRETTY_FUNCTION__, __FILE__, __LINE__, i )
454 : runtime_error(what_arg)
467 template<
typename M,
typename V>
475 template<
typename M,
typename V>
528 template<
typename M,
typename V>
536 PARTITION_SAFETY_DOMAIN_CONSTRUCTOR(PARTITION_VERIFY_SIZE(size));
537 _transform(min + size, min, size, min);
544 template<
typename M,
typename V>
546 : _high(d.min() + d.size()),
551 _node =
static_cast<Node*
>(::operator
new (
sizeof(Node) * _size)) - _low;
552 Node* n = _node + _min;
553 const Node* s = d._getNode(_min);
554 for(
int i = _min; i < _min + _size; ++i)
555 new (n++) Node(i, (s++)->_entry.member);
563 template<
typename M,
typename V>
template<
typename InputIterator>
572 for(InputIterator i = first; i != last; ++i)
580 template<
typename M,
typename V>
585 ::operator
delete (_node + _low);
590 template<
typename M,
typename V>
598 template<
typename M,
typename V>
615 template<
typename M,
typename V>
618 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
619 return _getNode(
id)->_group;
633 template<
typename M,
typename V>
636 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
637 return _getNode(
id)->_group;
652 template<
typename M,
typename V>
655 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
656 Node* n = _getNode(
id);
657 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_IN_GROUP(n));
658 return n->_group->_value;
673 template<
typename M,
typename V>
676 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
677 const Node* n = _getNode(
id);
678 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_IN_GROUP(n));
679 return n->_group->_value;
694 template<
typename M,
typename V>
697 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
698 return _getNode(
id)->_entry.member;
713 template<
typename M,
typename V>
716 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
717 return _getNode(
id)->_entry.member;
733 template<
typename M,
typename V>
736 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
737 _getNode(
id)->_entry.member = m;
752 template<
typename M,
typename V>
755 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
756 return _getNode(
id)->_entry;
771 template<
typename M,
typename V>
774 PARTITION_SAFETY_DOMAIN_ACCESSOR(PARTITION_VERIFY_RANGE(
id));
775 return _getNode(
id)->_entry;
783 template<
typename M,
typename V>
816 _transform(
id+1,
id, 0,
id);
817 else if(
id < _min - 1 ||
id < _low)
818 _transform(_high,
id, (_min + _size) - (
id + 1),
id + 1);
819 else if(
id > _min + _size ||
id >= _high)
820 _transform(
id+1, _low,
id - _min, _min);
821 if(
id >= _min &&
id < _min + _size)
822 _node[id]._entry.member = member;
825 new (_node + id) Node(
id, member);
834 template<
typename M,
typename V>
837 resize(newSize, _min);
862 template<
typename M,
typename V>
865 PARTITION_SAFETY_DOMAIN_MEMORY(PARTITION_VERIFY_SIZE(newSize));
866 _transform(newMin + newSize, newMin, newSize, newMin);
872 template<
typename M,
typename V>
881 template<
typename M,
typename V>
889 template<
typename M,
typename V>
897 template<
typename M,
typename V>
904 _transform(newHigh, _low, _size, _min);
921 template<
typename M,
typename V>
924 PARTITION_SAFETY_DOMAIN_MEMORY(PARTITION_VERIFY_HIGH_LOW(newHigh, newLow));
925 _transform(newHigh, newLow, _size, _min);
932 template<
typename M,
typename V>
935 if(capacity() == size())
938 int newHigh = _min + _size;
940 int newCapacity = newHigh - newLow;
941 Node* newNode =
static_cast<Node*
> (::operator
new (
sizeof(Node) * newCapacity)) - newLow;
942 _initNodeArray(newNode, newLow, _size, _min);
944 ::operator
delete (_node + _low);
958 template<
typename M,
typename V>
966 if(newLow < _low || newHigh > _high)
968 int growHigh = newHigh <= _high ? 0 : std::max(capacity(), newHigh - _high);
969 int growLow = newLow >= _low ? 0 : std::max(capacity(), _low - newLow);
970 newHigh = _high + growHigh;
971 newLow = _low - growLow;
972 int newCapacity = newHigh - newLow;
973 Node* newNode =
static_cast<Node*
> (::operator
new (
sizeof(Node) * newCapacity)) - newLow;
974 _initNodeArray(newNode, newLow, newSize, newMin);
976 ::operator
delete (_node + _low);
982 _initNodeArray(_node, _low, newSize, newMin);
1006 template<
typename M,
typename V>
1007 inline void Domain<M,V>::_initNodeArray(
1008 Node* newNode,
int newLow,
int newSize,
int newMin)
1019 if(_min + _size > newMin + newSize)
1021 int limit = std::max(_min, newMin + newSize);
1022 for(
int i = _min + _size - 1; i >= limit; --i)
1024 Node* n = _node + i;
1026 n->_group->_remove(n);
1037 for(
int i = std::min(_min + _size, newMin) - 1; i >= _min; --i)
1039 Node* n = _node + i;
1041 n->_group->_remove(n);
1051 int limit = std::min(newMin + newSize, _min);
1052 for(
int i = newMin; i < limit; ++i)
1053 new (newNode + i) Node(i);
1059 if(newNode != _node)
1061 int limit = std::min(_min + _size, newMin + newSize);
1062 for(
int i = std::max(_min, newMin); i < limit; ++i)
1064 Node* src = _node + i;
1065 Node* dest = newNode + i;
1068 !src->_group ? NULL : src->_prev == &src->_group->_end ? src->_prev : dest + (src->_prev - src),
1069 !src->_group ? NULL : src->_next == &src->_group->_end ? src->_next : dest + (src->_next - src),
1071 src->_entry.member);
1077 if(src->_group && src->_group->_end._next == src)
1079 src->_group->_end._next = dest;
1080 src->_group->_end._prev = dest + (src->_group->_end._prev - src);
1089 if(newMin + newSize > _min + _size)
1091 int limit = newMin + newSize;
1092 for(
int i = std::max(newMin, _min + _size); i < limit; ++i)
1093 new (newNode + i) Node(i);
1100 if(_min + _size > newMin + newSize)
1102 int limit = std::max(_min, newMin + newSize);
1103 for(
int i = _min + _size - 1; i >= limit; --i)
1104 (_node + i)->~Node();
1110 if(newNode != _node)
1112 int limit = std::max(_min, newMin);
1113 for(
int i = std::min(_min + _size, newMin + newSize) - 1; i >= limit; --i)
1114 (_node + i)->~Node();
1124 for(
int i = std::min(_min + _size, newMin) - 1; i >= _min; --i)
1125 (_node + i)->~Node();
1135 template<
typename M,
typename V>
1136 inline const typename Domain<M,V>::Node* Domain<M,V>::_getNode(
int id)
const
1141 template<
typename M,
typename V>
1142 inline typename Domain<M,V>::Node* Domain<M,V>::_getNode(
int id)
1147 template<
typename M,
typename V>
1148 inline void Domain<M,V>::_verifySize(
const char* func,
const char* file,
int line,
int size)
const
1151 partitionThrow(func, file, line,
"Domain size cannot be negative.");
1154 template<
typename M,
typename V>
1155 inline void Domain<M,V>::_verifyRange(
const char* func,
const char* file,
int line,
int id)
const
1157 if(id < _min || id >= _min + _size)
1158 partitionThrow(func, file, line,
"id is out of Domain range.");
1161 template<
typename M,
typename V>
1162 inline void Domain<M,V>::_verifyHighLow(
const char* func,
const char* file,
int line,
int high,
int low)
const
1165 partitionThrow(func, file, line,
"Attempt to reserve Domain memory with low id greater than high id.");
1168 template<
typename M,
typename V>
1169 inline void Domain<M,V>::_verifyInGroup(
const char* func,
const char* file,
int line,
const Node* n)
const
1171 if(n->_group == NULL)
1172 partitionThrow(func, file, line,
"id is not in a Group.");
1179 template<
typename M,
typename V>
1180 inline Domain<M,V>::Node::Node(
int id)
1182 #if PARTITION_SL >= PARTITION_ST_DEBUG
1190 template<
typename M,
typename V>
1191 inline Domain<M,V>::Node::Node(
int id,
const M& member)
1193 #if PARTITION_SL >= PARTITION_ST_DEBUG
1201 template<
typename M,
typename V>
1202 inline Domain<M,V>::Node::Node(Group<M,V>* group, Node* prev, Node* next,
int id)
1210 template<
typename M,
typename V>
1211 inline Domain<M,V>::Node::Node(Group<M,V>* group, Node* prev, Node* next,
int id,
const M& member)
1257 template<
typename M,
typename V>
1260 _end(this, &_end, &_end, 0x80000000),
1268 template<
typename M,
typename V>
1271 _end(this, &_end, &_end, 0x80000000),
1279 template<
typename M,
typename V>
1282 _end(this, &_end, &_end, 0x80000000),
1300 template<
typename M,
typename V>
1303 _end(this, &_end, &_end, 0x80000000),
1305 _value(g.getValue())
1307 PARTITION_SAFETY_GROUP_CONSTRUCTOR(PARTITION_VERIFY_DIFF_DOMAIN(g));
1324 template<
typename M,
typename V>
template<
typename InputIterator>
1327 const InputIterator& first,
1328 const InputIterator& last)
1331 _end(this, &_end, &_end, 0x80000000),
1334 for(InputIterator i = first; i != last; ++i)
1340 template<
typename M,
typename V>
1349 template<
typename M,
typename V>
1358 template<
typename M,
typename V>
1369 template<
typename M,
typename V>
1381 template<
typename M,
typename V>
1390 template<
typename M,
typename V>
1398 template<
typename M,
typename V>
1406 template<
typename M,
typename V>
1425 template<
typename M,
typename V>
1428 PARTITION_SAFETY_GROUP_ACCESSOR(PARTITION_VERIFY_DOMAIN());
1429 PARTITION_SAFETY_GROUP_ACCESSOR(_domain->PARTITION_VERIFY_RANGE(
id));
1430 return _domain->_getNode(
id)->_group ==
this;
1443 template<
typename M,
typename V>
1446 PARTITION_SAFETY_GROUP_ACCESSOR(PARTITION_VERIFY_NOT_EMPTY());
1447 return _end._next->_entry;
1460 template<
typename M,
typename V>
1463 PARTITION_SAFETY_GROUP_ACCESSOR(PARTITION_VERIFY_NOT_EMPTY());
1464 return _end._next->_entry;
1477 template<
typename M,
typename V>
1480 PARTITION_SAFETY_GROUP_ACCESSOR(PARTITION_VERIFY_NOT_EMPTY());
1481 return _end._prev->_entry;
1494 template<
typename M,
typename V>
1497 PARTITION_SAFETY_GROUP_ACCESSOR(PARTITION_VERIFY_NOT_EMPTY());
1498 return _end._prev->_entry;
1515 template<
typename M,
typename V>
1518 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_DOMAIN());
1519 PARTITION_SAFETY_GROUP_ADD(_domain->PARTITION_VERIFY_RANGE(
id));
1520 _addAfter(&_end, _domain->_getNode(
id));
1537 template<
typename M,
typename V>
1540 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_DOMAIN());
1541 PARTITION_SAFETY_GROUP_ADD(_domain->PARTITION_VERIFY_RANGE(
id));
1542 _addAfter(_end._prev, _domain->_getNode(
id));
1558 template<
typename M,
typename V>
1564 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_DOMAIN());
1565 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_SAME_DOMAIN(g));
1573 Node * nb = g._end._next;
1574 Node * nc = g._end._prev;
1575 Node * nd = _end._next;
1582 g._end._next = &g._end;
1583 g._end._prev = &g._end;
1589 while(!(--i).isBeforeFront())
1590 i._node->_group =
this;
1606 template<
typename M,
typename V>
1615 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_DOMAIN());
1616 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_SAME_DOMAIN(g));
1620 Node * na = _end._prev;
1621 Node * nb = g._end._next;
1622 Node * nc = g._end._prev;
1630 g._end._next = &g._end;
1631 g._end._prev = &g._end;
1638 while(!(++i).isAfterBack())
1639 i._node->_group =
this;
1656 template<
typename M,
typename V>
1659 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_DOMAIN());
1660 int begin = _domain->min();
1661 int end = _domain->min() + _domain->size();
1662 for(
int id = begin;
id < end; ++id)
1678 template<
typename M,
typename V>
1681 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_NOT_EMPTY());
1682 return _remove(_end._next)->_entry;
1697 template<
typename M,
typename V>
1700 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_NOT_EMPTY());
1701 return _remove(_end._prev)->_entry;
1717 template<
typename M,
typename V>
1720 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_DOMAIN());
1721 PARTITION_SAFETY_GROUP_REMOVE(_domain->PARTITION_VERIFY_RANGE(
id));
1722 Node* n = _domain->_getNode(
id);
1723 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_IN_GROUP(n));
1732 template<
typename M,
typename V>
1742 Node* n = _end._next;
1748 #if PARTITION_SL >= PARTITION_ST_DEBUG
1763 template<
typename M,
typename V>
1773 template<
typename M,
typename V>
1783 template<
typename M,
typename V>
1793 template<
typename M,
typename V>
1802 template<
typename M,
typename V>
1811 template<
typename M,
typename V>
1820 template<
typename M,
typename V>
1829 template<
typename M,
typename V>
1837 template<
typename M,
typename V>
1845 template<
typename M,
typename V>
1853 template<
typename M,
typename V>
1861 template<
typename M,
typename V>
1881 template<
typename M,
typename V>
1884 PARTITION_SAFETY_GROUP_ACCESSOR(PARTITION_VERIFY_DOMAIN());
1885 PARTITION_SAFETY_GROUP_ACCESSOR(_domain->PARTITION_VERIFY_RANGE(
id));
1886 Node* n = _domain->_getNode(
id);
1887 return Iterator(
this, n->_group ==
this ? n : &_end);
1904 template<
typename M,
typename V>
1907 PARTITION_SAFETY_GROUP_ACCESSOR(PARTITION_VERIFY_DOMAIN());
1908 PARTITION_SAFETY_GROUP_ACCESSOR(_domain->PARTITION_VERIFY_RANGE(
id));
1909 const Node* n = _domain->_getNode(
id);
1913 template<
typename M,
typename V>
1916 Node* n3 = n1->_next;
1917 if(n2 == n1 || n2 == n3)
1920 n2->_group->_remove(n2);
1929 template<
typename M,
typename V>
1930 inline typename Domain<M,V>::Node* Group<M,V>::_remove(Node* node)
1932 node->_prev->_next = node->_next;
1933 node->_next->_prev = node->_prev;
1935 node->_group = NULL;
1936 #if PARTITION_SL >= PARTITION_ST_DEBUG
1943 template<
typename M,
typename V>
1944 inline void Group<M,V>::_verifyDomain(
const char* func,
const char* file,
int line)
const
1947 partitionThrow(func, file, line,
"Group is not associated with a Domain.");
1950 template<
typename M,
typename V>
1951 inline void Group<M,V>::_verifySameDomain(
const char* func,
const char* file,
int line,
const Group<M,V>& g)
const
1953 if(_domain != g._domain)
1954 partitionThrow(func, file, line,
"given Group is associated with a different Domain than this Group.");
1957 template<
typename M,
typename V>
1958 inline void Group<M,V>::_verifyDiffDomain(
const char* func,
const char* file,
int line,
const Group<M,V>& g)
const
1960 if(_domain == g._domain)
1961 partitionThrow(func, file, line,
"given Group is associated with the same Domain as this Group.");
1964 template<
typename M,
typename V>
1965 inline void Group<M,V>::_verifyNotEmpty(
const char* func,
const char* file,
int line)
const
1968 partitionThrow(func, file, line,
"Group is empty.");
1971 template<
typename M,
typename V>
1972 inline void Group<M,V>::_verifyInGroup(
const char* func,
const char* file,
int line,
const Node* n)
const
1974 if(n->_group !=
this)
1975 partitionThrow(func, file, line,
"id is not in this Group.");
2005 template<
typename M,
typename V>
2014 template<
typename M,
typename V>
2023 template<
typename M,
typename V>
2042 template<
typename M,
typename V>
2045 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2046 _node = _node->_next;
2061 template<
typename M,
typename V>
2064 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2065 _node = _node->_prev;
2080 template<
typename M,
typename V>
2083 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2085 _node = _node->_next;
2100 template<
typename M,
typename V>
2103 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2105 _node = _node->_prev;
2121 template<
typename M,
typename V>
2124 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2125 return _node == &_group->_end;
2140 template<
typename M,
typename V>
2143 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2144 return _node == &_group->_end;
2159 template<
typename M,
typename V>
2162 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2163 return _node == _group->_end._next;
2178 template<
typename M,
typename V>
2181 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2182 return _node == _group->_end._prev;
2195 template<
typename M,
typename V>
2198 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2199 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_NOT_AT_END());
2200 return _node->_entry;
2213 template<
typename M,
typename V>
2216 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2217 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_NOT_AT_END());
2218 return &_node->_entry;
2223 template<
typename M,
typename V>
2240 template<
typename M,
typename V>
2243 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2244 return i._node == _node;
2258 template<
typename M,
typename V>
2261 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2262 return i._node == _node;
2276 template<
typename M,
typename V>
2279 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2280 return i._node != _node;
2294 template<
typename M,
typename V>
2297 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2298 return i._node != _node;
2316 template<
typename M,
typename V>
2319 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_GROUP());
2320 PARTITION_SAFETY_GROUP_ADD(_group->PARTITION_VERIFY_DOMAIN());
2321 PARTITION_SAFETY_GROUP_ADD(_group->_domain->PARTITION_VERIFY_RANGE(
id));
2322 _group->_addAfter(_node->_prev, _group->_domain->_getNode(
id));
2340 template<
typename M,
typename V>
2343 PARTITION_SAFETY_GROUP_ADD(PARTITION_VERIFY_GROUP());
2344 PARTITION_SAFETY_GROUP_ADD(_group->PARTITION_VERIFY_DOMAIN());
2345 PARTITION_SAFETY_GROUP_ADD(_group->_domain->PARTITION_VERIFY_RANGE(
id));
2346 _group->_addAfter(_node, _group->_domain->_getNode(
id));
2363 template<
typename M,
typename V>
2366 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_GROUP());
2367 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_NOT_AT_END());
2369 _node = _node->_next;
2388 template<
typename M,
typename V>
2391 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_GROUP());
2392 PARTITION_SAFETY_GROUP_REMOVE(PARTITION_VERIFY_NOT_AT_END());
2394 _node = _node->_prev;
2399 template<
typename M,
typename V>
2406 template<
typename M,
typename V>
2410 partitionThrow(func, file, line,
"Iterator is not associated with a Group.");
2413 template<
typename M,
typename V>
2414 inline void Group<M,V>::Iterator::_verifyNotAtEnd(
const char* func,
const char* file,
int line)
const
2416 if(_node == &_group->_end)
2417 partitionThrow(func, file, line,
"Iterator is before front or after back.");
2420 template<
typename M,
typename V>
2421 inline void Group<M,V>::Iterator::_verifyCompare(
const char* func,
const char* file,
int line,
const Iterator& i)
const
2423 if(this->_group != i._group)
2424 partitionThrow(func, file, line,
"Attempt to compare iterators from different groups.");
2427 template<
typename M,
typename V>
2428 inline void Group<M,V>::Iterator::_verifyCompare(
const char* func,
const char* file,
int line,
const ConstIterator& i)
const
2430 if(this->_group != i._group)
2431 partitionThrow(func, file, line,
"Attempt to compare iterators from different groups.");
2446 template<
typename M,
typename V>
2455 template<
typename M,
typename V>
2464 template<
typename M,
typename V>
2473 template<
typename M,
typename V>
2483 template<
typename M,
typename V>
2502 template<
typename M,
typename V>
2505 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2506 _node = _node->_next;
2521 template<
typename M,
typename V>
2524 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2525 _node = _node->_prev;
2540 template<
typename M,
typename V>
2543 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2545 _node = _node->_next;
2560 template<
typename M,
typename V>
2563 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2565 _node = _node->_prev;
2580 template<
typename M,
typename V>
2583 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2584 return _node == &_group->_end;
2598 template<
typename M,
typename V>
2601 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2602 return _node == &_group->_end;
2616 template<
typename M,
typename V>
2619 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2620 return _node == _group->_end._next;
2634 template<
typename M,
typename V>
2637 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2638 return _node == _group->_end._prev;
2651 template<
typename M,
typename V>
2654 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2655 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_NOT_AT_END());
2656 return _node->_entry;
2669 template<
typename M,
typename V>
2672 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_GROUP());
2673 PARTITION_SAFETY_ITERATOR_DEREF(PARTITION_VERIFY_NOT_AT_END());
2674 return &_node->_entry;
2679 template<
typename M,
typename V>
2696 template<
typename M,
typename V>
2699 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2700 return i._node == _node;
2714 template<
typename M,
typename V>
2717 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2718 return i._node == _node;
2732 template<
typename M,
typename V>
2735 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2736 return i._node != _node;
2750 template<
typename M,
typename V>
2753 PARTITION_SAFETY_ITERATOR_COMPARE(PARTITION_VERIFY_COMPARE(i));
2754 return i._node != _node;
2757 template<
typename M,
typename V>
2764 template<
typename M,
typename V>
2768 partitionThrow(func, file, line,
"Iterator is not associated with a Group.");
2771 template<
typename M,
typename V>
2772 inline void Group<M,V>::ConstIterator::_verifyNotAtEnd(
const char* func,
const char* file,
int line)
const
2774 if(_node == &_group->_end)
2775 partitionThrow(func, file, line,
"Iterator is before front or after back.");
2778 template<
typename M,
typename V>
2779 inline void Group<M,V>::ConstIterator::_verifyCompare(
const char* func,
const char* file,
int line,
const Iterator& i)
const
2781 if(this->_group != i._group)
2782 partitionThrow(func, file, line,
"Attempt to compare iterators from different groups.");
2785 template<
typename M,
typename V>
2786 inline void Group<M,V>::ConstIterator::_verifyCompare(
const char* func,
const char* file,
int line,
const ConstIterator& i)
const
2788 if(this->_group != i._group)
2789 partitionThrow(func, file, line,
"Attempt to compare iterators from different groups.");