Changeset 36 for pjproject/main/pjlib/include/pj++/list.hpp
- Timestamp:
- Nov 9, 2005 3:37:19 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/main/pjlib/include/pj++/list.hpp
r29 r36 1 1 /* $Id$ 2 *3 2 */ 4 3 #ifndef __PJPP_LIST_H__ … … 6 5 7 6 #include <pj/list.h> 8 9 template <typename T> 10 struct PJ_List_Node 11 { 12 PJ_DECL_LIST_MEMBER(T) 13 }; 14 15 16 template <class Node> 17 class PJ_List 7 #include <pj++/pool.hpp> 8 9 10 // 11 // Linked-list. 12 // 13 // Note: 14 // List_Node must have public member next and prev. Normally 15 // it will be declared like: 16 // 17 // struct my_node 18 // { 19 // PJ_DECL_LIST_MEMBER(struct my_node); 20 // .. 21 // }; 22 // 23 // 24 template <class List_Node> 25 class Pj_List : public Pj_Object 18 26 { 19 27 public: 20 PJ_List() { pj_list_init(&root_); if (0) compiletest(); }21 ~PJ_List() {}22 28 // 29 // List const_iterator. 30 // 23 31 class const_iterator 24 32 { 25 33 public: 26 const_iterator() : node_(NULL) {} 27 const_iterator(const Node *nd) : node_((Node*)nd) {} 28 const Node * operator *() { return node_; } 29 const Node * operator -> () { return node_; } 30 const_iterator operator++() { return const_iterator(node_->next); } 31 bool operator==(const const_iterator &rhs) { return node_ == rhs.node_; } 32 bool operator!=(const const_iterator &rhs) { return node_ != rhs.node_; } 34 const_iterator() 35 : node_(NULL) 36 {} 37 const_iterator(const List_Node *nd) 38 : node_((List_Node*)nd) 39 {} 40 const List_Node * operator *() 41 { 42 return node_; 43 } 44 const List_Node * operator -> () 45 { 46 return node_; 47 } 48 const_iterator operator++() 49 { 50 return const_iterator(node_->next); 51 } 52 bool operator==(const const_iterator &rhs) 53 { 54 return node_ == rhs.node_; 55 } 56 bool operator!=(const const_iterator &rhs) 57 { 58 return node_ != rhs.node_; 59 } 33 60 34 61 protected: 35 Node *node_;62 List_Node *node_; 36 63 }; 37 64 65 // 66 // List iterator. 67 // 38 68 class iterator : public const_iterator 39 69 { 40 70 public: 41 iterator() {} 42 iterator(Node *nd) : const_iterator(nd) {} 43 Node * operator *() { return node_; } 44 Node * operator -> () { return node_; } 45 iterator operator++() { return iterator(node_->next); } 46 bool operator==(const iterator &rhs) { return node_ == rhs.node_; } 47 bool operator!=(const iterator &rhs) { return node_ != rhs.node_; } 71 iterator() 72 {} 73 iterator(List_Node *nd) 74 : const_iterator(nd) 75 {} 76 List_Node * operator *() 77 { 78 return node_; 79 } 80 List_Node * operator -> () 81 { 82 return node_; 83 } 84 iterator operator++() 85 { 86 return iterator(node_->next); 87 } 88 bool operator==(const iterator &rhs) 89 { 90 return node_ == rhs.node_; 91 } 92 bool operator!=(const iterator &rhs) 93 { 94 return node_ != rhs.node_; 95 } 48 96 }; 49 97 98 // 99 // Default constructor. 100 // 101 Pj_List() 102 { 103 pj_list_init(&root_); 104 if (0) compiletest(); 105 } 106 107 // 108 // Check if list is empty. 109 // 50 110 bool empty() const 51 111 { … … 53 113 } 54 114 115 // 116 // Get first element. 117 // 55 118 iterator begin() 56 119 { … … 58 121 } 59 122 123 // 124 // Get first element. 125 // 60 126 const_iterator begin() const 61 127 { … … 63 129 } 64 130 131 // 132 // Get end-of-element 133 // 65 134 const_iterator end() const 66 135 { 67 return const_iterator((Node*)&root_); 68 } 69 136 return const_iterator((List_Node*)&root_); 137 } 138 139 // 140 // Get end-of-element 141 // 70 142 iterator end() 71 143 { 72 return iterator((Node*)&root_); 73 } 74 75 void insert_before (iterator &pos, Node *node) 144 return iterator((List_Node*)&root_); 145 } 146 147 // 148 // Insert node. 149 // 150 void insert_before (iterator &pos, List_Node *node) 76 151 { 77 152 pj_list_insert_before( *pos, node ); 78 153 } 79 154 80 void insert_after(iterator &pos, Node *node) 155 // 156 // Insert node. 157 // 158 void insert_after(iterator &pos, List_Node *node) 81 159 { 82 160 pj_list_insert_after(*pos, node); 83 161 } 84 162 85 void merge_first(Node *list2) 163 // 164 // Merge list. 165 // 166 void merge_first(List_Node *list2) 86 167 { 87 168 pj_list_merge_first(&root_, list2); 88 169 } 89 170 90 void merge_last(PJ_List *list) 171 // 172 // Merge list. 173 // 174 void merge_last(Pj_List *list) 91 175 { 92 176 pj_list_merge_last(&root_, &list->root_); 93 177 } 94 178 95 void insert_nodes_before(iterator &pos, PJ_List *list2) 179 // 180 // Insert list. 181 // 182 void insert_nodes_before(iterator &pos, Pj_List *list2) 96 183 { 97 184 pj_list_insert_nodes_before(*pos, &list2->root_); 98 185 } 99 186 100 void insert_nodes_after(iterator &pos, PJ_List *list2) 187 // 188 // Insert list. 189 // 190 void insert_nodes_after(iterator &pos, Pj_List *list2) 101 191 { 102 192 pj_list_insert_nodes_after(*pos, &list2->root_); 103 193 } 104 194 195 // 196 // Erase an element. 197 // 105 198 void erase(iterator &it) 106 199 { … … 108 201 } 109 202 110 Node *front() 203 // 204 // Get first element. 205 // 206 List_Node *front() 111 207 { 112 208 return root_.next; 113 209 } 114 210 115 const Node *front() const 211 // 212 // Get first element. 213 // 214 const List_Node *front() const 116 215 { 117 216 return root_.next; 118 217 } 119 218 219 // 220 // Remove first element. 221 // 120 222 void pop_front() 121 223 { … … 123 225 } 124 226 125 Node *back() 227 // 228 // Get last element. 229 // 230 List_Node *back() 126 231 { 127 232 return root_.prev; 128 233 } 129 234 130 const Node *back() const 235 // 236 // Get last element. 237 // 238 const List_Node *back() const 131 239 { 132 240 return root_.prev; 133 241 } 134 242 243 // 244 // Remove last element. 245 // 135 246 void pop_back() 136 247 { … … 138 249 } 139 250 140 iterator find(Node *node) 141 { 142 Node *n = pj_list_find_node(&root_, node); 251 // 252 // Find a node. 253 // 254 iterator find(List_Node *node) 255 { 256 List_Node *n = pj_list_find_node(&root_, node); 143 257 return n ? iterator(n) : end(); 144 258 } 145 259 146 const_iterator find(Node *node) const 147 { 148 Node *n = pj_list_find_node(&root_, node); 260 // 261 // Find a node. 262 // 263 const_iterator find(List_Node *node) const 264 { 265 List_Node *n = pj_list_find_node(&root_, node); 149 266 return n ? const_iterator(n) : end(); 150 267 } 151 268 152 void push_back(Node *node) 269 // 270 // Insert a node in the back. 271 // 272 void push_back(List_Node *node) 153 273 { 154 274 pj_list_insert_after(root_.prev, node); 155 275 } 156 276 157 void push_front(Node *node) 277 // 278 // Insert a node in the front. 279 // 280 void push_front(List_Node *node) 158 281 { 159 282 pj_list_insert_before(root_.next, node); 160 283 } 161 284 285 // 286 // Remove all elements. 287 // 162 288 void clear() 163 289 { … … 169 295 struct RootNode 170 296 { 171 PJ_DECL_LIST_MEMBER( Node)297 PJ_DECL_LIST_MEMBER(List_Node); 172 298 } root_; 173 299 … … 175 301 { 176 302 // If you see error in this line, 177 // it's because Node is not derived from PJ_List_Node.178 Node *n = (Node*)0;303 // it's because List_Node is not derived from Pj_List_Node. 304 List_Node *n = (List_Node*)0; 179 305 n = n->next; n = n->prev; 180 306 }
Note: See TracChangeset
for help on using the changeset viewer.