rayzor

annotate src/stl/vector.h @ 12:d94a69933a71

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