rayzor

annotate src/stl/vector.h @ 9:70e332156d02

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