70#ifndef CONTAINERS_MANYMANY_HPP
71#define CONTAINERS_MANYMANY_HPP
75template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
82template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
97template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
99 link.Link::add(*
static_cast<R*
>(
this), node);
102template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
104 add(node, getLink(link));
107template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
109 if (node) add(*node, link);
112template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
114 if (node) add(*node, Link::getLink(link));
117template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
120 link.Link::add(*
static_cast<R*
>(
this), node);
123template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
125 addFirst(node, Link::getLink(link));
128template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
130 if (node) addFirst(node, link);
133template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
135 if (node) addFirst(*node, Link::getLink(link));
138template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
141 link.Link::add(
static_cast<R*
>(
this), &node, last());
144template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
146 addLast(node, Link::getLink(link));
149template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
151 if (node) addLast(*node, link);
154template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
156 if (node) addLast(*node, Link::getLink(link));
169template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
171 for (
Link* link = first(); link; link = link->nextNode()) {
172 if (link->node() == &node) {
190template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
193 return remove(*node);
196 remove(first()->Link::node());
204template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
211template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
216template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
218 link.Link::add(root, *
static_cast<N*
>(
this));
221template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
223 if (root) add(*root, link);
226template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
228 add(root, Link::getLink(link));
231template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
233 if (root) add(*root, Link::getLink(link));
236template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
239 link.Link::add(root, *
static_cast<N*
>(
this));
242template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
244 if (root) addFirst(*root, link);
247template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
249 addFirst(root, Link::getLink(link));
252template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
254 if (root) addFirst(*root, Link::getLink(link));
258template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
260 link.Link::add(&root,
static_cast<N*
>(
this), last());
263template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
265 if (root) addLast(*root, link);
268template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
270 addLast(root, Link::getLink(link));
273template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
275 if (root) addLast(*root, Link::getLink(link));
278template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
280 for (
Link* link=first(); link; link->nextRoot()) {
281 if (link->root() == &root) {
289template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
292 return remove(*root);
296 first()->Link::remove();
303template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
306 add(root, node, link1, link2);
310template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
322template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
324 if (link ==
nullptr) {
327 link->Link::m_dynamic =
true;
332template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
334 L
const* me =
static_cast<L const*
>(
this);
338 flag &= node() !=
nullptr;
341 flag &= (prevRoot()->Link::nextRoot() == me);
342 flag &= (prevRoot()->Link::root() == root());
344 flag &= (r->first() == me);
347 flag &= (nextRoot()->Link::prevRoot() == me);
348 flag &= (nextRoot()->Link::root() == root());
350 flag &= (r->last() == me);
353 flag &= (prevNode()->Link::nextNode() == me);
354 flag &= (prevNode()->Link::node() == node());
356 flag &= (node()->Node::first() == me);
359 flag &= (nextNode()->Link::prevNode() == me);
360 flag &= (nextNode()->Link::node() == node());
362 flag &= (node()-> Node::last() == me);
365 flag &= prevRoot() ==
nullptr;
366 flag &= nextRoot() ==
nullptr;
367 flag &= prevNode() ==
nullptr;
368 flag &= nextNode() ==
nullptr;
369 flag &= node() ==
nullptr;
390template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
392 L* me =
static_cast<L*
>(
this);
405 bool save = m_dynamic;
411 Link *rlink =
nullptr, *nlink =
nullptr;
412 unsigned saveRoot = BaseRoot::readLock(
true);
413 unsigned saveNode = BaseNode::readLock(
true);
416 if (link2->Link::root() == root) rlink = link2;
417 if (link2->Link::node() == node) nlink = link2;
420 if (link1->Link::root() == root) rlink = link1;
421 if (link1->Link::node() == node) nlink = link1;
425 rlink->BaseRoot::addAfter(me,
true);
427 root->Root::Base::add(me);
431 nlink->BaseNode::addAfter(me,
true);
433 node->Node::Base::add(me);
435 BaseRoot::readUnlock(saveRoot);
436 BaseNode::readUnlock(saveNode);
439template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
444template<
class R,
class N, ContainerThreadSafety s,
int n,
class L>
Intrusive Many to Many Relationship.
static L & getLink(L *link)
Convert a possible link pointer into an actual link object.
Definition ManyMany.hpp:323
class ManyManyRoot< R, N, s, n, ManyManyLink< R, N, s, n, void > > Root
Definition ManyMany.h:312
void remove()
Definition ManyMany.hpp:445
class ManyManyLink< R, N, s, n, L > Link
Definition ManyMany.h:314
void add(R *root, N *node, L *link1=nullptr, L *link2=nullptr)
Link a Root to a Node with this Lisk.
Definition ManyMany.hpp:391
ManyManyLink(R *root=nullptr, N *node=nullptr, L *link1=nullptr, L *link2=nullptr)
Definition ManyMany.hpp:304
virtual ~ManyManyLink()
Definition ManyMany.hpp:311
bool check() const override
Check a DListInNode.
Definition ManyMany.hpp:333
void addLast(R &root, L *link=nullptr)
Definition ManyMany.hpp:269
ManyManyNode(R *root=nullptr, L *link=nullptr)
Definition ManyMany.hpp:205
~ManyManyNode()
Definition ManyMany.hpp:212
void addFirst(R &root, L *link=nullptr)
Definition ManyMany.hpp:248
class ManyManyLink< R, N, s, n, L > Link
Definition ManyMany.h:233
bool remove(R &node)
Definition ManyMany.hpp:279
void add(R &root, L *link=nullptr)
Definition ManyMany.hpp:227
class ManyManyLink< R, N, s, n, L > Link
Definition ManyMany.h:174
ManyManyRoot(N *node=nullptr, L *link=nullptr)
Definition ManyMany.hpp:76
bool remove(N &node)
Remove Node for list.
Definition ManyMany.hpp:170
void add(N &node, L &link)
Remove Node for list.
Definition ManyMany.hpp:98
void addFirst(N &node, L &link)
Definition ManyMany.hpp:118
~ManyManyRoot()
Definition ManyMany.hpp:83
void addLast(N &node, L &link)
Definition ManyMany.hpp:139