| 1 | ///////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: container.h |
| 3 | // Purpose: topic overview |
| 4 | // Author: wxWidgets team |
| 5 | // RCS-ID: $Id$ |
| 6 | // Licence: wxWindows license |
| 7 | ///////////////////////////////////////////////////////////////////////////// |
| 8 | |
| 9 | /** |
| 10 | |
| 11 | @page overview_container Container Classes |
| 12 | |
| 13 | Classes: wxList<T>, wxArray<T>, wxVector<T> |
| 14 | |
| 15 | wxWidgets uses itself several container classes including doubly-linked lists |
| 16 | and dynamic arrays (i.e. arrays which expand automatically when they become |
| 17 | full). For both historical and portability reasons wxWidgets does not require |
| 18 | the use of STL (which provides the standard implementation of many container |
| 19 | classes in C++) but it can be compiled in STL mode. Additionally, wxWidgets |
| 20 | provides the new wxVector<T> class template which can be used like the std::vector |
| 21 | class and is actually just a typedef to std::vector if wxWidgets is compiled |
| 22 | in STL mode. |
| 23 | |
| 24 | wxWidgets non-template container classes don't pretend to be as powerful or full as STL |
| 25 | ones, but they are quite useful and may be compiled with absolutely any C++ |
| 26 | compiler. They're used internally by wxWidgets, but may, of course, be used in |
| 27 | your programs as well if you wish. |
| 28 | |
| 29 | The list classes in wxWidgets are doubly-linked lists which may either own the |
| 30 | objects they contain (meaning that the list deletes the object when it is |
| 31 | removed from the list or the list itself is destroyed) or just store the |
| 32 | pointers depending on whether or not you called wxList<T>::DeleteContents() |
| 33 | method. |
| 34 | |
| 35 | Dynamic arrays resemble C arrays but with two important differences: they |
| 36 | provide run-time range checking in debug builds and they automatically expand |
| 37 | the allocated memory when there is no more space for new items. They come in |
| 38 | two sorts: the "plain" arrays which store either built-in types such as "char", |
| 39 | "int" or "bool" or the pointers to arbitrary objects, or "object arrays" which |
| 40 | own the object pointers to which they store. |
| 41 | |
| 42 | For the same portability reasons, the container classes implementation in |
| 43 | wxWidgets does not use templates, but is rather based on C preprocessor i.e. is |
| 44 | done with the macros: WX_DECLARE_LIST() and WX_DEFINE_LIST() for the linked |
| 45 | lists and WX_DECLARE_ARRAY(), WX_DECLARE_OBJARRAY() and WX_DEFINE_OBJARRAY() |
| 46 | for the dynamic arrays. |
| 47 | |
| 48 | The "DECLARE" macro declares a new container class containing the elements of |
| 49 | given type and is needed for all three types of container classes: lists, |
| 50 | arrays and objarrays. The "DEFINE" classes must be inserted in your program in |
| 51 | a place where the @e full declaration of container element class is in scope |
| 52 | (i.e. not just forward declaration), otherwise destructors of the container |
| 53 | elements will not be called! |
| 54 | |
| 55 | As array classes never delete the items they contain anyhow, there is no |
| 56 | WX_DEFINE_ARRAY() macro for them. |
| 57 | |
| 58 | Examples of usage of these macros may be found in wxList<T> and wxArray<T> |
| 59 | documentation. |
| 60 | |
| 61 | Finally, wxWidgets predefines several commonly used container classes. wxList |
| 62 | is defined for compatibility with previous versions as a list containing |
| 63 | wxObjects and wxStringList as a list of C-style strings (char *), both of these |
| 64 | classes are deprecated and should not be used in new programs. The following |
| 65 | array classes are defined: wxArrayInt, wxArrayLong, wxArrayPtrVoid and |
| 66 | wxArrayString. The first three store elements of corresponding types, but |
| 67 | wxArrayString is somewhat special: it is an optimized version of wxArray which |
| 68 | uses its knowledge about wxString reference counting schema. |
| 69 | |
| 70 | */ |
| 71 | |