class Head
{
public:
- Head(Parent *parent, PtrLink<Child, Parent> *link) : _parent{parent}, _link{link}
+ // TODO _link is no longer used
+ Head(Parent *parent, PtrLink<Child, Parent> *link) : _parent{parent}
{
_head = nullptr;
_tail = nullptr;
}
// Update parent-child relation
- _link->set(child, _parent);
+ child->parent(_parent);
}
public:
}
// Update parent-child relation
- _link->unset(child);
+ child->parent(nullptr);
}
public:
private:
Parent *const _parent;
- PtrLink<Child, Parent> *const _link;
private:
Child *_head;
class Node
{
public:
+ friend class Head;
+
+ public:
Node()
{
static_assert(std::is_base_of<Node, Child>::value,
virtual ~Node() = default;
protected:
+ // NOTE This method will be deprecated
virtual void get(const PtrLink<Child, Parent> **out) const = 0;
public:
- Parent *parent(void) const
- {
- const PtrLink<Child, Parent> *link = nullptr;
- get(&link);
- assert(link != nullptr);
- return link->find(curr());
- }
+ Parent *parent(void) const { return _parent; }
private:
Child *curr(void) { return reinterpret_cast<Child *>(this); }
}
private:
+ // WARN Do NOT invoke this method outside Head::enlist
+ void parent(Parent *p) { _parent = p; }
+
+ private:
+ // WARN Do NOT modify this field inside Node.
+ Parent *_parent = nullptr;
Child *_prev;
Child *_next;
};