12 #ifndef ROC_CORE_LIST_H_
13 #define ROC_CORE_LIST_H_
34 template <
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));
81 return (data->
list ==
this);
91 return container_of_(head_.
next);
101 return container_of_(head_.
prev);
114 check_is_member_(data,
this);
116 if (data->
next == &head_) {
119 return container_of_(data->
next);
132 insert_(element, NULL);
134 insert_(element, container_of_(head_.
next));
147 insert_(element, NULL);
160 insert_(element, &before);
173 check_is_member_(data,
this);
182 OwnershipPolicy<T>::release(element);
190 static void check_is_member_(
const ListNode::ListNodeData* data,
const List* list) {
191 if (data->list != list) {
192 roc_panic(
"list: element is member of wrong list: expected %p, got %p",
193 (
const void*)list, (
const void*)data->list);
197 void insert_(T& element, T* before) {
198 ListNode::ListNodeData* data_new = element.list_node_data();
199 check_is_member_(data_new, NULL);
201 ListNode::ListNodeData* data_before;
202 if (before != NULL) {
203 data_before = before->list_node_data();
204 check_is_member_(data_before,
this);
206 data_before = &head_;
209 data_new->
next = data_before;
213 data_before->
prev = data_new;
215 data_new->
list =
this;
219 OwnershipPolicy<T>::acquire(element);
222 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.
bool is_empty() const
Check if size is zero.
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.
ListNodeData * next
Next list element.
ListNodeData * prev
Previous list element.
void * list
The list this node is member of.
ListNode * container_of()
Get ListNode object that contains this ListData object.