11#include <l4/cxx/type_traits>
12#include <l4/cxx/std_alloc>
13#include <l4/cxx/std_ops>
37 Iter(List_item *c, List_item *f) noexcept : _c(c), _f(f) {}
38 Iter(List_item *f = 0) noexcept : _c(f), _f(f) {}
40 List_item *operator * ()
const noexcept {
return _c; }
41 List_item *operator -> ()
const noexcept {
return _c; }
42 Iter &operator ++ ()
noexcept
47 _c = _c->get_next_item();
55 Iter operator ++ (
int)
noexcept
56 { Iter o = *
this; operator ++ ();
return o; }
58 Iter &operator -- ()
noexcept
63 _c = _c->get_prev_item();
71 Iter operator -- (
int)
noexcept
72 { Iter o = *
this; operator -- ();
return o; }
107 template<
typename T,
bool Poly = false>
108 class T_iter :
public Iter
111 static bool const P = !Conversion<const T*, const List_item *>::exists
114 static List_item *cast_to_li(T *i)
noexcept
117 return dynamic_cast<List_item*
>(i);
122 static T *cast_to_type(List_item *i)
noexcept
125 return dynamic_cast<T*
>(i);
127 return static_cast<T*
>(i);
132 template<
typename O >
133 explicit T_iter(T_iter<O>
const &o) noexcept
134 : Iter(o) {
dynamic_cast<T*
>(*o); }
137 T_iter(T *f = 0) noexcept : Iter(cast_to_li(f)) {}
138 T_iter(T *c, T *f) noexcept
139 : Iter(cast_to_li(c), cast_to_li(f))
142 inline T *operator * ()
const noexcept
143 {
return cast_to_type(Iter::operator * ()); }
144 inline T *operator -> ()
const noexcept
145 {
return operator * (); }
147 T_iter<T, Poly> operator ++ (
int)
noexcept
148 { T_iter<T, Poly> o = *
this; Iter::operator ++ ();
return o; }
149 T_iter<T, Poly> operator -- (
int)
noexcept
150 { T_iter<T, Poly> o = *
this; Iter::operator -- ();
return o; }
151 T_iter<T, Poly> &operator ++ ()
noexcept
152 { Iter::operator ++ ();
return *
this; }
153 T_iter<T, Poly> &operator -- ()
noexcept
154 { Iter::operator -- ();
return *
this; }
158 List_item() noexcept : _n(this), _p(this) {}
174 List_item *pr = p->_p;
208 template<
typename C,
typename N >
209 static inline C *
push_back(C *head, N *p)
noexcept;
219 template<
typename C,
typename N >
220 static inline C *
push_front(C *head, N *p)
noexcept;
230 template<
typename C,
typename N >
231 static inline C *
remove(C *head, N *p)
noexcept;
239template<
typename C,
typename N >
246 h->insert_prev_item(p);
250template<
typename C,
typename N >
256 h->insert_prev_item(p);
260template<
typename C,
typename N >
272 h =
static_cast<C*
>(p->_n);
279template<
typename T,
bool Poly >
282{
return cast_to_type(Iter::remove_me()); }
285template<
typename T >
286class T_list_item :
public List_item
294template<
typename LI >
304 void push_front(LI *e) { _h = LI::push_front(_h, e); }
305 void push_back(LI *e) { _h = LI::push_back(_h, e); }
306 void insert_before(LI *e, LI *p)
308 p->insert_prev_item(e);
312 void insert_after(LI *e, LI *p) { p->insert_next_item(e); }
315 { _h = LI::remove(_h, e); }
317 LI *head()
const {
return _h; }
325template<
typename D,
template<
typename A>
class Alloc =
New_allocator >
332 E(D
const &d) noexcept : data(d) {}
337 class Node :
private E
340 typedef Alloc<Node> Node_alloc;
352 Iter(E *e) noexcept : _i(e) {}
354 D &operator * ()
const noexcept {
return (*_i)->data; }
355 D &operator -> ()
const noexcept {
return (*_i)->data; }
357 Iter operator ++ (
int)
noexcept
358 { Iter o = *
this; operator ++ ();
return o; }
359 Iter operator -- (
int)
noexcept
360 { Iter o = *
this; operator -- ();
return o; }
361 Iter &operator ++ ()
noexcept { ++_i;
return *
this; }
362 Iter &operator -- ()
noexcept { --_i;
return *
this; }
365 operator E* ()
const noexcept {
return *_i; }
368 List(Alloc<Node>
const &a = Alloc<Node>()) noexcept : _h(0), _l(0), _a(a) {}
373 void *n = _a.alloc();
382 void *n = _a.alloc();
390 { E *e = i; _h =
E::remove(_h, e); --_l; _a.free(e); }
393 unsigned long size() const noexcept {
return _l; }
397 {
Iter i = _h;
for (; idx && *i; ++i, --idx) { }
return *i; }
401 {
Iter i = _h;
for (; idx && *i; ++i, --idx) { }
return *i; }
List_item * remove_me() noexcept
Remove item pointed to by iterator, and return pointer to element.
Iterator for derived classes from ListItem.
void remove_me() noexcept
Remove this item from the list.
static C * remove(C *head, N *p) noexcept
Remove item from a list.
static C * push_front(C *head, N *p) noexcept
Prepend item to a list.
void insert_next_item(List_item *p) noexcept
Insert item p after this item.
void insert_prev_item(List_item *p) noexcept
Insert item p before this item.
List_item * get_prev_item() const noexcept
Get previous item.
List_item * get_next_item() const noexcept
Get next item.
static C * push_back(C *head, N *p) noexcept
Append item to a list.
Doubly linked list, with internal allocation.
void remove(Iter const &i) noexcept
Remove element pointed to by the iterator.
unsigned long size() const noexcept
Get the length of the list.
void push_front(D const &d) noexcept
Add element at the beginning of the list.
D const & operator[](unsigned long idx) const noexcept
Random access.
Iter items() noexcept
Get iterator for the list elements.
void push_back(D const &d) noexcept
Add element at the end of the list.
Standard allocator based on operator new () .