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