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