]>
git.saurik.com Git - wxWidgets.git/blob - include/wx/vector.h
1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: STL vector clone
4 // Author: Lindsay Mathieson
5 // Modified by: Vaclav Slavik - make it a template
7 // Copyright: (c) 2001 Lindsay Mathieson <lindsay@mathieson.org>,
8 // 2007 Vaclav Slavik <vslavik@fastmail.fm>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
19 // FIXME: can't do this yet, wxVector::erase() is different (takes index,
22 #define wxVector std::vector
30 typedef size_t size_type
;
33 wxVector() : m_allocsize(16), m_size(0), m_capacity(0), m_objects(0) {}
35 wxVector(const wxVector
& c
)
37 wxCHECK2(Copy(c
), return);
47 for (size_type i
= 0; i
< size(); i
++)
51 m_size
= m_capacity
= 0;
54 void reserve(size_type n
)
58 wxFAIL_MSG( _T("out of memory in wxVector::reserve()") );
62 size_type
size() const
67 size_type
capacity() const
77 wxVector
& operator=(const wxVector
& vb
)
79 wxCHECK(Copy(vb
), *this);
83 void push_back(const value_type
& o
)
85 wxCHECK2(Alloc(size() + 1), return);
86 Append(new value_type(o
));
94 const value_type
& at(size_type idx
) const
96 wxASSERT(idx
< m_size
);
97 return *m_objects
[idx
];
100 value_type
& at(size_type idx
)
102 wxASSERT(idx
< m_size
);
103 return *m_objects
[idx
];
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); }
113 size_type
erase(size_type idx
)
120 bool Alloc(size_type sz
)
122 // work in multiples of m_allocsize;
123 sz
= (sz
/ m_allocsize
+ 1) * m_allocsize
;
124 if (sz
<= m_capacity
)
128 void *mem
= realloc(m_objects
, sizeof(value_type
*) * sz
);
130 return false; // failed
132 m_objects
= (value_type
**) mem
;
137 void Append(value_type
*obj
)
139 wxASSERT(m_size
< m_capacity
);
140 m_objects
[m_size
] = obj
;
144 void RemoveAt(size_type idx
)
146 wxASSERT(idx
< m_size
);
147 delete m_objects
[idx
];
148 if (idx
< m_size
- 1)
152 ( m_size
- idx
- 1 ) * sizeof(void*) );
156 bool Copy(const wxVector
& vb
)
159 if (! Alloc(vb
.size()))
162 for (size_type i
= 0; i
< vb
.size(); i
++)
164 value_type
*o
= new value_type(vb
.at(i
));
174 size_type m_allocsize
;
177 value_type
**m_objects
;
180 #endif // wxUSE_STL/!wxUSE_STL
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
188 #endif // _WX_VECTOR_H_