ARB
ed4_list.hxx
Go to the documentation of this file.
1 // ================================================================ //
2 // //
3 // File : ed4_list.hxx //
4 // Purpose : //
5 // //
6 // Institute of Microbiology (Technical University Munich) //
7 // http://www.arb-home.de/ //
8 // //
9 // ================================================================ //
10 
11 #ifndef ED4_LIST_HXX
12 #define ED4_LIST_HXX
13 
14 template <class T>
15 class ED4_list_elem : virtual Noncopyable {
16  T *m_elem;
17  ED4_list_elem *m_next;
18 public:
19  ED4_list_elem(T *element)
20  : m_elem(element),
21  m_next(NULp)
22  { e4_assert(element); }
23 
24  ED4_list_elem *next() const { return m_next; }
25  T *elem() const { return m_elem; }
26 
27  void set_next(ED4_list_elem *the_next) { m_next = the_next; }
28 };
29 
30 template <class T>
31 class ED4_list : virtual Noncopyable {
32  ED4_list_elem<T> *first;
33  ED4_list_elem<T> *last;
34 
35  int count;
36 
37 public:
38 
40  : first(NULp),
41  last(NULp),
42  count(0)
43  {}
44 
45  ED4_list_elem<T> *head() const { return first; }
46  ED4_list_elem<T> *tail() const { return last; }
47  int size() const { return count; }
48 
49  void append_elem(T *elem) {
50  ED4_list_elem<T> *new_list_elem = new ED4_list_elem<T>(elem);
51  if (!first) {
52  first = new_list_elem;
53  last = new_list_elem;
54  }
55  else {
56  last->set_next(new_list_elem);
57  last = new_list_elem;
58  }
59  count++;
60  }
61 
62  void prepend_elem(T *elem) {
63  ED4_list_elem<T> *new_list_elem = new ED4_list_elem<T>(elem);
64  if (!first) {
65  first = new_list_elem;
66  last = new_list_elem;
67  }
68  else {
69  new_list_elem->set_next(first);
70  first = new_list_elem;
71  }
72  count++;
73  }
74 
75  void remove_elem(const T *elem) {
76  ED4_list_elem<T> *curr = first;
77  ED4_list_elem<T> *pred = NULp;
78 
79  while (curr && curr->elem() != elem) {
80  pred = curr;
81  curr = curr->next();
82  }
83 
84  if (curr) {
85  if (curr == first) {
86  if (curr == last) last = NULp;
87  first = curr->next();
88  }
89  else {
90  pred->set_next(curr->next());
91  if (curr == last) last = pred;
92  }
93  count--;
94  delete curr;
95  }
96  }
97 
98  bool has_elem(const T *elem) const {
99  if (!elem || !count) return false;
100 
101  ED4_list_elem<T> *curr = first;
102  while (curr && curr->elem()!=elem) {
103  curr = curr->next();
104  }
105  return curr;
106  }
107 
108 };
109 
110 #else
111 #error ed4_list.hxx included twice
112 #endif // ED4_LIST_HXX
ED4_list_elem< T > * tail() const
Definition: ed4_list.hxx:46
#define e4_assert(bed)
Definition: ed4_class.hxx:14
T * elem() const
Definition: ed4_list.hxx:25
void set_next(ED4_list_elem *the_next)
Definition: ed4_list.hxx:27
int size() const
Definition: ed4_list.hxx:47
ED4_list_elem * next() const
Definition: ed4_list.hxx:24
ED4_list()
Definition: ed4_list.hxx:39
void append_elem(T *elem)
Definition: ed4_list.hxx:49
bool has_elem(const T *elem) const
Definition: ed4_list.hxx:98
ED4_list_elem< T > * head() const
Definition: ed4_list.hxx:45
#define NULp
Definition: cxxforward.h:116
void remove_elem(const T *elem)
Definition: ed4_list.hxx:75
Definition: trnsprob.h:20
void prepend_elem(T *elem)
Definition: ed4_list.hxx:62
ED4_list_elem(T *element)
Definition: ed4_list.hxx:19