]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/array.tex
split wxSizer::Fit() into ComputeFittingWindow/ClientSize() that only does computatio...
[wxWidgets.git] / docs / latex / wx / array.tex
CommitLineData
1ac74d83
WS
1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2%% Name: array.tex
3%% Purpose: wxArray
4%% Author: wxWidgets Team
5%% Modified by:
6%% Created:
7%% RCS-ID: $Id$
8%% Copyright: (c) wxWidgets Team
9%% License: wxWindows license
10%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11
44f2a3d1 12\section{\class{wxArray<T>}}\label{wxarray}
6e6110ee 13
247aba10 14This section describes the so called {\it dynamic arrays}. This is a C
44f2a3d1 15array-like type safe data structure i.e. the member access time is constant (and not
06ad8636 16linear according to the number of container elements as for linked lists). However, these
247aba10
VZ
17arrays are dynamic in the sense that they will automatically allocate more
18memory if there is not enough of it for adding a new element. They also perform
19range checking on the index values but in debug mode only, so please be sure to
437c49b2
JS
20compile your application in debug mode to use it (see \helpref{debugging overview}{debuggingoverview} for
21details). So, unlike the arrays in some other
247aba10
VZ
22languages, attempt to access an element beyond the arrays bound doesn't
23automatically expand the array but provokes an assertion failure instead in
24debug build and does nothing (except possibly crashing your program) in the
25release build.
26
27The array classes were designed to be reasonably efficient, both in terms of
28run-time speed and memory consumption and the executable size. The speed of
06ad8636 29array item access is, of course, constant (independent of the number of elements)
247aba10
VZ
30making them much more efficient than linked lists (\helpref{wxList}{wxlist}).
31Adding items to the arrays is also implemented in more or less constant time -
437c49b2
JS
32but the price is preallocating the memory in advance. In the \helpref{memory management}{wxarraymemorymanagement} section
33you may find some useful hints about optimizing wxArray memory usage. As for executable size, all
247aba10
VZ
34wxArray functions are inline, so they do not take {\it any space at all}.
35
fc2171bd 36wxWidgets has three different kinds of array. All of them derive from
247aba10
VZ
37wxBaseArray class which works with untyped data and can not be used directly.
38The standard macros WX\_DEFINE\_ARRAY(), WX\_DEFINE\_SORTED\_ARRAY() and
39WX\_DEFINE\_OBJARRAY() are used to define a new class deriving from it. The
40classes declared will be called in this documentation wxArray, wxSortedArray and
41wxObjArray but you should keep in mind that no classes with such names actually
42exist, each time you use one of WX\_DEFINE\_XXXARRAY macro you define a class
43with a new name. In fact, these names are "template" names and each usage of one
44of the macros mentioned above creates a template specialization for the given
45element type.
46
47wxArray is suitable for storing integer types and pointers which it does not
48treat as objects in any way, i.e. the element pointed to by the pointer is not
06ad8636
JS
49deleted when the element is removed from the array. It should be noted that
50all of wxArray's functions are inline, so it costs strictly nothing to define as
247aba10
VZ
51many array types as you want (either in terms of the executable size or the
52speed) as long as at least one of them is defined and this is always the case
fc2171bd 53because wxArrays are used by wxWidgets internally. This class has one serious
b2ff82b9
VZ
54limitation: it can only be used for storing integral types (bool, char, short,
55int, long and their unsigned variants) or pointers (of any kind). An attempt
56to use with objects of sizeof() greater than sizeof(long) will provoke a
57runtime assertion failure, however declaring a wxArray of floats will not (on
58the machines where sizeof(float) <= sizeof(long)), yet it will {\bf not} work,
e0da84df 59please use wxObjArray for storing floats and doubles.
247aba10
VZ
60
61wxSortedArray is a wxArray variant which should be used when searching in the
62array is a frequently used operation. It requires you to define an additional
63function for comparing two elements of the array element type and always stores
1ac74d83 64its items in the sorted order (according to this function). Thus, it is
437c49b2 65 \helpref{Index()}{wxarrayindex} function execution time is $O(log(N))$ instead of
247aba10
VZ
66$O(N)$ for the usual arrays but the \helpref{Add()}{wxarrayadd} method is
67slower: it is $O(log(N))$ instead of constant time (neglecting time spent in
68memory allocation routine). However, in a usual situation elements are added to
69an array much less often than searched inside it, so wxSortedArray may lead to
d1b5756b 70huge performance improvements compared to wxArray. Finally, it should be
b2ff82b9
VZ
71noticed that, as wxArray, wxSortedArray can be only used for storing integral
72types or pointers.
247aba10
VZ
73
74wxObjArray class treats its elements like "objects". It may delete them when
75they are removed from the array (invoking the correct destructor) and copies
76them using the objects copy constructor. In order to implement this behaviour
77the definition of the wxObjArray arrays is split in two parts: first, you should
78declare the new wxObjArray class using WX\_DECLARE\_OBJARRAY() macro and then
79you must include the file defining the implementation of template type:
80<wx/arrimpl.cpp> and define the array class with WX\_DEFINE\_OBJARRAY() macro
81from a point where the full (as opposed to `forward') declaration of the array
82elements class is in scope. As it probably sounds very complicated here is an
83example:
84
85\begin{verbatim}
86#include <wx/dynarray.h>
87
f6bcfd97 88// we must forward declare the array because it is used inside the class
247aba10
VZ
89// declaration
90class MyDirectory;
91class MyFile;
92
93// this defines two new types: ArrayOfDirectories and ArrayOfFiles which can be
94// now used as shown below
95WX_DECLARE_OBJARRAY(MyDirectory, ArrayOfDirectories);
96WX_DECLARE_OBJARRAY(MyFile, ArrayOfFiles);
97
98class MyDirectory
99{
100...
101 ArrayOfDirectories m_subdirectories; // all subdirectories
102 ArrayOfFiles m_files; // all files in this directory
103};
104
105...
106
107// now that we have MyDirectory declaration in scope we may finish the
43c9c17d
VZ
108// definition of ArrayOfDirectories -- note that this expands into some C++
109// code and so should only be compiled once (i.e., don't put this in the
2edb0bde 110// header, but into a source file or you will get linking errors)
247aba10
VZ
111#include <wx/arrimpl.cpp> // this is a magic incantation which must be done!
112WX_DEFINE_OBJARRAY(ArrayOfDirectories);
113
114// that's all!
247aba10
VZ
115\end{verbatim}
116
117It is not as elegant as writing
118
1ac74d83 119\begin{verbatim}
247aba10
VZ
120typedef std::vector<MyDirectory> ArrayOfDirectories;
121\end{verbatim}
437c49b2 122
247aba10
VZ
123but is not that complicated and allows the code to be compiled with any, however
124dumb, C++ compiler in the world.
125
6b837d4c
VZ
126Remember to #include <wx/arrimpl.cpp> just before each WX\_DEFINE\_OBJARRAY
127ocurrence in your code, even if you have several in the same file.
128
06ad8636 129Things are much simpler for wxArray and wxSortedArray however: it is enough
247aba10
VZ
130just to write
131
1ac74d83 132\begin{verbatim}
5dafb071
VZ
133WX_DEFINE_ARRAY_INT(int, ArrayOfInts);
134WX_DEFINE_SORTED_ARRAY_INT(int, ArrayOfSortedInts);
247aba10
VZ
135\end{verbatim}
136
1ac74d83 137i.e. there is only one {\tt DEFINE} macro and no need for separate
719bc6fa
VZ
138{\tt DECLARE} one. For the arrays of the primitive types, the macros
139{\tt WX\_DEFINE\_ARRAY\_CHAR/SHORT/INT/SIZE\_T/LONG/DOUBLE} should be used
140depending on the sizeof of the values (notice that storing values of smaller
141type, e.g. shorts, in an array of larger one, e.g. {\tt ARRAY\_INT}, does
142\emph{not} work on all architectures!).
1cc603c1
VZ
143
144
2706e543 145\wxheading{See also}
247aba10 146
44f2a3d1
RR
147\helpref{Container classes overview}{wxcontaineroverview},
148\helpref{wxList<T>}{wxlist},
149\helpref{wxVector<T>}{wxvector}
247aba10 150
babc9758 151\wxheading{Include files}
247aba10
VZ
152
153<wx/dynarray.h> for wxArray and wxSortedArray and additionally <wx/arrimpl.cpp>
154for wxObjArray.
155
2706e543
FM
156\wxheading{Library}
157
158\helpref{wxBase}{librarieslist}
159
160
161
162
247aba10
VZ
163\latexignore{\rtfignore{\wxheading{Function groups}}}
164
f510b7b2 165\membersection{Macros for template array definition}\label{arraymacros}
247aba10
VZ
166
167To use an array you must first define the array class. This is done with the
168help of the macros in this section. The class of array elements must be (at
169least) forward declared for WX\_DEFINE\_ARRAY, WX\_DEFINE\_SORTED\_ARRAY and
170WX\_DECLARE\_OBJARRAY macros and must be fully declared before you use
171WX\_DEFINE\_OBJARRAY macro.
172
173\helpref{WX\_DEFINE\_ARRAY}{wxdefinearray}\\
fbd27854 174\helpref{WX\_DEFINE\_EXPORTED\_ARRAY}{wxdefinearray}\\
a9241e60 175\helpref{WX\_DEFINE\_USER\_EXPORTED\_ARRAY}{wxdefinearray}\\
247aba10 176\helpref{WX\_DEFINE\_SORTED\_ARRAY}{wxdefinesortedarray}\\
fbd27854 177\helpref{WX\_DEFINE\_SORTED\_EXPORTED\_ARRAY}{wxdefinesortedarray}\\
a9241e60 178\helpref{WX\_DEFINE\_SORTED\_USER\_EXPORTED\_ARRAY}{wxdefinesortedarray}\\
fbd27854 179\helpref{WX\_DECLARE\_EXPORTED\_OBJARRAY}{wxdeclareobjarray}\\
a9241e60
RL
180\helpref{WX\_DECLARE\_USER\_EXPORTED\_OBJARRAY}{wxdeclareobjarray}\\
181\helpref{WX\_DEFINE\_OBJARRAY}{wxdefineobjarray}\\
182\helpref{WX\_DEFINE\_EXPORTED\_OBJARRAY}{wxdefineobjarray}\\
183\helpref{WX\_DEFINE\_USER\_EXPORTED\_OBJARRAY}{wxdefineobjarray}
247aba10 184
1cc603c1
VZ
185To slightly complicate the matters even further, the operator $->$ defined by
186default for the array iterators by these macros only makes sense if the array
187element type is not a pointer itself and, although it still works, this
1ac74d83 188provokes warnings from some compilers and to avoid them you should use the
1cc603c1 189{\tt \_PTR} versions of the macros above. For example, to define an array of
1ac74d83 190pointers to {\tt double} you should use:
dcb68102 191
1ac74d83
WS
192\begin{verbatim}
193WX_DEFINE_ARRAY_PTR(double *, MyArrayOfDoublePointers);
194\end{verbatim}
195
196Note that the above macros are generally only useful for
197wxObject types. There are separate macros for declaring an array of a simple type,
dcb68102
RN
198such as an int.
199
cabf7af2 200The following simple types are supported:\\
dcb68102
RN
201int\\
202long\\
0ea62c21 203size\_t\\
dcb68102
RN
204double
205
206To create an array of a simple type, simply append the type you want in CAPS to
207the array definition.
208
209For example, for an integer array, you'd use one of the following variants:
210
211\helpref{WX\_DEFINE\_ARRAY\_INT}{wxdefinearray}\\
212\helpref{WX\_DEFINE\_EXPORTED\_ARRAY\_INT}{wxdefinearray}\\
213\helpref{WX\_DEFINE\_USER\_EXPORTED\_ARRAY\_INT}{wxdefinearray}\\
214\helpref{WX\_DEFINE\_SORTED\_ARRAY\_INT}{wxdefinesortedarray}\\
215\helpref{WX\_DEFINE\_SORTED\_EXPORTED\_ARRAY\_INT}{wxdefinesortedarray}\\
216\helpref{WX\_DEFINE\_SORTED\_USER\_EXPORTED\_ARRAY\_INT}{wxdefinesortedarray}\\
1cc603c1 217
f510b7b2 218\membersection{Constructors and destructors}\label{arrayconstructorsdestructors}
247aba10
VZ
219
220Array classes are 100\% C++ objects and as such they have the appropriate copy
221constructors and assignment operators. Copying wxArray just copies the elements
222but copying wxObjArray copies the arrays items. However, for memory-efficiency
223sake, neither of these classes has virtual destructor. It is not very important
224for wxArray which has trivial destructor anyhow, but it does mean that you
225should avoid deleting wxObjArray through a wxBaseArray pointer (as you would
226never use wxBaseArray anyhow it shouldn't be a problem) and that you should not
227derive your own classes from the array classes.
228
437c49b2
JS
229\helpref{wxArray default constructor}{wxarrayctordef}\\
230\helpref{wxArray copy constructors and assignment operators}{wxarrayctorcopy}\\
247aba10
VZ
231\helpref{\destruct{wxArray}}{wxarraydtor}
232
233\membersection{Memory management}\label{wxarraymemorymanagement}
234
235Automatic array memory management is quite trivial: the array starts by
236preallocating some minimal amount of memory (defined by
237WX\_ARRAY\_DEFAULT\_INITIAL\_SIZE) and when further new items exhaust already
238allocated memory it reallocates it adding 50\% of the currently allocated
239amount, but no more than some maximal number which is defined by
240ARRAY\_MAXSIZE\_INCREMENT constant. Of course, this may lead to some memory
241being wasted (ARRAY\_MAXSIZE\_INCREMENT in the worst case, i.e. 4Kb in the
437c49b2 242current implementation), so the \helpref{Shrink()}{wxarrayshrink} function is
1ac74d83 243provided to deallocate the extra memory. The \helpref{Alloc()}{wxarrayalloc}
247aba10
VZ
244function can also be quite useful if you know in advance how many items you are
245going to put in the array and will prevent the array code from reallocating the
246memory more times than needed.
247
248\helpref{Alloc}{wxarrayalloc}\\
249\helpref{Shrink}{wxarrayshrink}
250
f510b7b2 251\membersection{Number of elements and simple item access}\label{arrayelementsaccess}
247aba10
VZ
252
253Functions in this section return the total number of array elements and allow to
254retrieve them - possibly using just the C array indexing $[]$ operator which
255does exactly the same as \helpref{Item()}{wxarrayitem} method.
256
247aba10
VZ
257\helpref{GetCount}{wxarraygetcount}\\
258\helpref{IsEmpty}{wxarrayisempty}\\
259\helpref{Item}{wxarrayitem}\\
260\helpref{Last}{wxarraylast}
261
f510b7b2 262\membersection{Adding items}\label{arrayadding}
437c49b2 263
247aba10 264\helpref{Add}{wxarrayadd}\\
6b837d4c 265\helpref{AddAt}{wxarrayaddat}\\
4f6aed9c 266\helpref{Insert}{wxarrayinsert}\\
2abb9d2f 267\helpref{SetCount}{wxarraysetcount}\\
e38f59e8
VZ
268\helpref{WX\_APPEND\_ARRAY}{wxappendarray}\\
269\helpref{WX\_PREPEND\_ARRAY}{wxprependarray}
247aba10 270
f510b7b2 271\membersection{Removing items}\label{arrayremoving}
437c49b2 272
247aba10
VZ
273\helpref{WX\_CLEAR\_ARRAY}{wxcleararray}\\
274\helpref{Empty}{wxarrayempty}\\
275\helpref{Clear}{wxarrayclear}\\
8a729bb8 276\helpref{RemoveAt}{wxarrayremoveat}\\
247aba10
VZ
277\helpref{Remove}{wxarrayremove}
278
f510b7b2 279\membersection{Searching and sorting}\label{arraysearchingandsorting}
437c49b2 280
247aba10 281\helpref{Index}{wxarrayindex}\\
6b837d4c 282\helpref{IndexForInsert}{wxarrayindexforinsert}\\
247aba10
VZ
283\helpref{Sort}{wxarraysort}
284
285%%%%% MEMBERS HERE %%%%%
286\helponly{\insertatlevel{2}{
287
288\wxheading{Members}
289
290}}
291
292\membersection{WX\_DEFINE\_ARRAY}\label{wxdefinearray}
437c49b2 293
06ad8636 294\func{}{WX\_DEFINE\_ARRAY}{\param{}{T}, \param{}{name}}
247aba10 295
fbd27854
VS
296\func{}{WX\_DEFINE\_EXPORTED\_ARRAY}{\param{}{T}, \param{}{name}}
297
a9241e60
RL
298\func{}{WX\_DEFINE\_USER\_EXPORTED\_ARRAY}{\param{}{T}, \param{}{name}, \param{}{exportspec}}
299
247aba10 300This macro defines a new array class named {\it name} and containing the
fc2171bd 301elements of type {\it T}. The second form is used when compiling wxWidgets as
a9241e60
RL
302a DLL under Windows and array needs to be visible outside the DLL. The third is
303needed for exporting an array from a user DLL.
304
fbd27854 305Example:
437c49b2 306
247aba10 307\begin{verbatim}
7d9d249b 308WX_DEFINE_ARRAY_INT(int, MyArrayInt);
247aba10
VZ
309
310class MyClass;
7d9d249b 311WX_DEFINE_ARRAY(MyClass *, ArrayOfMyClass);
247aba10
VZ
312\end{verbatim}
313
e0da84df
VZ
314Note that wxWidgets predefines the following standard array classes: {\bf wxArrayInt},
315{\bf wxArrayLong}, {\bf wxArrayShort}, {\bf wxArrayDouble}, {\bf wxArrayPtrVoid}.
316
247aba10
VZ
317
318\membersection{WX\_DEFINE\_SORTED\_ARRAY}\label{wxdefinesortedarray}
437c49b2
JS
319
320\func{}{WX\_DEFINE\_SORTED\_ARRAY}{\param{}{T}, \param{}{name}}
247aba10 321
fbd27854
VS
322\func{}{WX\_DEFINE\_SORTED\_EXPORTED\_ARRAY}{\param{}{T}, \param{}{name}}
323
a9241e60
RL
324\func{}{WX\_DEFINE\_SORTED\_USER\_EXPORTED\_ARRAY}{\param{}{T}, \param{}{name}}
325
247aba10 326This macro defines a new sorted array class named {\it name} and containing
fc2171bd 327the elements of type {\it T}. The second form is used when compiling wxWidgets as
a9241e60
RL
328a DLL under Windows and array needs to be visible outside the DLL. The third is
329needed for exporting an array from a user DLL.
fbd27854 330
fbd27854 331Example:
437c49b2 332
247aba10 333\begin{verbatim}
7d9d249b 334WX_DEFINE_SORTED_ARRAY_INT(int, MySortedArrayInt);
247aba10
VZ
335
336class MyClass;
7d9d249b 337WX_DEFINE_SORTED_ARRAY(MyClass *, ArrayOfMyClass);
247aba10
VZ
338\end{verbatim}
339
f6bcfd97 340You will have to initialize the objects of this class by passing a comparison
247aba10 341function to the array object constructor like this:
fa482912 342
247aba10
VZ
343\begin{verbatim}
344int CompareInts(int n1, int n2)
345{
346 return n1 - n2;
347}
348
6b837d4c 349MySortedArrayInt sorted(CompareInts);
247aba10
VZ
350
351int CompareMyClassObjects(MyClass *item1, MyClass *item2)
352{
353 // sort the items by their address...
354 return Stricmp(item1->GetAddress(), item2->GetAddress());
355}
356
6b837d4c 357ArrayOfMyClass another(CompareMyClassObjects);
247aba10
VZ
358\end{verbatim}
359
360\membersection{WX\_DECLARE\_OBJARRAY}\label{wxdeclareobjarray}
437c49b2
JS
361
362\func{}{WX\_DECLARE\_OBJARRAY}{\param{}{T}, \param{}{name}}
247aba10 363
fbd27854
VS
364\func{}{WX\_DECLARE\_EXPORTED\_OBJARRAY}{\param{}{T}, \param{}{name}}
365
a9241e60
RL
366\func{}{WX\_DECLARE\_USER\_EXPORTED\_OBJARRAY}{\param{}{T}, \param{}{name}}
367
247aba10 368This macro declares a new object array class named {\it name} and containing
fc2171bd 369the elements of type {\it T}. The second form is used when compiling wxWidgets as
a9241e60
RL
370a DLL under Windows and array needs to be visible outside the DLL. The third is
371needed for exporting an array from a user DLL.
fbd27854
VS
372
373Example:
6be663cf 374
247aba10
VZ
375\begin{verbatim}
376class MyClass;
4756503a 377WX_DECLARE_OBJARRAY(MyClass, wxArrayOfMyClass); // note: not "MyClass *"!
247aba10 378\end{verbatim}
6be663cf 379
247aba10
VZ
380You must use \helpref{WX\_DEFINE\_OBJARRAY()}{wxdefineobjarray} macro to define
381the array class - otherwise you would get link errors.
382
383\membersection{WX\_DEFINE\_OBJARRAY}\label{wxdefineobjarray}
437c49b2
JS
384
385\func{}{WX\_DEFINE\_OBJARRAY}{\param{}{name}}
247aba10 386
a9241e60
RL
387\func{}{WX\_DEFINE\_EXPORTED\_OBJARRAY}{\param{}{name}}
388
389\func{}{WX\_DEFINE\_USER\_EXPORTED\_OBJARRAY}{\param{}{name}}
390
1ac74d83 391This macro defines the methods of the array class {\it name} not defined by the
247aba10
VZ
392\helpref{WX\_DECLARE\_OBJARRAY()}{wxdeclareobjarray} macro. You must include the
393file <wx/arrimpl.cpp> before using this macro and you must have the full
1ac74d83 394declaration of the class of array elements in scope! If you forget to do the
247aba10
VZ
395first, the error will be caught by the compiler, but, unfortunately, many
396compilers will not give any warnings if you forget to do the second - but the
397objects of the class will not be copied correctly and their real destructor will
a9241e60
RL
398not be called. The latter two forms are merely aliases of the first to satisfy
399some people's sense of symmetry when using the exported declarations.
247aba10
VZ
400
401Example of usage:
437c49b2 402
247aba10
VZ
403\begin{verbatim}
404// first declare the class!
405class MyClass
406{
407public:
408 MyClass(const MyClass&);
409
410 ...
411
412 virtual ~MyClass();
413};
414
415#include <wx/arrimpl.cpp>
416WX_DEFINE_OBJARRAY(wxArrayOfMyClass);
417\end{verbatim}
418
4f6aed9c
VZ
419\membersection{WX\_APPEND\_ARRAY}\label{wxappendarray}
420
421\func{void}{WX\_APPEND\_ARRAY}{\param{wxArray\& }{array}, \param{wxArray\& }{other}}
422
1ac74d83 423This macro may be used to append all elements of the {\it other} array to the
4f6aed9c
VZ
424{\it array}. The two arrays must be of the same type.
425
e38f59e8
VZ
426\membersection{WX\_PREPEND\_ARRAY}\label{wxprependarray}
427
428\func{void}{WX\_PREPEND\_ARRAY}{\param{wxArray\& }{array}, \param{wxArray\& }{other}}
429
430This macro may be used to prepend all elements of the {\it other} array to the
431{\it array}. The two arrays must be of the same type.
432
247aba10 433\membersection{WX\_CLEAR\_ARRAY}\label{wxcleararray}
437c49b2 434
e2a6f233 435\func{void}{WX\_CLEAR\_ARRAY}{\param{wxArray\& }{array}}
247aba10
VZ
436
437This macro may be used to delete all elements of the array before emptying it.
438It can not be used with wxObjArrays - but they will delete their elements anyhow
439when you call Empty().
440
6be663cf 441\membersection{Default constructors}\label{wxarrayctordef}
437c49b2 442
e2a6f233 443\func{}{wxArray}{\void}
437c49b2 444
e2a6f233 445\func{}{wxObjArray}{\void}
247aba10
VZ
446
447Default constructor initializes an empty array object.
448
449\func{}{wxSortedArray}{\param{int (*)(T first, T second)}{compareFunction}}
450
451There is no default constructor for wxSortedArray classes - you must initialize it
f6bcfd97 452with a function to use for item comparison. It is a function which is passed
247aba10
VZ
453two arguments of type {\it T} where {\it T} is the array element type and which
454should return a negative, zero or positive value according to whether the first
455element passed to it is less than, equal to or greater than the second one.
456
6be663cf 457\membersection{wxArray copy constructor and assignment operator}\label{wxarrayctorcopy}
437c49b2 458
247aba10 459\func{}{wxArray}{\param{const wxArray\& }{array}}
437c49b2 460
247aba10 461\func{}{wxSortedArray}{\param{const wxSortedArray\& }{array}}
437c49b2 462
247aba10
VZ
463\func{}{wxObjArray}{\param{const wxObjArray\& }{array}}
464
06ad8636 465\func{wxArray\&}{operator$=$}{\param{const wxArray\& }{array}}
437c49b2 466
06ad8636 467\func{wxSortedArray\&}{operator$=$}{\param{const wxSortedArray\& }{array}}
437c49b2 468
06ad8636 469\func{wxObjArray\&}{operator$=$}{\param{const wxObjArray\& }{array}}
247aba10
VZ
470
471The copy constructors and assignment operators perform a shallow array copy
472(i.e. they don't copy the objects pointed to even if the source array contains
473the items of pointer type) for wxArray and wxSortedArray and a deep copy (i.e.
474the array element are copied too) for wxObjArray.
475
476\membersection{wxArray::\destruct{wxArray}}\label{wxarraydtor}
437c49b2 477
06ad8636 478\func{}{\destruct{wxArray}}{\void}
437c49b2 479
06ad8636 480\func{}{\destruct{wxSortedArray}}{\void}
437c49b2 481
06ad8636 482\func{}{\destruct{wxObjArray}}{\void}
247aba10
VZ
483
484The wxObjArray destructor deletes all the items owned by the array. This is not
1ac74d83 485done by wxArray and wxSortedArray versions - you may use
247aba10
VZ
486\helpref{WX\_CLEAR\_ARRAY}{wxcleararray} macro for this.
487
488\membersection{wxArray::Add}\label{wxarrayadd}
437c49b2 489
2863d6b0 490\func{void}{Add}{\param{T }{item}, \param{size\_t}{ copies = $1$}}
437c49b2 491
6b837d4c
VZ
492\func{size\_t}{Add}{\param{T }{item}}
493
e2a6f233 494\func{void}{Add}{\param{T *}{item}}
437c49b2 495
2863d6b0 496\func{void}{Add}{\param{T \&}{item}, \param{size\_t}{ copies = $1$}}
247aba10 497
2863d6b0
VZ
498Appends the given number of {\it copies} of the {\it item} to the array
499consisting of the elements of type {\it T}.
247aba10 500
6b837d4c
VZ
501The first version is used with wxArray. The second is used with wxSortedArray,
502returning the index where {\it item} is stored. The third and the
503fourth ones are used with wxObjArray. There is an important difference between
247aba10
VZ
504them: if you give a pointer to the array, it will take ownership of it, i.e.
505will delete it when the item is deleted from the array. If you give a reference
506to the array, however, the array will make a copy of the item and will not take
507ownership of the original item. Once again, it only makes sense for wxObjArrays
2863d6b0
VZ
508because the other array types never take ownership of their elements. Also note
509that you cannot append more than one pointer as reusing it would lead to
510deleting it twice (or more) and hence to a crash.
247aba10 511
4f6aed9c 512You may also use \helpref{WX\_APPEND\_ARRAY}{wxappendarray} macro to append all
1ac74d83 513elements of one array to another one but it is more efficient to use
2863d6b0
VZ
514{\it copies} parameter and modify the elements in place later if you plan to
515append a lot of items.
4f6aed9c 516
6b837d4c
VZ
517\membersection{wxSortedArray::AddAt}\label{wxarrayaddat}
518
519\func{void}{AddAt}{\param{T }{item}, \param{size\_t}{ index}}
520
521Inserts the given {\it item} into the array in the specified {\it index}
522 position.
523
524Be aware that you will set out the order of the array if you give a wrong
525 position.
526
527This function is useful in conjunction with
528\helpref{IndexForInsert}{wxarrayindexforinsert} for a common operation
529of "insert only if not found".
530
247aba10 531\membersection{wxArray::Alloc}\label{wxarrayalloc}
437c49b2 532
e2a6f233 533\func{void}{Alloc}{\param{size\_t }{count}}
247aba10
VZ
534
535Preallocates memory for a given number of array elements. It is worth calling
536when the number of items which are going to be added to the array is known in
537advance because it will save unneeded memory reallocation. If the array already
7788fc40
VZ
538has enough memory for the given number of items, nothing happens. In any case,
539the existing contents of the array is not modified.
247aba10
VZ
540
541\membersection{wxArray::Clear}\label{wxarrayclear}
437c49b2 542
e2a6f233 543\func{void}{Clear}{\void}
247aba10
VZ
544
545This function does the same as \helpref{Empty()}{wxarrayempty} and additionally
546frees the memory allocated to the array.
547
247aba10 548\membersection{wxObjArray::Detach}\label{wxobjarraydetach}
437c49b2 549
247aba10
VZ
550\func{T *}{Detach}{\param{size\_t }{index}}
551
1ac74d83 552Removes the element from the array, but, unlike,
247aba10
VZ
553\helpref{Remove()}{wxarrayremove} doesn't delete it. The function returns the
554pointer to the removed element.
555
556\membersection{wxArray::Empty}\label{wxarrayempty}
437c49b2 557
e2a6f233 558\func{void}{Empty}{\void}
247aba10
VZ
559
560Empties the array. For wxObjArray classes, this destroys all of the array
561elements. For wxArray and wxSortedArray this does nothing except marking the
1ac74d83 562array of being empty - this function does not free the allocated memory, use
247aba10
VZ
563\helpref{Clear()}{wxarrayclear} for this.
564
565\membersection{wxArray::GetCount}\label{wxarraygetcount}
437c49b2 566
247aba10
VZ
567\constfunc{size\_t}{GetCount}{\void}
568
569Return the number of items in the array.
570
571\membersection{wxArray::Index}\label{wxarrayindex}
437c49b2 572
bd8bd26a 573\constfunc{int}{Index}{\param{T\& }{item}, \param{bool }{searchFromEnd = false}}
437c49b2 574
bd8bd26a 575\constfunc{int}{Index}{\param{T\& }{item}}
247aba10
VZ
576
577The first version of the function is for wxArray and wxObjArray, the second is
578for wxSortedArray only.
579
580Searches the element in the array, starting from either beginning or the end
a8d08dbd 581depending on the value of {\it searchFromEnd} parameter. {\tt wxNOT\_FOUND} is
247aba10
VZ
582returned if the element is not found, otherwise the index of the element is
583returned.
584
585Linear search is used for the wxArray and wxObjArray classes but binary search
586in the sorted array is used for wxSortedArray (this is why searchFromEnd
587parameter doesn't make sense for it).
588
2cd31b57
VZ
589{\bf NB:} even for wxObjArray classes, the operator==() of the elements in the
590array is {\bf not} used by this function. It searches exactly the given
591element in the array and so will only succeed if this element had been
592previously added to the array, but fail even if another, identical, element is
593in the array.
594
6b837d4c
VZ
595\membersection{wxSortedArray::IndexForInsert}\label{wxarrayindexforinsert}
596
597\constfunc{size\_t}{IndexForInsert}{\param{T }{item}}
598
599Search for a place to insert {\it item} into the sorted array (binary search).
600The index returned is just before the first existing item that is greater or equal
601(according to the compare function) to the given {\it item}.
602
603You have to do extra work to know if the {\it item} already exists in array.
604
605This function is useful in conjunction with
606\helpref{AddAt}{wxarrayaddat} for a common operation
607of "insert only if not found".
608
247aba10 609\membersection{wxArray::Insert}\label{wxarrayinsert}
437c49b2 610
2863d6b0 611\func{void}{Insert}{\param{T }{item}, \param{size\_t }{n}, \param{size\_t }{copies = $1$}}
437c49b2 612
e2a6f233 613\func{void}{Insert}{\param{T *}{item}, \param{size\_t }{n}}
437c49b2 614
2863d6b0 615\func{void}{Insert}{\param{T \&}{item}, \param{size\_t }{n}, \param{size\_t }{copies = $1$}}
247aba10 616
2863d6b0
VZ
617Insert the given number of {\it copies} of the {\it item} into the array before
618the existing item {\it n} - thus, {\it Insert(something, 0u)} will insert an
619item in such way that it will become the first array element.
247aba10 620
6b837d4c
VZ
621wxSortedArray doesn't have this function because inserting in wrong place
622would break its sorted condition.
623
247aba10
VZ
624Please see \helpref{Add()}{wxarrayadd} for explanation of the differences
625between the overloaded versions of this function.
626
627\membersection{wxArray::IsEmpty}\label{wxarrayisempty}
437c49b2 628
e2a6f233 629\constfunc{bool}{IsEmpty}{\void}
247aba10 630
cc81d32f 631Returns true if the array is empty, false otherwise.
247aba10
VZ
632
633\membersection{wxArray::Item}\label{wxarrayitem}
437c49b2 634
247aba10
VZ
635\constfunc{T\&}{Item}{\param{size\_t }{index}}
636
637Returns the item at the given position in the array. If {\it index} is out of
638bounds, an assert failure is raised in the debug builds but nothing special is
639done in the release build.
640
641The returned value is of type "reference to the array element type" for all of
642the array classes.
643
644\membersection{wxArray::Last}\label{wxarraylast}
437c49b2 645
247aba10
VZ
646\constfunc{T\&}{Last}{\void}
647
648Returns the last element in the array, i.e. is the same as Item(GetCount() - 1).
649An assert failure is raised in the debug mode if the array is empty.
650
651The returned value is of type "reference to the array element type" for all of
652the array classes.
653
654\membersection{wxArray::Remove}\label{wxarrayremove}
437c49b2 655
247aba10
VZ
656\func{\void}{Remove}{\param{T }{item}}
657
f6bcfd97 658Removes an element from the array by value: the first item of the
8a729bb8
VZ
659array equal to {\it item} is removed, an assert failure will result from an
660attempt to remove an item which doesn't exist in the array.
661
1ac74d83 662When an element is removed from wxObjArray it is deleted by the array - use
247aba10
VZ
663\helpref{Detach()}{wxobjarraydetach} if you don't want this to happen. On the
664other hand, when an object is removed from a wxArray nothing happens - you
f6bcfd97 665should delete it manually if required:
437c49b2 666
247aba10
VZ
667\begin{verbatim}
668T *item = array[n];
669delete item;
670array.Remove(n)
671\end{verbatim}
672
673See also \helpref{WX\_CLEAR\_ARRAY}{wxcleararray} macro which deletes all
674elements of a wxArray (supposed to contain pointers).
675
8a729bb8
VZ
676\membersection{wxArray::RemoveAt}\label{wxarrayremoveat}
677
d1f1e77a 678\func{\void}{RemoveAt}{\param{size\_t }{index}, \param{size\_t }{count = $1$}}
8a729bb8 679
2863d6b0
VZ
680Removes {\it count} elements starting at {\it index} from the array. When an
681element is removed from wxObjArray it is deleted by the array - use
682\helpref{Detach()}{wxobjarraydetach} if you don't want this to happen. On
683the other hand, when an object is removed from a wxArray nothing happens -
684you should delete it manually if required:
8a729bb8
VZ
685
686\begin{verbatim}
687T *item = array[n];
688delete item;
689array.RemoveAt(n)
690\end{verbatim}
691
692See also \helpref{WX\_CLEAR\_ARRAY}{wxcleararray} macro which deletes all
693elements of a wxArray (supposed to contain pointers).
694
2abb9d2f
VZ
695\membersection{wxArray::SetCount}\label{wxarraysetcount}
696
697\func{void}{SetCount}{\param{size\_t }{count}, \param{T }{defval = T($0$)}}
698
1ac74d83 699This function ensures that the number of array elements is at least
dbd94b75 700{\it count}. If the array has already {\it count} or more items, nothing is
2abb9d2f
VZ
701done. Otherwise, {\tt count - GetCount()} elements are added and initialized to
702the value {\it defval}.
703
704\wxheading{See also}
705
706\helpref{GetCount}{wxarraygetcount}
707
247aba10 708\membersection{wxArray::Shrink}\label{wxarrayshrink}
437c49b2 709
e2a6f233 710\func{void}{Shrink}{\void}
247aba10
VZ
711
712Frees all memory unused by the array. If the program knows that no new items
713will be added to the array it may call Shrink() to reduce its memory usage.
714However, if a new item is added to the array, some extra memory will be
715allocated again.
716
717\membersection{wxArray::Sort}\label{wxarraysort}
437c49b2 718
e2a6f233 719\func{void}{Sort}{\param{CMPFUNC<T> }{compareFunction}}
247aba10
VZ
720
721The notation CMPFUNC<T> should be read as if we had the following declaration:
437c49b2 722
247aba10
VZ
723\begin{verbatim}
724template int CMPFUNC(T *first, T *second);
725\end{verbatim}
437c49b2 726
1ac74d83 727where {\it T} is the type of the array elements. I.e. it is a function returning
247aba10
VZ
728{\it int} which is passed two arguments of type {\it T *}.
729
730Sorts the array using the specified compare function: this function should
731return a negative, zero or positive value according to whether the first element
732passed to it is less than, equal to or greater than the second one.
733
734wxSortedArray doesn't have this function because it is always sorted.
b67a86d5 735