rayzor
annotate src/stl/vector.h @ 22:5380ff64e83f
minor changes from dos, and line endings cleanup
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 02 May 2014 14:32:58 +0300 |
parents | d94a69933a71 |
children |
rev | line source |
---|---|
nuclear@22 | 1 /* vi:set ft=cpp: */ |
nuclear@22 | 2 #ifndef VECTOR_H_ |
nuclear@22 | 3 #define VECTOR_H_ |
nuclear@22 | 4 |
nuclear@22 | 5 #include <stdlib.h> |
nuclear@22 | 6 |
nuclear@22 | 7 template <class T> |
nuclear@22 | 8 class vector { |
nuclear@22 | 9 private: |
nuclear@22 | 10 T *data; |
nuclear@22 | 11 size_t num_items, max_items; |
nuclear@22 | 12 |
nuclear@22 | 13 public: |
nuclear@22 | 14 vector() |
nuclear@22 | 15 { |
nuclear@22 | 16 data = 0; |
nuclear@22 | 17 num_items = max_items = 0; |
nuclear@22 | 18 } |
nuclear@22 | 19 |
nuclear@22 | 20 vector(const vector &v) |
nuclear@22 | 21 { |
nuclear@22 | 22 data = 0; |
nuclear@22 | 23 num_items = max_items = 0; |
nuclear@22 | 24 resize(v.size()); |
nuclear@22 | 25 |
nuclear@22 | 26 for(size_t i=0; i<v.size(); i++) { |
nuclear@22 | 27 data[i] = v.data[i]; |
nuclear@22 | 28 } |
nuclear@22 | 29 } |
nuclear@22 | 30 |
nuclear@22 | 31 vector &operator =(const vector &v) |
nuclear@22 | 32 { |
nuclear@22 | 33 if(&v != this) { |
nuclear@22 | 34 clear(); |
nuclear@22 | 35 resize(v.size()); |
nuclear@22 | 36 |
nuclear@22 | 37 for(size_t i=0; i<v.size(); i++) { |
nuclear@22 | 38 data[i] = v.data[i]; |
nuclear@22 | 39 } |
nuclear@22 | 40 } |
nuclear@22 | 41 return *this; |
nuclear@22 | 42 } |
nuclear@22 | 43 |
nuclear@22 | 44 ~vector() |
nuclear@22 | 45 { |
nuclear@22 | 46 clear(); |
nuclear@22 | 47 } |
nuclear@22 | 48 |
nuclear@22 | 49 void clear() |
nuclear@22 | 50 { |
nuclear@22 | 51 delete [] data; |
nuclear@22 | 52 data = 0; |
nuclear@22 | 53 max_items = num_items = 0; |
nuclear@22 | 54 } |
nuclear@22 | 55 |
nuclear@22 | 56 bool empty() const |
nuclear@22 | 57 { |
nuclear@22 | 58 return num_items == 0; |
nuclear@22 | 59 } |
nuclear@22 | 60 |
nuclear@22 | 61 size_t size() const |
nuclear@22 | 62 { |
nuclear@22 | 63 return num_items; |
nuclear@22 | 64 } |
nuclear@22 | 65 |
nuclear@22 | 66 void resize(size_t nsz) |
nuclear@22 | 67 { |
nuclear@22 | 68 if(nsz > 0) { |
nuclear@22 | 69 T *newdata = new T[nsz]; |
nuclear@22 | 70 if(!newdata) return; |
nuclear@22 | 71 |
nuclear@22 | 72 size_t num = num_items < nsz ? num_items : nsz; |
nuclear@22 | 73 for(size_t i=0; i<num; i++) { |
nuclear@22 | 74 newdata[i] = data[i]; |
nuclear@22 | 75 } |
nuclear@22 | 76 |
nuclear@22 | 77 delete [] data; |
nuclear@22 | 78 data = newdata; |
nuclear@22 | 79 max_items = nsz; |
nuclear@22 | 80 num_items = num; |
nuclear@22 | 81 } else { |
nuclear@22 | 82 delete [] data; |
nuclear@22 | 83 max_items = num_items = 0; |
nuclear@22 | 84 } |
nuclear@22 | 85 } |
nuclear@22 | 86 |
nuclear@22 | 87 void push_back(const T &item) |
nuclear@22 | 88 { |
nuclear@22 | 89 if(num_items >= max_items) { |
nuclear@22 | 90 resize(max_items > 0 ? max_items * 2 : 8); |
nuclear@22 | 91 } |
nuclear@22 | 92 data[num_items++] = item; |
nuclear@22 | 93 } |
nuclear@22 | 94 |
nuclear@22 | 95 void pop_back() |
nuclear@22 | 96 { |
nuclear@22 | 97 if(--num_items <= 0) { |
nuclear@22 | 98 num_items = 0; |
nuclear@22 | 99 } |
nuclear@22 | 100 |
nuclear@22 | 101 if(num_items < max_items / 3) { |
nuclear@22 | 102 resize(max_items / 2); |
nuclear@22 | 103 } |
nuclear@22 | 104 } |
nuclear@22 | 105 |
nuclear@22 | 106 T &back() |
nuclear@22 | 107 { |
nuclear@22 | 108 return data[num_items - 1]; |
nuclear@22 | 109 } |
nuclear@22 | 110 |
nuclear@22 | 111 const T &back() const |
nuclear@22 | 112 { |
nuclear@22 | 113 return data[num_items - 1]; |
nuclear@22 | 114 } |
nuclear@22 | 115 |
nuclear@22 | 116 T &operator [](int idx) |
nuclear@22 | 117 { |
nuclear@22 | 118 return data[idx]; |
nuclear@22 | 119 } |
nuclear@22 | 120 |
nuclear@22 | 121 const T &operator [](int idx) const |
nuclear@22 | 122 { |
nuclear@22 | 123 return data[idx]; |
nuclear@22 | 124 } |
nuclear@22 | 125 }; |
nuclear@22 | 126 |
nuclear@22 | 127 #endif // VECTOR_H_ |