12#ifndef ROC_CORE_LIST_H_
13#define ROC_CORE_LIST_H_
34template <
class T,
template <
class TT>
class OwnershipPolicy = RefCountedOwnership>
40 typedef typename OwnershipPolicy<T>::Pointer
Pointer;
57 check_is_member_(data,
this);
59 next_data = data->
next;
62 OwnershipPolicy<T>::release(*container_of_(data));
76 return (data->
list ==
this);
86 return container_of_(head_.
next);
96 return container_of_(head_.
prev);
109 check_is_member_(data,
this);
111 if (data->
next == &head_) {
114 return container_of_(data->
next);
127 insert_(element, NULL);
129 insert_(element, container_of_(head_.
next));
142 insert_(element, NULL);
155 insert_(element, &before);
168 check_is_member_(data,
this);
177 OwnershipPolicy<T>::release(element);
185 static void check_is_member_(
const ListNode::ListNodeData* data,
const List* list) {
186 if (data->list != list) {
187 roc_panic(
"list element is member of wrong list: expected %p, got %p",
188 (
const void*)list, (
const void*)data->list);
192 void insert_(T& element, T* before) {
193 ListNode::ListNodeData* data_new = element.list_node_data();
194 check_is_member_(data_new, NULL);
196 ListNode::ListNodeData* data_before;
197 if (before != NULL) {
198 data_before = before->list_node_data();
199 check_is_member_(data_before,
this);
201 data_before = &head_;
204 data_new->
next = data_before;
208 data_before->
prev = data_new;
210 data_new->
list =
this;
214 OwnershipPolicy<T>::acquire(element);
217 ListNode::ListNodeData head_;
Intrusive doubly-linked list.
void insert_before(T &element, T &before)
Insert element into list.
void remove(T &element)
Remove element from list.
List()
Initialize empty list.
size_t size() const
Get number of elements in list.
OwnershipPolicy< T >::Pointer Pointer
Pointer type.
Pointer nextof(T &element) const
Get list element next to given one.
Pointer back() const
Get last list element.
Pointer front() const
Get first list element.
~List()
Release ownership of containing objects.
void push_front(T &element)
Prepend element to list.
void push_back(T &element)
Append element to list.
bool contains(const T &element)
Check if element belongs to list.
Base class for non-copyable objects.
#define roc_panic_if(x)
Panic if condition is true.
#define roc_panic(...)
Print error message and terminate program gracefully.
Commonly used types and functions.
ListNode * container_of()
Get ListNode object that contains this ListData object.
ListNodeData * next
Next list element.
ListNodeData * prev
Previous list element.
void * list
The list this node is member of.