4#include "core/builtin/container/native/tnmap.inl"
8#define TEMPL template <typename K, typename V, typename defaultContainer>
9#define ME tnchain<K, V, defaultContainer>
10#define SUPER typename ME::super
13 ME::tnchain(): _map(new defaultContainer()) {}
16 ME::tnchain(
const super& arr): _map(arr) {}
19 ME::tnchain(
const super& org,
const me& next): _map(org) { link(next); }
22 ME::tnchain(std::initializer_list<std::pair<K, V*>> elems) {
23 for(
const auto& e: elems)
24 _map->add(e.first, *e.second);
28 nbool ME::in(
const K& key)
const {
30 this->each([&](
const K& elemKey,
const V&) {
return ret = elemKey != key; });
35 ncnt ME::len()
const {
37 this->each([&](
const K&,
const V&) {
return len++,
true; });
42 ncnt ME::chainLen()
const {
44 for(
const me* e =
this; e; e = e->getNext())
50 V* ME::get(
const K& key) {
52 this->each([&](
const K& elemKey, V& val) {
53 WHEN(elemKey != key) .ret(
true);
61 void ME::_getAll(
const K& key, narr& tray)
const {
62 this->each([&](
const K& elemKey,
const V& val) {
63 if(elemKey == key) tray.add(val);
69 nbool ME::add(
const K& key,
const V& new1) {
return getContainer().add(key, new1); }
72 nbool ME::del(
const K& key) {
74 for(me* e =
this; e; e = e->getNext())
75 if(!e->getContainer().del(key)) ret =
false;
80 nbool ME::del(
const iter& at) {
81 const me* owner = (
const me*) at.getContainer();
82 for(me* e =
this; e; e = e->getNext()) {
83 if(e != owner)
continue;
84 return e->getContainer().del(_getInnerIter(at));
90 nbool ME::del(
const iter& from,
const iter& last) {
91 WHEN(from.isReversed() != last.isReversed()) .exErr(ITERATORS_ARENT_SAME_DIRECTION).ret(
false);
92 const me* fromChain = (
const me*) from.getContainer();
94 (
const me*) last.getContainer() OR.warn(
"iterator 'end' owned by null chain instance.").ret(
false);
95 const me* endChain = lastChain.getNext();
97 me* e = (me*) fromChain;
100 super& eArr = e->getContainer();
101 iter innerBegin = _getInnerBeginOfChain(*e, *fromChain, from),
102 innerLast = _getInnerEndOfChain(*e, lastChain, last);
103 ret = eArr.del(innerBegin, innerLast) ? ret :
false;
105 }
while(e != endChain);
111 nbool ME::link(
const iter& portion) {
112 ME& next = (ME*) (portion TO(getContainer())) OR.ret(
false);
113 WHEN(&next ==
this) .warn(
"recursive link detected for portion(%s).", (
void*) &next).ret(
false);
130 me* prev = getPrev();
131 next._prev = _rendOfThisChain(prev ? prev->_next.isReversed() : false);
136 nbool ME::link(
const ME& new1) {
return link(new1.begin()); }
140 ME* next = (ME*) (_next TO(getContainer()));
141 if(next) next->_prev.rel();
149 while(ret && ret->_next.getContainer())
150 ret = (me*) ret->_next.getContainer();
155 void ME::onCloneDeep(
const clonable& from) {
156 const me& rhs = (
const me&) from;
157 _map.bind(*(super*) rhs._map->cloneDeep());
160 const me* next = rhs.getNext();
162 e->link(*
new me(*(super*) next->getContainer().cloneDeep()));
164 next = next->getNext();
169 ME* ME::wrap(
const super& toShallowWrap) {
return wrap<ME>(toShallowWrap); }
172 ME* ME::cloneChain(
const super* until)
const {
173 tstr<me> e(getNext());
174 ME* ret =
new ME(this->getContainer());
177 tstr<me> new1(
new ME(e->getContainer()));
178 retElem->link(*new1);
179 retElem = new1.get();
181 if(&e->getContainer() == until)
break;
182 e.bind((me*) e->_next.getContainer());
189 ME* ME::cloneChain(
const me* until)
const {
190 return cloneChain(until ? &until->getContainer() : (const super*) nullptr);
194 ME* ME::cloneChain()
const {
return cloneChain((
const super*)
nullptr); }
198 for(tstr<me> e(
this); e; e.bind(e->getNext()))
199 e->getContainer().rel();
203 tnbicontainer<K, V>& ME::getContainer() {
return *_map; }
206 const SUPER& ME::getContainer()
const {
return *_map; }
209 ME* ME::getNext() {
return (ME*) _next.getContainer(); }
212 ME* ME::getPrev() {
return (ME*) _prev.getContainer(); }
215 typename ME::iteration* ME::_onMakeIteration(
const K* key, nbool isReversed, ncnt step, nbool isBoundary)
const {
216 me* unconst =
const_cast<me*
>(
this);
217 auto* ret =
new nchainIteration(isReversed ? unconst->getTail() : unconst, key, isReversed, isBoundary, true);
219 ret->_setBoundary(isBoundary);
224 typename ME::iter* ME::_getInnerIter(
const iter& outer) {
230 typename ME::iter ME::_getInnerBeginOfChain(me& it,
const me& fromChain,
const iter& from) {
231 me* prev = it.getPrev();
232 nbool isReversed = prev ? prev->_next.isReversed() :
false;
233 WHEN(&it != &fromChain) .ret(it.getContainer().begin());
234 WHEN(isReversed) .ret(it.getContainer().begin());
236 auto ret = _getInnerIter(from) OR.ret(this->end());
241 typename ME::iter ME::_getInnerEndOfChain(me& it,
const me& lastChain,
const iter& last) {
242 me* prev = it.getPrev();
243 nbool isReversed = !prev ? false : prev->_next.isReversed();
244 WHEN(&it != &lastChain) .ret(it.getContainer().end());
245 WHEN(isReversed) .ret(it.getContainer().end());
247 auto ret = _getInnerIter(last) OR.ret(this->end());
252 typename ME::iter ME::_rendOfThisChain(nbool isReversed) {
Bidirectional iterator for key-value containers.
Definition biter.hpp:10
Chain iteration implementation.
Definition nchainIteration.hpp:8
ncnt next(ncnt step) override
Definition nchainIteration.hpp:41