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 ///////////////////////////////////////////////////////////////////////////////
20 #define wxVector std::vector
30 typedef size_t size_type
;
32 typedef value_type
* iterator
;
33 typedef const value_type
* const_iterator
;
34 typedef value_type
& reference
;
36 wxVector() : m_size(0), m_capacity(0), m_values(NULL
) {}
38 wxVector(const wxVector
& c
)
52 m_size
= m_capacity
= 0;
55 void reserve(size_type n
)
57 if ( n
<= m_capacity
)
60 // increase the size twice, unless we're already too big or unless
62 const size_type increment
= (m_size
> 0)
63 ? wxMin(m_size
, ALLOC_MAX_SIZE
)
65 if ( m_capacity
+ increment
> n
)
66 n
= m_capacity
+ increment
;
68 value_type
*mem
= new value_type
[n
];
72 for ( size_type i
= 0; i
< m_size
; ++i
)
81 size_type
size() const
86 size_type
capacity() const
96 wxVector
& operator=(const wxVector
& vb
)
102 void push_back(const value_type
& v
)
105 m_values
[m_size
++] = v
;
113 const value_type
& at(size_type idx
) const
115 wxASSERT(idx
< m_size
);
116 return m_values
[idx
];
119 value_type
& at(size_type idx
)
121 wxASSERT(idx
< m_size
);
122 return m_values
[idx
];
125 const value_type
& operator[](size_type idx
) const { return at(idx
); }
126 value_type
& operator[](size_type idx
) { return at(idx
); }
127 const value_type
& front() const { return at(0); }
128 value_type
& front() { return at(0); }
129 const value_type
& back() const { return at(size() - 1); }
130 value_type
& back() { return at(size() - 1); }
132 const_iterator
begin() const { return m_values
; }
133 iterator
begin() { return m_values
; }
134 const_iterator
end() const { return m_values
+ size(); }
135 iterator
end() { return m_values
+ size(); }
137 iterator
insert(iterator it
, const value_type
& v
= value_type())
139 size_t idx
= it
- begin();
143 // unless we're inserting at the end, move following values out of
145 for ( size_t n
= m_size
; n
!= idx
; --n
)
146 m_values
[n
] = m_values
[n
-1];
151 return begin() + idx
;
154 iterator
erase(iterator it
)
156 return erase(it
, it
+ 1);
159 iterator
erase(iterator first
, iterator last
)
163 wxASSERT( first
< end() && last
<= end() );
165 size_type index
= first
- begin();
166 size_type count
= last
- first
;
168 // move the remaining values over to the freed space:
169 for ( iterator i
= last
; i
< end(); ++i
)
172 // erase items behind the new end of m_values:
173 for ( iterator i
= end() - count
; i
< end(); ++i
)
178 return begin() + index
;
181 #if WXWIN_COMPATIBILITY_2_8
182 wxDEPRECATED( size_type
erase(size_type n
) );
183 #endif // WXWIN_COMPATIBILITY_2_8
186 static const size_type ALLOC_INITIAL_SIZE
= 16;
187 static const size_type ALLOC_MAX_SIZE
= 4096;
189 void Copy(const wxVector
& vb
)
194 for ( const_iterator i
= vb
.begin(); i
!= vb
.end(); ++i
)
201 value_type
*m_values
;
204 #if WXWIN_COMPATIBILITY_2_8
206 typename wxVector
<T
>::size_type wxVector
<T
>::erase(size_type n
)
211 #endif // WXWIN_COMPATIBILITY_2_8
213 #endif // wxUSE_STL/!wxUSE_STL
215 #if WXWIN_COMPATIBILITY_2_8
216 #define WX_DECLARE_VECTORBASE(obj, cls) typedef wxVector<obj> cls
217 #define _WX_DECLARE_VECTOR(obj, cls, exp) WX_DECLARE_VECTORBASE(obj, cls)
218 #define WX_DECLARE_VECTOR(obj, cls) WX_DECLARE_VECTORBASE(obj, cls)
219 #endif // WXWIN_COMPATIBILITY_2_8
221 #endif // _WX_VECTOR_H_