]>
Commit | Line | Data |
---|---|---|
23324ae1 FM |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: list.h | |
e54c96f1 | 3 | // Purpose: interface of wxList<T> |
23324ae1 FM |
4 | // Author: wxWidgets team |
5 | // RCS-ID: $Id$ | |
6 | // Licence: wxWindows license | |
7 | ///////////////////////////////////////////////////////////////////////////// | |
8 | ||
9 | /** | |
7c913512 | 10 | |
5cb947fd | 11 | The wxList<T> class provides linked list functionality. It has been rewritten |
23324ae1 | 12 | to be type safe and to provide the full API of the STL std::list container and |
5cb947fd | 13 | should be used like it. The exception is that wxList<T> actually stores |
23324ae1 | 14 | pointers and therefore its iterators return pointers and not references |
7c913512 | 15 | to the actual objets in the list (see example below) and @e value_type |
5cb947fd | 16 | is defined as @e T*. wxList<T> destroys an object after removing it only |
23324ae1 | 17 | if wxList::DeleteContents has been called. |
7c913512 | 18 | |
5cb947fd | 19 | wxList<T> is not a real template and it requires that you declare and define |
23324ae1 FM |
20 | each wxListT class in your program. This is done with @e WX_DECLARE_LIST |
21 | and @e WX_DEFINE_LIST macros (see example). We hope that we'll be able | |
22 | to provide a proper template class providing both the STL std::list | |
23 | and the old wxList API in the future. | |
7c913512 | 24 | |
23324ae1 FM |
25 | Please refer to the STL std::list documentation for further |
26 | information on how to use the class. Below we documented both | |
7c913512 | 27 | the supported STL and the legacy API that originated from the |
23324ae1 FM |
28 | old wxList class and which can still be used alternatively for |
29 | the the same class. | |
7c913512 FM |
30 | |
31 | Note that if you compile wxWidgets in STL mode (wxUSE_STL defined as 1) | |
5cb947fd | 32 | then wxList<T> will actually derive from std::list and just add a legacy |
23324ae1 | 33 | compatibility layer for the old wxList class. |
7c913512 | 34 | |
73473b3e RR |
35 | @code |
36 | // this part might be in a header or source (.cpp) file | |
37 | class MyListElement | |
38 | { | |
39 | ... // whatever | |
40 | }; | |
41 | ||
42 | // this macro declares and partly implements MyList class | |
43 | WX_DECLARE_LIST(MyListElement, MyList); | |
44 | ||
45 | ... | |
46 | ||
47 | // the only requirement for the rest is to be AFTER the full declaration of | |
48 | // MyListElement (for WX_DECLARE_LIST forward declaration is enough), but | |
49 | // usually it will be found in the source file and not in the header | |
50 | ||
51 | #include <wx/listimpl.cpp> | |
52 | WX_DEFINE_LIST(MyList); | |
53 | ||
54 | ||
55 | MyList list; | |
56 | MyListElement element; | |
57 | list.Append(&element); // ok | |
58 | list.Append(17); // error: incorrect type | |
59 | ||
60 | // let's iterate over the list in STL syntax | |
61 | MyList::iterator iter; | |
62 | for (iter = list.begin(); iter != list.end(); ++iter) | |
63 | { | |
64 | MyListElement *current = *iter; | |
65 | ||
66 | ...process the current element... | |
67 | } | |
68 | ||
69 | // the same with the legacy API from the old wxList class | |
70 | MyList::compatibility_iterator node = list.GetFirst(); | |
71 | while (node) | |
72 | { | |
73 | MyListElement *current = node->GetData(); | |
74 | ||
75 | ...process the current element... | |
76 | ||
77 | node = node->GetNext(); | |
78 | } | |
79 | @endcode | |
80 | ||
81 | ||
23324ae1 FM |
82 | @library{wxbase} |
83 | @category{FIXME} | |
7c913512 | 84 | |
73473b3e | 85 | @see wxArray<T>, wxVector<T> |
23324ae1 | 86 | */ |
7c913512 | 87 | class wxList<T> |
23324ae1 FM |
88 | { |
89 | public: | |
23324ae1 | 90 | /** |
c6714d38 | 91 | Default constructor. |
23324ae1 | 92 | */ |
73473b3e | 93 | wxList<T>(); |
c6714d38 RR |
94 | |
95 | /** | |
4050e98d | 96 | Constructor which initialized the list with an array of @a count elements. |
c6714d38 | 97 | */ |
73473b3e | 98 | wxList<T>(size_t count, T* elements[]); |
23324ae1 FM |
99 | |
100 | /** | |
101 | Destroys the list, but does not delete the objects stored in the list | |
102 | unless you called DeleteContents(@true ). | |
103 | */ | |
73473b3e | 104 | ~wxList<T>(); |
23324ae1 FM |
105 | |
106 | /** | |
4cc4bfaf | 107 | Appends the pointer to @a object to the list. |
23324ae1 | 108 | */ |
5cb947fd | 109 | wxList<T>::compatibility_iterator Append(T* object); |
23324ae1 FM |
110 | |
111 | /** | |
c6714d38 RR |
112 | Clears the list. |
113 | Deletes the actual objects if DeleteContents( @true ) was called previously. | |
23324ae1 FM |
114 | */ |
115 | void Clear(); | |
116 | ||
117 | /** | |
4cc4bfaf | 118 | If @a destroy is @true, instructs the list to call @e delete |
23324ae1 FM |
119 | on objects stored in the list whenever they are removed. |
120 | The default is @false. | |
121 | */ | |
122 | void DeleteContents(bool destroy); | |
123 | ||
124 | /** | |
c6714d38 RR |
125 | Deletes the given element refered to by @a iter from the list |
126 | if @a iter is a valid iterator. Returns @true if successful. | |
127 | ||
128 | Deletes the actual object if DeleteContents( @true ) was called previously. | |
23324ae1 FM |
129 | */ |
130 | bool DeleteNode(const compatibility_iterator& iter); | |
131 | ||
132 | /** | |
4cc4bfaf | 133 | Finds the given @a object and removes it from the list, returning |
c6714d38 RR |
134 | @true if successful. |
135 | ||
136 | Deletes @a object if DeleteContents( @true ) was called previously. | |
23324ae1 | 137 | */ |
4cc4bfaf | 138 | bool DeleteObject(T* object); |
23324ae1 FM |
139 | |
140 | /** | |
c6714d38 RR |
141 | Removes element refered to be @a iter. |
142 | ||
143 | Deletes the actualy object if DeleteContents( @true ) was called previously. | |
23324ae1 FM |
144 | */ |
145 | void Erase(const compatibility_iterator& iter); | |
146 | ||
147 | /** | |
4cc4bfaf | 148 | Returns the iterator refering to @a object or @NULL if none found. |
23324ae1 | 149 | */ |
5cb947fd | 150 | wxList<T>::compatibility_iterator Find(T* object) const; |
23324ae1 FM |
151 | |
152 | /** | |
153 | Returns the number of elements in the list. | |
154 | */ | |
328f5751 | 155 | size_t GetCount() const; |
23324ae1 FM |
156 | |
157 | /** | |
158 | Returns the first iterator in the list (@NULL if the list is empty). | |
159 | */ | |
5cb947fd | 160 | wxList<T>::compatibility_iterator GetFirst() const; |
23324ae1 FM |
161 | |
162 | /** | |
163 | Returns the last iterator in the list (@NULL if the list is empty). | |
164 | */ | |
5cb947fd | 165 | wxList<T>::compatibility_iterator GetLast() const; |
23324ae1 FM |
166 | |
167 | /** | |
4cc4bfaf FM |
168 | Returns the index of @a obj within the list or @c wxNOT_FOUND if |
169 | @a obj is not found in the list. | |
23324ae1 | 170 | */ |
328f5751 | 171 | int IndexOf(T* obj) const; |
23324ae1 | 172 | |
23324ae1 | 173 | /** |
c6714d38 | 174 | Inserts @a object at the beginning of the list. |
23324ae1 | 175 | */ |
5cb947fd | 176 | wxList<T>::compatibility_iterator Insert(T* object); |
c6714d38 RR |
177 | |
178 | /** | |
179 | Inserts @a object at @a position. | |
180 | */ | |
5cb947fd | 181 | wxList<T>::compatibility_iterator Insert(size_t position, |
4cc4bfaf | 182 | T* object); |
c6714d38 RR |
183 | |
184 | /** | |
185 | Inserts @a object before the object refered to be @a iter. | |
186 | */ | |
5cb947fd | 187 | wxList<T>::compatibility_iterator Insert(compatibility_iterator iter, |
4cc4bfaf | 188 | T* object); |
23324ae1 FM |
189 | |
190 | /** | |
191 | Returns @true if the list is empty, @false otherwise. | |
192 | */ | |
328f5751 | 193 | bool IsEmpty() const; |
23324ae1 FM |
194 | |
195 | /** | |
196 | Returns the iterator refering to the object at the given | |
c6714d38 | 197 | @a index in the list. |
23324ae1 | 198 | */ |
5cb947fd | 199 | wxList<T>::compatibility_iterator Item(size_t index) const; |
23324ae1 FM |
200 | |
201 | /** | |
8cfcbf70 | 202 | @note This function is deprecated, use Find() instead. |
23324ae1 | 203 | */ |
5cb947fd | 204 | wxList<T>::compatibility_iterator Member(T* object) const; |
23324ae1 FM |
205 | |
206 | /** | |
8cfcbf70 | 207 | @note This function is deprecated, use Item() instead. |
23324ae1 | 208 | */ |
5cb947fd | 209 | wxList<T>::compatibility_iterator Nth(int n) const; |
23324ae1 FM |
210 | |
211 | /** | |
1f1d2182 | 212 | @note This function is deprecated, use wxList::GetCount instead. |
23324ae1 FM |
213 | Returns the number of elements in the list. |
214 | */ | |
328f5751 | 215 | int Number() const; |
23324ae1 FM |
216 | |
217 | /** | |
218 | Allows the sorting of arbitrary lists by giving a function to compare | |
219 | two list elements. We use the system @b qsort function for the actual | |
220 | sorting process. | |
221 | */ | |
222 | void Sort(wxSortCompareFunction compfunc); | |
223 | ||
23324ae1 | 224 | /** |
c6714d38 | 225 | Clears the list and item from @a first to @a last from another list to it. |
23324ae1 FM |
226 | */ |
227 | void assign(const_iterator first, const const_iterator& last); | |
c6714d38 RR |
228 | |
229 | /** | |
230 | Clears the list and adds @a n items with value @a v to it. | |
231 | */ | |
232 | void assign(size_type n, const_reference v = value_type()) \ | |
23324ae1 | 233 | |
23324ae1 FM |
234 | /** |
235 | Returns the last item of the list. | |
236 | */ | |
682f6de6 | 237 | reference back(); |
d38e30d1 RR |
238 | |
239 | /** | |
240 | Returns the last item of the list as a const reference. | |
241 | */ | |
328f5751 | 242 | const_reference back() const; |
23324ae1 | 243 | |
23324ae1 | 244 | /** |
d38e30d1 | 245 | Returns an iterator pointing to the beginning of the list. |
23324ae1 | 246 | */ |
682f6de6 | 247 | iterator begin(); |
d38e30d1 RR |
248 | |
249 | /** | |
250 | Returns a const iterator pointing to the beginning of the list. | |
251 | */ | |
328f5751 | 252 | const_iterator begin() const; |
23324ae1 FM |
253 | |
254 | /** | |
255 | Removes all items from the list. | |
256 | */ | |
257 | void clear(); | |
258 | ||
259 | /** | |
260 | Returns @e @true if the list is empty. | |
261 | */ | |
328f5751 | 262 | bool empty() const; |
23324ae1 | 263 | |
23324ae1 | 264 | /** |
d38e30d1 | 265 | Returns a const iterator pointing at the end of the list. |
23324ae1 | 266 | */ |
328f5751 | 267 | const_iterator end() const; |
23324ae1 | 268 | |
23324ae1 | 269 | /** |
d38e30d1 RR |
270 | Returns a iterator pointing at the end of the list. |
271 | */ | |
272 | iterator end() const; | |
273 | ||
274 | /** | |
275 | Erases the given item | |
23324ae1 FM |
276 | */ |
277 | iterator erase(const iterator& it); | |
d38e30d1 RR |
278 | |
279 | /** | |
280 | Erases the items from @e first to @e last. | |
281 | */ | |
7c913512 FM |
282 | iterator erase(const iterator& first, |
283 | const iterator& last); | |
23324ae1 | 284 | |
23324ae1 FM |
285 | /** |
286 | Returns the first item in the list. | |
287 | */ | |
328f5751 | 288 | reference front() const; |
d38e30d1 RR |
289 | |
290 | /** | |
291 | Returns the first item in the list as a const reference. | |
292 | */ | |
328f5751 | 293 | const_reference front() const; |
23324ae1 | 294 | |
23324ae1 | 295 | /** |
d38e30d1 | 296 | Inserts an item at the head of the list |
23324ae1 FM |
297 | */ |
298 | iterator insert(const iterator& it); | |
d38e30d1 RR |
299 | |
300 | /** | |
301 | Inserts an item at the given position | |
302 | */ | |
7c913512 | 303 | void insert(const iterator& it, size_type n); |
d38e30d1 RR |
304 | |
305 | /** | |
306 | Inserts several items at the given position. | |
307 | */ | |
7c913512 FM |
308 | void insert(const iterator& it, const_iterator first, |
309 | const const_iterator& last); | |
23324ae1 FM |
310 | |
311 | /** | |
312 | Returns the largest possible size of the list. | |
313 | */ | |
328f5751 | 314 | size_type max_size() const; |
23324ae1 FM |
315 | |
316 | /** | |
317 | Removes the last item from the list. | |
318 | */ | |
319 | void pop_back(); | |
320 | ||
321 | /** | |
322 | Removes the first item from the list. | |
323 | */ | |
324 | void pop_front(); | |
325 | ||
326 | /** | |
23324ae1 FM |
327 | Adds an item to end of the list. |
328 | */ | |
682f6de6 | 329 | void push_back(const_reference v = value_type()); |
23324ae1 FM |
330 | |
331 | /** | |
23324ae1 FM |
332 | Adds an item to the front of the list. |
333 | */ | |
682f6de6 | 334 | void push_front(const_reference v = value_type()); |
23324ae1 | 335 | |
23324ae1 | 336 | /** |
d38e30d1 | 337 | Returns a reverse iterator pointing to the beginning of the |
23324ae1 FM |
338 | reversed list. |
339 | */ | |
682f6de6 | 340 | reverse_iterator rbegin(); |
d38e30d1 RR |
341 | |
342 | /** | |
343 | Returns a const reverse iterator pointing to the beginning of the | |
344 | reversed list. | |
345 | */ | |
328f5751 | 346 | const_reverse_iterator rbegin() const; |
23324ae1 FM |
347 | |
348 | /** | |
349 | Removes an item from the list. | |
350 | */ | |
351 | void remove(const_reference v); | |
352 | ||
23324ae1 | 353 | /** |
d38e30d1 | 354 | Returns a reverse iterator pointing to the end of the |
23324ae1 FM |
355 | reversed list. |
356 | */ | |
682f6de6 | 357 | reverse_iterator rend(); |
d38e30d1 RR |
358 | |
359 | /** | |
360 | Returns a const reverse iterator pointing to the end of the | |
361 | reversed list. | |
362 | */ | |
328f5751 | 363 | const_reverse_iterator rend() const; |
23324ae1 FM |
364 | |
365 | /** | |
23324ae1 FM |
366 | Resizes the list. If the the list is enlarges items with |
367 | the value @e v are appended to the list. | |
368 | */ | |
369 | void resize(size_type n); | |
370 | ||
371 | /** | |
372 | Reverses the list. | |
373 | */ | |
374 | void reverse(); | |
375 | ||
376 | /** | |
377 | Returns the size of the list. | |
378 | */ | |
328f5751 | 379 | size_type size() const; |
23324ae1 FM |
380 | }; |
381 | ||
382 | ||
e54c96f1 | 383 | |
23324ae1 FM |
384 | /** |
385 | @class wxNode | |
7c913512 FM |
386 | |
387 | wxNodeBase is the node structure used in linked lists (see | |
23324ae1 FM |
388 | wxList) and derived classes. You should never use wxNodeBase |
389 | class directly, however, because it works with untyped (@c void *) data and | |
390 | this is unsafe. Use wxNodeBase-derived classes which are automatically defined | |
391 | by WX_DECLARE_LIST and WX_DEFINE_LIST macros instead as described in | |
392 | wxList documentation (see example there). Also note that | |
393 | although there is a class called wxNode, it is defined for backwards | |
394 | compatibility only and usage of this class is strongly deprecated. | |
7c913512 | 395 | |
23324ae1 | 396 | In the documentation below, the type @c T should be thought of as a |
cdbcf4c2 | 397 | "template" parameter: this is the type of data stored in the linked list or, |
23324ae1 FM |
398 | in other words, the first argument of WX_DECLARE_LIST macro. Also, wxNode is |
399 | written as wxNodeT even though it isn't really a template class -- but it | |
400 | helps to think of it as if it were. | |
7c913512 | 401 | |
23324ae1 FM |
402 | @library{wxbase} |
403 | @category{FIXME} | |
7c913512 | 404 | |
73473b3e | 405 | @see wxList<T>, wxHashTable |
23324ae1 | 406 | */ |
73473b3e | 407 | class wxNode<T> |
23324ae1 FM |
408 | { |
409 | public: | |
410 | /** | |
411 | Retrieves the client data pointer associated with the node. | |
412 | */ | |
328f5751 | 413 | T* GetData() const; |
23324ae1 FM |
414 | |
415 | /** | |
416 | Retrieves the next node or @NULL if this node is the last one. | |
417 | */ | |
5cb947fd | 418 | wxNode<T>* GetNext() const; |
23324ae1 FM |
419 | |
420 | /** | |
421 | Retrieves the previous node or @NULL if this node is the first one in the list. | |
422 | */ | |
5cb947fd | 423 | wxNode<T>* GetPrevious(); |
23324ae1 FM |
424 | |
425 | /** | |
426 | Returns the zero-based index of this node within the list. The return value | |
427 | will be @c wxNOT_FOUND if the node has not been added to a list yet. | |
428 | */ | |
429 | int IndexOf(); | |
430 | ||
431 | /** | |
432 | Sets the data associated with the node (usually the pointer will have been | |
433 | set when the node was created). | |
434 | */ | |
4cc4bfaf | 435 | void SetData(T* data); |
23324ae1 | 436 | }; |
e54c96f1 | 437 |