12 nchainIteration(tnchain* iteratingChain,
const K* key, nbool isReversed):
13 me(iteratingChain, key, isReversed,
false,
true) {}
15 nchainIteration(tnchain* iteratingChain,
const K* key, nbool isReversed, nbool isBoundary, nbool isAutoAdvance):
17 _chainIter(iteratingChain),
18 _key(key ? *key : _getDummyKey()),
20 _iter(_makeContainerIter(
false)),
21 _isBoundary(isBoundary) {
22 if(isAutoAdvance && !_iter) {
24 _setBoundary(isBoundary);
28 nbool isEnd()
const override {
29 WHEN(_getNextContainer()) .ret(
false);
38 nbool isBoundary()
const {
return _isBoundary; }
40 ncnt
next(ncnt step)
override {
return _step(super::NEXT, step); }
42 ncnt prev(ncnt step)
override {
return _step(super::PREV, step); }
44 ncnt stepForward(ncnt step)
override {
return _step(super::FORWARD, step); }
46 ncnt stepBackward(ncnt step)
override {
return _step(super::BACKWARD, step); }
48 using super::getContainer;
50 tbicontainable<K, V>* getContainer()
override {
51 WHEN(!_chainIter) .ret(
nullptr);
52 return _chainIter.get();
55 const K* getKey()
const override {
return _iter.getKey(); }
59 V* getVal()
override {
return _iter.getVal(); }
63 void setVal(
const V& new1)
override { _iter.setVal(new1); }
66 nbool _onSame(
const typeProvidable& rhs)
const override {
67 const me& cast = (
const me&) rhs;
68 return (isEnd() && cast.isEnd()) || _iter == cast._iter;
72 ncnt _step(
typename super::iterationType type, ncnt step) {
77 if(!_isSubIterEndAtMiddle()) remain -= _iterate(type, remain);
78 if(remain <= 0)
break;
89 ncnt _iterate(
typename super::iterationType type, ncnt step) {
92 case super::FORWARD:
return _iter.stepForward(step);
93 case super::BACKWARD:
return _iter.stepBackward(step);
94 case super::PREV:
return _iter.prev(step);
96 case super::NEXT:
return _iter.
next(step);
100 const iter* _getNextIter()
const {
101 WHEN(!_chainIter) .ret(
nullptr);
102 return this->isReversed() ? &_chainIter->_prev : &_chainIter->_next;
105 const tnchain* _getNextContainer()
const {
106 WHEN(!_chainIter) .ret(
nullptr);
107 return this->isReversed() ? _chainIter->getPrev() : _chainIter->getNext();
111 const iter& nextIter = _getNextIter() OR_DO {
118 _chainIter.bind(_castChain(nextIter));
120 me& nextIteration = _castIteration(nextIter) OR.ret();
121 _iter = nextIteration._isBoundary ? _makeContainerIter(nextIteration.isReversed()) : nextIteration._iter;
122 if(!_isDummyKey && (!_iter.getKey() || _key != *_iter.getKey())) _iter.
next(1);
131 iter _makeContainerIter(nbool isReversed)
const {
132 return isReversed ? (this->isReversed() ? _chainIter->_map->begin(_getFindingKey()) :
133 _chainIter->_map->rbegin(_getFindingKey())) :
134 (this->isReversed() ? _chainIter->_map->rbegin(_getFindingKey()) :
135 _chainIter->_map->begin(_getFindingKey()));
138 void _setBoundary(nbool new1) { _isBoundary = new1; }
140 me* _castIteration(
const iter& e) {
return (me*) (e._iteration.get()); }
141 const me* _castIteration(
const iter& e)
const BY_CONST_FUNC(_castIteration(e))
143 tnchain* _castChain(
const iter& e) {
return (tnchain*) e.getContainer(); }
145 tnchain* _castChain(
const iter* it) BY_SIDE_FUNC(_castChain);
147 const tnchain* _castChain(
const iter& e)
const BY_CONST_FUNC(_castChain(e));
148 const tnchain* _castChain(
const iter* e)
const BY_CONST_FUNC(_castChain(e));
167 nbool _isSubIterEndAtMiddle()
169 WHEN(!this->isReversed()) .ret(
false);
172 const tnchain& prev = _castChain(_getNextIter()) OR.ret(false);
173 const me& prevNext = _castIteration(prev._next) OR.ret(false);
174 WHEN(prevNext.isBoundary()) .ret(false);
175 return _iter == prevNext._iter;
178 static const K& _getDummyKey() {
183 const K* _getFindingKey()
const {
return _isDummyKey ? nullptr : &_key; }
188 tstr<tnchain> _chainIter;
Bidirectional iterator for key-value containers.
Definition: biter.hpp:9
ncnt next(ncnt step) override
void rel() override
once rel(), an iterator enters a state where it can never be reused again.
Definition: biteration.hpp:5
Definition: nchainIteration.hpp:7
ncnt next(ncnt step) override
Definition: nchainIteration.hpp:40