source: branches/profile/EDIT4/ed4_list.hxx

Last change on this file was 8626, checked in by westram, 7 years ago

merge from e4fix [8409] [8410] [8411] [8412] [8413]

  • ED4_list / ED4_list_elem
    • moved code to header
    • now is a typed template (instead of void*-container)
    • replaced list instances with pointers to reduce dependencies
  • removed all now unneeded casts from client code
  • make explicit that ED4_selection_entry::object always is a ED4_species_name_terminal
  • detect useless runtime-casts (to_XXX()) and runtime-type-tests (is_XXX()) by overloading these functions for the destination-type
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.9 KB
Line 
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
14template <class T>
15class ED4_list_elem : virtual Noncopyable {
16    T             *m_elem;
17    ED4_list_elem *m_next;
18public:
19    ED4_list_elem(T *element)
20        : m_elem(element),
21          m_next(NULL)
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
30template <class T>
31class ED4_list : virtual Noncopyable {
32    ED4_list_elem<T> *first;
33    ED4_list_elem<T> *last;
34
35    int count;
36
37public:
38
39    ED4_list()
40        : first(NULL),
41          last(NULL),
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 = NULL;
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 = NULL;
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 != 0;
106    }
107
108};
109
110#else
111#error ed4_list.hxx included twice
112#endif // ED4_LIST_HXX
Note: See TracBrowser for help on using the repository browser.