3 * - By John Hodge (thePowersGang)
8 #ifndef _LIBCXX_VECTOR_
9 #define _LIBCXX_VECTOR_
14 extern "C" void _SysDebug(const char *, ...);
19 template <class T, typename size_type>
20 class vector_iterator//:
21 //public random_acess_iterator_tag
28 vector_iterator(0,0,0)
31 vector_iterator(const vector_iterator& x):
36 vector_iterator(T* array, size_type start, size_type max):
42 vector_iterator& operator=(const vector_iterator& x)
49 bool operator==(const vector_iterator& other) const {
50 return m_pos == other.m_pos;
52 bool operator!=(const vector_iterator& other) const {
53 return !(*this == other);
55 T& operator*() const {
56 return m_array[m_pos];
58 T& operator->() const {
59 return m_array[m_pos];
61 vector_iterator& operator++() {
67 vector_iterator& operator--() {
76 template <class T, class Alloc = allocator<T> >
81 typedef Alloc allocator_type;
82 typedef typename allocator_type::reference reference;
83 typedef typename allocator_type::const_reference const_reference;
84 typedef typename allocator_type::pointer pointer;
85 typedef typename allocator_type::const_pointer const_pointer;
86 typedef int difference_type;
87 typedef size_t size_type;
88 typedef ::std::_bits::vector_iterator<T,size_type> iterator;
89 typedef ::std::_bits::vector_iterator<const T,size_type> const_iterator;
92 allocator_type m_alloc;
98 vector(const allocator_type& alloc = allocator_type()):
105 vector(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()):
110 vector(const vector& x):
119 m_alloc.deallocate(m_data, m_capacity);
124 return iterator(m_data, 0, m_size);
126 const_iterator begin() const {
127 return const_iterator(m_data, 0, m_size);
130 return iterator(m_data, m_size, m_size);
132 const_iterator end() const {
133 return const_iterator(m_data, m_size, m_size);
137 size_type size() const {
140 size_type max_size() const {
141 return -1 / sizeof(value_type);
143 void resize(size_type new_cap, value_type val = value_type()) {
145 if( new_cap > m_size )
147 for( size_type i = m_size; i < new_cap; i ++ ) {
148 m_alloc.construct( &m_data[i], val );
153 for( size_type i = new_cap; i < m_size; i ++ )
154 m_alloc.destroy( &m_data[i] );
158 size_type capacity() const {
164 void reserve(size_type n) {
166 throw ::std::length_error("::std::vector::reserve");
169 size_type size = (n + 0x1F) & ~0x1F;
170 auto new_area = m_alloc.allocate(size);
171 for( size_type i = 0; i < m_size; i ++ )
172 new_area[i] = m_data[i];
173 m_alloc.deallocate(m_data, m_capacity);
176 //::_SysDebug("::std::vector::resize - m_capacity=%i for n=%i", m_capacity, n);
179 void shrink_to_fit() {
183 reference operator[] (size_type n) {
186 const_reference operator[] (size_type n) const {
189 reference at(size_type n) {
191 _throw_out_of_range("::std::vector - at");
194 const_reference at(size_type n) const {
196 _throw_out_of_range("::std::vector - at");
202 const_reference front() const {
206 return m_data[size()-1];
208 const_reference back() const {
209 return m_data[size()-1];
211 pointer data() noexcept {
214 const_pointer data() const noexcept {
219 void assign(size_type n, const value_type& val) {
223 void push_back(const value_type& val) {
224 resize(size()+1, val);
231 iterator insert(iterator position, const value_type& val) {
232 inesert(position, 1, val);
235 void insert(iterator position, size_type n, const value_type& val);
236 iterator erase(iterator position);
237 iterator erase(iterator first, iterator last);
238 //void swap(vector& x) {
239 // ::std::swap(m_size, x.m_size);
240 // ::std::swap(m_capacity, x.m_capacity);
241 // ::std::swap(m_data, x.m_data);
244 for( size_type i = 0; i < m_size; i ++ ) {
245 m_alloc.destroy( &m_data[i] );