11#include "bits/list_basics.h"
18 S_list_item() : _n(0) {}
20 explicit S_list_item(
bool) {}
23 template<
typename T,
typename P>
friend class S_list;
24 template<
typename T,
typename P>
friend class S_list_tail;
25 template<
typename T,
typename X>
friend struct Bits::Basic_list_policy;
27 S_list_item(S_list_item
const &);
28 void operator = (S_list_item
const &);
39template<
typename T,
typename POLICY = Bits::Basic_list_policy< T, S_list_item > >
43 void operator = (
S_list const &) =
delete;
49 typedef typename Base::Iterator Iterator;
55 Base::operator = (
static_cast<Base&&
>(o));
71 template<
typename CAS >
72 void add(T *e, CAS
const &c)
78 while (!c(&this->
_f, e->_n, e));
93 this->
_f = this->
_f->_n;
97 void insert(T *e, Iterator
const &pred)
99 S_list_item *p = *pred;
104 static void insert_before(T *e, Iterator
const &succ)
106 S_list_item **x = Base::__get_internal(succ);
112 static void replace(Iterator
const &p, T*e)
114 S_list_item **x = Base::__get_internal(p);
119 static Iterator erase(Iterator
const &e)
121 S_list_item **x = Base::__get_internal(e);
129template<
typename T >
130class S_list_bss :
public S_list<T>
133 S_list_bss() : S_list<T>(true) {}
136template<
typename T,
typename POLICY = Bits::Basic_list_policy< T, S_list_item > >
137class S_list_tail :
public S_list<T, POLICY>
140 typedef S_list<T, POLICY> Base;
141 void add(T *e) =
delete;
144 using Iterator =
typename Base::Iterator;
145 S_list_tail() : Base(), _tail(&this->
_f) {}
147 S_list_tail(S_list_tail &&t)
148 : Base(static_cast<Base&&>(t)), _tail(t.
empty() ? &this->
_f : t._tail)
153 S_list_tail &operator = (S_list_tail &&t)
158 Base::operator = (
static_cast<Base &&
>(t));
159 _tail = t.empty() ? &this->
_f : t._tail;
164 void push_front(T *e)
185 void append(S_list_tail &o)
203 static void insert(T *e, Iterator
const &pred);
204 static void insert_before(T *e, Iterator
const &succ);
205 static void replace(Iterator
const &p, T*e);
206 static Iterator erase(Iterator
const &e);
Internal: Common functions for all head-based list implementations.
bool empty() const
Check if the list is empty.
void clear()
Remove all elements from the list.
POLICY::Head_type _f
Pointer to front of the list.
Value_type front() const
Return the first element in the list.
Simple single-linked list.
void add(T *e)
Add an element to the front of the list.
void push_front(T *e)
Add an element to the front of the list.
T * pop_front()
Remove and return the head element of the list.