]>
Commit | Line | Data |
---|---|---|
664e1314 VZ |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: wx/scopedarray.h | |
3 | // Purpose: scoped smart pointer class | |
4 | // Author: Vadim Zeitlin | |
5 | // Created: 2009-02-03 | |
664e1314 VZ |
6 | // Copyright: (c) Jesse Lovelace and original Boost authors (see below) |
7 | // (c) 2009 Vadim Zeitlin | |
8 | // Licence: wxWindows licence | |
9 | ///////////////////////////////////////////////////////////////////////////// | |
10 | ||
11 | #ifndef _WX_SCOPED_ARRAY_H_ | |
12 | #define _WX_SCOPED_ARRAY_H_ | |
13 | ||
14 | #include "wx/defs.h" | |
15 | #include "wx/checkeddelete.h" | |
16 | ||
17 | // ---------------------------------------------------------------------------- | |
18 | // wxScopedArray: A scoped array | |
19 | // ---------------------------------------------------------------------------- | |
20 | ||
21 | template <class T> | |
22 | class wxScopedArray | |
23 | { | |
24 | public: | |
25 | typedef T element_type; | |
26 | ||
27 | wxEXPLICIT wxScopedArray(T * array = NULL) : m_array(array) { } | |
28 | ||
29 | ~wxScopedArray() { delete [] m_array; } | |
30 | ||
31 | // test for pointer validity: defining conversion to unspecified_bool_type | |
32 | // and not more obvious bool to avoid implicit conversions to integer types | |
33 | typedef T *(wxScopedArray<T>::*unspecified_bool_type)() const; | |
34 | operator unspecified_bool_type() const | |
35 | { | |
36 | return m_array ? &wxScopedArray<T>::get : NULL; | |
37 | } | |
38 | ||
39 | void reset(T *array = NULL) | |
40 | { | |
41 | if ( array != m_array ) | |
42 | { | |
8c167bb1 | 43 | delete [] m_array; |
664e1314 VZ |
44 | m_array = array; |
45 | } | |
46 | } | |
47 | ||
48 | T& operator[](size_t n) const { return m_array[n]; } | |
49 | ||
50 | T *get() const { return m_array; } | |
51 | ||
52 | void swap(wxScopedArray &other) | |
53 | { | |
54 | T * const tmp = other.m_array; | |
55 | other.m_array = m_array; | |
56 | m_array = tmp; | |
57 | } | |
58 | ||
59 | private: | |
60 | T *m_array; | |
61 | ||
62 | DECLARE_NO_COPY_TEMPLATE_CLASS(wxScopedArray, T) | |
63 | }; | |
64 | ||
65 | // ---------------------------------------------------------------------------- | |
66 | // old macro based implementation | |
67 | // ---------------------------------------------------------------------------- | |
68 | ||
69 | // the same but for arrays instead of simple pointers | |
70 | #define wxDECLARE_SCOPED_ARRAY(T, name)\ | |
71 | class name \ | |
72 | { \ | |
73 | private: \ | |
74 | T * m_ptr; \ | |
75 | name(name const &); \ | |
76 | name & operator=(name const &); \ | |
77 | \ | |
78 | public: \ | |
79 | wxEXPLICIT name(T * p = NULL) : m_ptr(p) \ | |
80 | {} \ | |
81 | \ | |
82 | ~name(); \ | |
83 | void reset(T * p = NULL); \ | |
84 | \ | |
85 | T & operator[](long int i) const\ | |
86 | { \ | |
87 | wxASSERT(m_ptr != NULL); \ | |
88 | wxASSERT(i >= 0); \ | |
89 | return m_ptr[i]; \ | |
90 | } \ | |
91 | \ | |
92 | T * get() const \ | |
93 | { \ | |
94 | return m_ptr; \ | |
95 | } \ | |
96 | \ | |
97 | void swap(name & ot) \ | |
98 | { \ | |
99 | T * tmp = ot.m_ptr; \ | |
100 | ot.m_ptr = m_ptr; \ | |
101 | m_ptr = tmp; \ | |
102 | } \ | |
103 | }; | |
104 | ||
105 | #define wxDEFINE_SCOPED_ARRAY(T, name) \ | |
106 | name::~name() \ | |
107 | { \ | |
108 | wxCHECKED_DELETE_ARRAY(m_ptr); \ | |
109 | } \ | |
110 | void name::reset(T * p){ \ | |
111 | if (m_ptr != p) \ | |
112 | { \ | |
113 | wxCHECKED_DELETE_ARRAY(m_ptr); \ | |
114 | m_ptr = p; \ | |
115 | } \ | |
116 | } | |
117 | ||
118 | #endif // _WX_SCOPED_ARRAY_H_ | |
119 |