]> git.saurik.com Git - wxWidgets.git/blame - interface/wx/list.h
added template wxScopedArray<> too
[wxWidgets.git] / interface / wx / list.h
CommitLineData
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/**
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
15 iterators return pointers and not references to the actual objets in the list
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
FM
29 that originated from the old wxList class and which can still be used alternatively
30 for the 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}
320ab87c 92 @category{data}
7c913512 93
30767dfe 94 @see wxArray<T>, wxVector<T>, wxNode<T>
23324ae1 95*/
30767dfe 96template<typename T>
7c913512 97class wxList<T>
23324ae1
FM
98{
99public:
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 /**
c6714d38
RR
135 Deletes the given element refered to by @a iter from the list
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 /**
c6714d38 151 Removes element refered to be @a iter.
320ab87c 152
c6714d38 153 Deletes the actualy object if DeleteContents( @true ) was called previously.
23324ae1
FM
154 */
155 void Erase(const compatibility_iterator& iter);
156
157 /**
4cc4bfaf 158 Returns the iterator refering 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 /**
195 Inserts @a object before the object refered to be @a iter.
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 /**
206 Returns the iterator refering 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 /**
6a93e794 212 @deprecated This function is deprecated, use Find() instead.
23324ae1 213 */
5cb947fd 214 wxList<T>::compatibility_iterator Member(T* object) const;
23324ae1
FM
215
216 /**
6a93e794 217 @deprecated This function is deprecated, use Item() instead.
23324ae1 218 */
5cb947fd 219 wxList<T>::compatibility_iterator Nth(int n) const;
23324ae1
FM
220
221 /**
6a93e794 222 @deprecated This function is deprecated, use wxList::GetCount instead.
23324ae1
FM
223 Returns the number of elements in the list.
224 */
328f5751 225 int Number() const;
23324ae1
FM
226
227 /**
228 Allows the sorting of arbitrary lists by giving a function to compare
229 two list elements. We use the system @b qsort function for the actual
230 sorting process.
231 */
232 void Sort(wxSortCompareFunction compfunc);
233
23324ae1 234 /**
c6714d38 235 Clears the list and item from @a first to @a last from another list to it.
23324ae1
FM
236 */
237 void assign(const_iterator first, const const_iterator& last);
c6714d38
RR
238
239 /**
240 Clears the list and adds @a n items with value @a v to it.
241 */
78e37b46 242 void assign(size_type n, const_reference v = value_type());
23324ae1 243
23324ae1
FM
244 /**
245 Returns the last item of the list.
246 */
682f6de6 247 reference back();
d38e30d1
RR
248
249 /**
250 Returns the last item of the list as a const reference.
251 */
328f5751 252 const_reference back() const;
23324ae1 253
23324ae1 254 /**
d38e30d1 255 Returns an iterator pointing to the beginning of the list.
23324ae1 256 */
682f6de6 257 iterator begin();
d38e30d1
RR
258
259 /**
260 Returns a const iterator pointing to the beginning of the list.
261 */
328f5751 262 const_iterator begin() const;
23324ae1
FM
263
264 /**
265 Removes all items from the list.
266 */
267 void clear();
268
269 /**
270 Returns @e @true if the list is empty.
271 */
328f5751 272 bool empty() const;
23324ae1 273
23324ae1 274 /**
d38e30d1 275 Returns a const iterator pointing at the end of the list.
23324ae1 276 */
328f5751 277 const_iterator end() const;
23324ae1 278
23324ae1 279 /**
d38e30d1
RR
280 Returns a iterator pointing at the end of the list.
281 */
282 iterator end() const;
283
284 /**
285 Erases the given item
23324ae1
FM
286 */
287 iterator erase(const iterator& it);
d38e30d1
RR
288
289 /**
290 Erases the items from @e first to @e last.
291 */
7c913512
FM
292 iterator erase(const iterator& first,
293 const iterator& last);
23324ae1 294
23324ae1
FM
295 /**
296 Returns the first item in the list.
297 */
328f5751 298 reference front() const;
d38e30d1
RR
299
300 /**
301 Returns the first item in the list as a const reference.
302 */
328f5751 303 const_reference front() const;
23324ae1 304
23324ae1 305 /**
d38e30d1 306 Inserts an item at the head of the list
23324ae1
FM
307 */
308 iterator insert(const iterator& it);
d38e30d1
RR
309
310 /**
311 Inserts an item at the given position
312 */
7c913512 313 void insert(const iterator& it, size_type n);
d38e30d1
RR
314
315 /**
316 Inserts several items at the given position.
317 */
7c913512
FM
318 void insert(const iterator& it, const_iterator first,
319 const const_iterator& last);
23324ae1
FM
320
321 /**
322 Returns the largest possible size of the list.
323 */
328f5751 324 size_type max_size() const;
23324ae1
FM
325
326 /**
327 Removes the last item from the list.
328 */
329 void pop_back();
330
331 /**
332 Removes the first item from the list.
333 */
334 void pop_front();
335
336 /**
23324ae1
FM
337 Adds an item to end of the list.
338 */
682f6de6 339 void push_back(const_reference v = value_type());
23324ae1
FM
340
341 /**
23324ae1
FM
342 Adds an item to the front of the list.
343 */
682f6de6 344 void push_front(const_reference v = value_type());
23324ae1 345
23324ae1 346 /**
d38e30d1 347 Returns a reverse iterator pointing to the beginning of the
23324ae1
FM
348 reversed list.
349 */
682f6de6 350 reverse_iterator rbegin();
d38e30d1
RR
351
352 /**
353 Returns a const reverse iterator pointing to the beginning of the
354 reversed list.
355 */
328f5751 356 const_reverse_iterator rbegin() const;
23324ae1
FM
357
358 /**
359 Removes an item from the list.
360 */
361 void remove(const_reference v);
362
23324ae1 363 /**
6a93e794 364 Returns a reverse iterator pointing to the end of the reversed list.
23324ae1 365 */
682f6de6 366 reverse_iterator rend();
d38e30d1
RR
367
368 /**
6a93e794 369 Returns a const reverse iterator pointing to the end of the reversed list.
d38e30d1 370 */
328f5751 371 const_reverse_iterator rend() const;
23324ae1
FM
372
373 /**
6a93e794 374 Resizes the list.
e3d1fc26
FM
375
376 If the list is longer than @a n, then items are removed until the list
377 becomes long @a n.
378 If the list is shorter than @a n items with the value @a v are appended
379 to the list until the list becomes long @a n.
23324ae1 380 */
e3d1fc26 381 void resize(size_type n, value_type v = value_type());
23324ae1
FM
382
383 /**
384 Reverses the list.
385 */
386 void reverse();
387
388 /**
389 Returns the size of the list.
390 */
328f5751 391 size_type size() const;
23324ae1
FM
392};
393
394
e54c96f1 395
23324ae1 396/**
30767dfe
FM
397 wxNode<T> is the node structure used in linked lists (see wxList) and derived
398 classes. You should never use wxNode<T> class directly, however, because it
6a93e794 399 works with untyped (@c void *) data and this is unsafe.
30767dfe 400 Use wxNode<T>-derived classes which are automatically defined by WX_DECLARE_LIST
6a93e794
FM
401 and WX_DEFINE_LIST macros instead as described in wxList documentation
402 (see example there).
403
404 Also note that although there is a class called wxNode, it is defined for backwards
23324ae1 405 compatibility only and usage of this class is strongly deprecated.
7c913512 406
23324ae1 407 In the documentation below, the type @c T should be thought of as a
cdbcf4c2 408 "template" parameter: this is the type of data stored in the linked list or,
23324ae1
FM
409 in other words, the first argument of WX_DECLARE_LIST macro. Also, wxNode is
410 written as wxNodeT even though it isn't really a template class -- but it
411 helps to think of it as if it were.
7c913512 412
30767dfe
FM
413 @tparam T
414 The type stored in the wxNode.
415
23324ae1 416 @library{wxbase}
6a93e794 417 @category{data}
7c913512 418
73473b3e 419 @see wxList<T>, wxHashTable
23324ae1 420*/
30767dfe 421template<typename T>
73473b3e 422class wxNode<T>
23324ae1
FM
423{
424public:
425 /**
426 Retrieves the client data pointer associated with the node.
427 */
328f5751 428 T* GetData() const;
23324ae1
FM
429
430 /**
431 Retrieves the next node or @NULL if this node is the last one.
432 */
5cb947fd 433 wxNode<T>* GetNext() const;
23324ae1
FM
434
435 /**
436 Retrieves the previous node or @NULL if this node is the first one in the list.
437 */
5cb947fd 438 wxNode<T>* GetPrevious();
23324ae1
FM
439
440 /**
441 Returns the zero-based index of this node within the list. The return value
442 will be @c wxNOT_FOUND if the node has not been added to a list yet.
443 */
444 int IndexOf();
445
446 /**
447 Sets the data associated with the node (usually the pointer will have been
448 set when the node was created).
449 */
4cc4bfaf 450 void SetData(T* data);
23324ae1 451};
e54c96f1 452