3 * (c) 2011 Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
10 * As a special exception, you may use this file as part of a free software
11 * library without restriction. Specifically, if other files instantiate
12 * templates or use macros or inline functions from this file, or you compile
13 * this file and link it with other files to produce an executable, this
14 * file does not by itself cause the resulting executable to be covered by
15 * the GNU General Public License. This exception does not however
16 * invalidate any other reasons why the executable file might be covered by
17 * the GNU General Public License.
22 #include "bits/list_basics.h"
29 S_list_item() : _n(0) {}
30 explicit S_list_item(bool) {}
33 template<typename T, typename P> friend class S_list;
34 template<typename T, typename P> friend class S_list_tail;
35 template<typename T, typename X> friend struct Bits::Basic_list_policy;
37 S_list_item(S_list_item const &);
38 void operator = (S_list_item const &);
44 * Simple single-linked list.
46 * \tparam T Type of elements saved in the list. Must inherit from
49 template< typename T, typename POLICY = Bits::Basic_list_policy< T, S_list_item > >
50 class S_list : public Bits::Basic_list<POLICY>
53 S_list(S_list const &);
54 void operator = (S_list const &);
56 typedef typename Bits::Basic_list<POLICY> Base;
59 typedef typename Base::Iterator Iterator;
62 explicit S_list(bool x) : Base(x) {}
66 /// Add an element to the front of the list.
73 template< typename CAS >
74 void add(T *e, CAS const &c)
80 while (!c(&this->_f, e->_n, e));
83 /// Add an element to the front of the list.
84 void push_front(T *e) { add(e); }
87 * Remove and return the head element of the list.
89 * \pre The list must not be empty or the behaviour will be undefined.
95 this->_f = this->_f->_n;
99 void insert(T *e, Iterator const &pred)
101 S_list_item *p = *pred;
106 static void insert_before(T *e, Iterator const &succ)
108 S_list_item **x = Base::__get_internal(succ);
114 static void replace(Iterator const &p, T*e)
116 S_list_item **x = Base::__get_internal(p);
121 static Iterator erase(Iterator const &e)
123 S_list_item **x = Base::__get_internal(e);
131 template< typename T >
132 class S_list_bss : public S_list<T>
135 S_list_bss() : S_list<T>(true) {}
138 template< typename T, typename POLICY = Bits::Basic_list_policy< T, S_list_item > >
139 class S_list_tail : public S_list<T, POLICY>
142 typedef S_list<T, POLICY> Base;
145 S_list_tail() : Base(), _tail(&this->_f) {}
160 void append(S_list_tail &o)
169 void move_to(S_list_tail &t)
170 { t._f = this->_f; t._tail = _tail; clear(); }