]> git.saurik.com Git - wxWidgets.git/blame - include/wx/vector.h
do platform-specific checks after ensuring that the symbols we use are defined; extra...
[wxWidgets.git] / include / wx / vector.h
CommitLineData
3c648a82
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: wx/vector.h
3// Purpose: STL vector clone
4// Author: Lindsay Mathieson
e966f815 5// Modified by: Vaclav Slavik - make it a template
3c648a82 6// Created: 30.07.2001
e966f815
VS
7// Copyright: (c) 2001 Lindsay Mathieson <lindsay@mathieson.org>,
8// 2007 Vaclav Slavik <vslavik@fastmail.fm>
65571936 9// Licence: wxWindows licence
3c648a82
VZ
10///////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_VECTOR_H_
13#define _WX_VECTOR_H_
14
15#include "wx/defs.h"
16
e966f815
VS
17#if 0 // wxUSE_STL
18
19// FIXME: can't do this yet, wxVector::erase() is different (takes index,
20// not iterator)
21#include <vector>
22#define wxVector std::vector
23
24#else // !wxUSE_STL
25
26template<typename T>
27class wxVector
3c648a82 28{
2d6c58d6 29public:
5fd588d2 30 typedef size_t size_type;
e966f815
VS
31 typedef T value_type;
32
33 wxVector() : m_allocsize(16), m_size(0), m_capacity(0), m_objects(0) {}
34
35 wxVector(const wxVector& c)
36 {
37 wxCHECK2(Copy(c), return);
38 }
39
40 ~wxVector()
41 {
42 clear();
43 }
44
45 void clear()
46 {
47 for (size_type i = 0; i < size(); i++)
48 delete m_objects[i];
49 free(m_objects);
50 m_objects = 0;
51 m_size = m_capacity = 0;
52 }
53
54 void reserve(size_type n)
55 {
56 if ( !Alloc(n) )
57 {
58 wxFAIL_MSG( _T("out of memory in wxVector::reserve()") );
59 }
60 }
61
62 size_type size() const
63 {
64 return m_size;
65 }
66
67 size_type capacity() const
68 {
69 return m_capacity;
70 }
71
72 bool empty() const
73 {
74 return size() == 0;
75 }
76
77 wxVector& operator=(const wxVector& vb)
78 {
79 wxCHECK(Copy(vb), *this);
80 return *this;
81 }
82
83 void push_back(const value_type& o)
84 {
85 wxCHECK2(Alloc(size() + 1), return);
86 Append(new value_type(o));
87 }
88
89 void pop_back()
90 {
91 RemoveAt(size() - 1);
92 }
93
94 const value_type& at(size_type idx) const
95 {
96 wxASSERT(idx < m_size);
97 return *m_objects[idx];
98 }
99
100 value_type& at(size_type idx)
101 {
102 wxASSERT(idx < m_size);
103 return *m_objects[idx];
104 }
3c648a82 105
e966f815
VS
106 const value_type& operator[](size_type idx) const { return at(idx); }
107 value_type& operator[](size_type idx) { return at(idx); }
108 const value_type& front() const { return at(0); }
109 value_type& front() { return at(0); }
110 const value_type& back() const { return at(size() - 1); }
111 value_type& back() { return at(size() - 1); }
112
113 size_type erase(size_type idx)
114 {
115 RemoveAt(idx);
116 return idx;
117 }
118
119private:
5fd588d2 120 bool Alloc(size_type sz)
3c648a82
VZ
121 {
122 // work in multiples of m_allocsize;
123 sz = (sz / m_allocsize + 1) * m_allocsize;
124 if (sz <= m_capacity)
125 return true;
126
127 // try to realloc
e966f815 128 void *mem = realloc(m_objects, sizeof(value_type*) * sz);
3c648a82
VZ
129 if (! mem)
130 return false; // failed
131 // success
e966f815 132 m_objects = (value_type **) mem;
3c648a82
VZ
133 m_capacity = sz;
134 return true;
1f32f585 135 }
3c648a82 136
e966f815 137 void Append(value_type *obj)
3c648a82
VZ
138 {
139 wxASSERT(m_size < m_capacity);
140 m_objects[m_size] = obj;
141 m_size++;
1f32f585 142 }
3c648a82 143
5fd588d2 144 void RemoveAt(size_type idx)
3c648a82 145 {
fa776a58 146 wxASSERT(idx < m_size);
e966f815 147 delete m_objects[idx];
3c648a82
VZ
148 if (idx < m_size - 1)
149 memcpy(
5fd588d2
MB
150 m_objects + idx,
151 m_objects + idx + 1,
152 ( m_size - idx - 1 ) * sizeof(void*) );
3c648a82 153 m_size--;
1f32f585 154 }
3c648a82 155
e966f815 156 bool Copy(const wxVector& vb)
3c648a82
VZ
157 {
158 clear();
159 if (! Alloc(vb.size()))
160 return false;
161
5fd588d2 162 for (size_type i = 0; i < vb.size(); i++)
3c648a82 163 {
e966f815 164 value_type *o = new value_type(vb.at(i));
3c648a82
VZ
165 if (! o)
166 return false;
167 Append(o);
1f32f585 168 }
3c648a82
VZ
169
170 return true;
1f32f585 171 }
3c648a82 172
e966f815
VS
173private:
174 size_type m_allocsize;
175 size_type m_size,
176 m_capacity;
177 value_type **m_objects;
3c648a82
VZ
178};
179
e966f815 180#endif // wxUSE_STL/!wxUSE_STL
5fd588d2 181
e966f815
VS
182#if WXWIN_COMPATIBILITY_2_8
183 #define WX_DECLARE_VECTORBASE(obj, cls) typedef wxVector<obj> cls
184 #define _WX_DECLARE_VECTOR(obj, cls, exp) WX_DECLARE_VECTORBASE(obj, cls)
185 #define WX_DECLARE_VECTOR(obj, cls) WX_DECLARE_VECTORBASE(obj, cls)
186#endif // WXWIN_COMPATIBILITY_2_8
3c648a82 187
e966f815 188#endif // _WX_VECTOR_H_