13 nchainIteration(tnchain* iteratingChain,
const K* key, nbool isReversed):
14 me(iteratingChain, key, isReversed,
false,
true) {}
16 nchainIteration(tnchain* iteratingChain,
const K* key, nbool isReversed, nbool isBoundary, nbool isAutoAdvance):
18 _chainIter(iteratingChain),
19 _key(key ? *key : _getDummyKey()),
21 _iter(_makeContainerIter(
false)),
22 _isBoundary(isBoundary) {
23 if(isAutoAdvance && !_iter) {
25 _setBoundary(isBoundary);
29 nbool isEnd()
const override {
30 WHEN(_getNextContainer()) .ret(
false);
39 nbool isBoundary()
const {
return _isBoundary; }
41 ncnt
next(ncnt step)
override {
return _step(super::NEXT, step); }
43 ncnt prev(ncnt step)
override {
return _step(super::PREV, step); }
45 ncnt stepForward(ncnt step)
override {
return _step(super::FORWARD, step); }
47 ncnt stepBackward(ncnt step)
override {
return _step(super::BACKWARD, step); }
49 using super::getContainer;
51 tbicontainable<K, V>* getContainer()
override {
52 WHEN(!_chainIter) .ret(
nullptr);
53 return _chainIter.get();
56 const K* getKey()
const override {
return _iter.getKey(); }
60 V* getVal()
override {
return _iter.getVal(); }
64 void setVal(
const V& new1)
override { _iter.setVal(new1); }
67 nbool _onSame(
const typeProvidable& rhs)
const override {
68 const me& cast = (
const me&) rhs;
69 return (isEnd() && cast.isEnd()) || _iter == cast._iter;
73 ncnt _step(
typename super::iterationType type, ncnt step) {
78 if(!_isSubIterEndAtMiddle()) remain -= _iterate(type, remain);
79 if(remain <= 0)
break;
90 ncnt _iterate(
typename super::iterationType type, ncnt step) {
93 case super::FORWARD:
return _iter.stepForward(step);
94 case super::BACKWARD:
return _iter.stepBackward(step);
95 case super::PREV:
return _iter.prev(step);
97 case super::NEXT:
return _iter.
next(step);
101 const iter* _getNextIter()
const {
102 WHEN(!_chainIter) .ret(
nullptr);
103 return this->isReversed() ? &_chainIter->_prev : &_chainIter->_next;
106 const tnchain* _getNextContainer()
const {
107 WHEN(!_chainIter) .ret(
nullptr);
108 return this->isReversed() ? _chainIter->getPrev() : _chainIter->getNext();
112 const iter& nextIter = _getNextIter() OR_DO {
119 _chainIter.bind(_castChain(nextIter));
121 me& nextIteration = _castIteration(nextIter) OR.ret();
122 _iter = nextIteration._isBoundary ? _makeContainerIter(nextIteration.isReversed()) : nextIteration._iter;
123 if(!_isDummyKey && (!_iter.getKey() || _key != *_iter.getKey())) _iter.
next(1);
134 iter _makeContainerIter(nbool isReversed)
const {
135 return isReversed ? (this->isReversed() ? _chainIter->_map->begin(_getFindingKey()) :
136 _chainIter->_map->rbegin(_getFindingKey())) :
137 (this->isReversed() ? _chainIter->_map->rbegin(_getFindingKey()) :
138 _chainIter->_map->begin(_getFindingKey()));
141 void _setBoundary(nbool new1) { _isBoundary = new1; }
143 me* _castIteration(
const iter& e) {
return (me*) (e._iteration.get()); }
144 const me* _castIteration(
const iter& e)
const BY_CONST_FUNC(_castIteration(e))
146 tnchain* _castChain(
const iter& e) {
return (tnchain*) e.getContainer(); }
148 tnchain* _castChain(
const iter* it) BY_SIDE_FUNC(_castChain);
150 const tnchain* _castChain(
const iter& e)
const BY_CONST_FUNC(_castChain(e));
151 const tnchain* _castChain(
const iter* e)
const BY_CONST_FUNC(_castChain(e));
172 nbool _isSubIterEndAtMiddle()
174 WHEN(!this->isReversed()) .ret(
false);
177 const tnchain& prev = _castChain(_getNextIter()) OR.ret(false);
178 const me& prevNext = _castIteration(prev._next) OR.ret(false);
179 WHEN(prevNext.isBoundary()) .ret(false);
180 return _iter == prevNext._iter;
183 static const K& _getDummyKey() {
188 const K* _getFindingKey()
const {
return _isDummyKey ? nullptr : &_key; }
195 tstr<tnchain> _chainIter;