3 * - By John Hodge (thePowersGang)
8 #ifndef _LIBCXX_VECTOR_
9 #define _LIBCXX_VECTOR_
16 template <class T, typename size_type>
17 class vector_iterator//:
18 //public random_acess_iterator_tag
25 vector_iterator(0,0,0)
28 vector_iterator(const vector_iterator& x):
33 vector_iterator(T* array, size_type start, size_type max):
39 vector_iterator& operator=(const vector_iterator& x)
46 bool operator==(const vector_iterator& other) const {
47 return m_array == other.m_array && m_pos == other.m_pos;
49 bool operator!=(const vector_iterator& other) const {
50 return !(*this == other);
52 T& operator*() const {
53 return m_array[m_pos];
55 T& operator->() const {
56 return m_array[m_pos];
58 vector_iterator& operator++() {
64 vector_iterator& operator--() {
73 template <class T, class Alloc = allocator<T> >
78 typedef Alloc allocator_type;
79 typedef typename allocator_type::reference reference;
80 typedef typename allocator_type::const_reference const_reference;
81 typedef typename allocator_type::pointer pointer;
82 typedef typename allocator_type::const_pointer const_pointer;
83 typedef int difference_type;
84 typedef size_t size_type;
85 typedef ::std::_bits::vector_iterator<T,size_type> iterator;
86 typedef ::std::_bits::vector_iterator<const T,size_type> const_iterator;
89 allocator_type m_alloc;
95 vector(const allocator_type& alloc = allocator_type()):
102 vector(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()):
107 vector(const vector& x):
116 m_alloc.deallocate(m_data, m_capacity);
121 return iterator(m_data, 0, m_size);
123 const_iterator begin() const {
124 return const_iterator(m_data, 0, m_size);
127 return iterator(m_data, m_size, m_size);
129 const_iterator end() const {
130 return const_iterator(m_data, m_size, m_size);
134 size_type size() const {
137 size_type max_size() const {
138 return -1 / sizeof(value_type);
140 void resize(size_type new_cap, value_type val = value_type()) {
142 if( new_cap > m_size )
144 for( size_type i = m_size; i < new_cap; i ++ ) {
145 m_alloc.construct( &m_data[i], val );
150 for( size_type i = new_cap; i < m_size; i ++ )
151 m_alloc.destroy( &m_data[i] );
155 size_type capacity() const {
161 void reserve(size_type n) {
162 //if( n > max_size() )
163 // throw ::std::length_error();
165 void shrink_to_fit() {
169 reference operator[] (size_type n) {
172 const_reference operator[] (size_type n) const {
175 reference at(size_type n) {
177 _throw_out_of_range("::std::vector - at");
180 const_reference at(size_type n) const {
182 _throw_out_of_range("::std::vector - at");
188 const_reference front() const {
192 return m_data[size()-1];
194 const_reference back() const {
195 return m_data[size()-1];
197 pointer data() noexcept {
200 const_pointer data() const noexcept {
205 void assign(size_type n, const value_type& val) {
209 void push_back(const value_type& val) {
210 resize(size()+1, val);
217 iterator insert(iterator position, const value_type& val) {
218 inesert(position, 1, val);
221 void insert(iterator position, size_type n, const value_type& val);
222 iterator erase(iterator position);
223 iterator erase(iterator first, iterator last);
224 //void swap(vector& x) {
225 // ::std::swap(m_size, x.m_size);
226 // ::std::swap(m_capacity, x.m_capacity);
227 // ::std::swap(m_data, x.m_data);
230 for( size_type i = 0; i < m_size; i ++ ) {
231 m_alloc.destroy( &m_data[i] );