00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _vector_h_included
00031 #define _vector_h_included
00032
00033 namespace Instr {
00034
00035 template <class T> class vector {
00036 public:
00037 typedef T value_type;
00038 typedef unsigned int size_type;
00039 typedef const T& const_reference;
00040 typedef T * iterator;
00041 typedef const T * const_iterator;
00042 vector() : start(NULL), finish(NULL), stfinish(NULL) {}
00043 vector(size_type n, T t) : start(NULL), finish(NULL), stfinish(NULL) {
00044 for (int i=0; i<n; i++)
00045 push_back (t);
00046 }
00047
00048 ~vector() {
00049 if (start != NULL) {
00050 free (start);
00051 }
00052 }
00053
00054 void reserve (size_type n) {
00055
00056 }
00057
00058 void push_back (T t) {
00059 if (finish == stfinish) {
00060 allocate ();
00061 }
00062 *finish++ = t;
00063 }
00064
00065 void pop_back () {
00066
00067 finish--;
00068 }
00069
00070 int size() const {
00071 return finish - start;
00072 }
00073
00074 bool empty() const {
00075 return size() == 0;
00076 }
00077
00078 T &operator[] (int n) const {
00079 return start[n];
00080 }
00081
00082 const_reference front () const {
00083 return *start;
00084 }
00085
00086 const_reference back () const {
00087 return *finish;
00088 }
00089
00090 iterator begin () {
00091 return start;
00092 }
00093
00094 iterator end () {
00095 return finish;
00096 }
00097
00098 const_iterator begin () const {
00099 return start;
00100 }
00101
00102 const_iterator end () const {
00103 return finish;
00104 }
00105
00106 void resize (int n, T t = T()) {
00107 int current_size = finish - start;
00108
00109 if (n == current_size) return;
00110 if (n < current_size) {
00111 finish -= current_size - n;
00112 } else {
00113 for (int i = current_size; i < n; i++)
00114 push_back (t);
00115 }
00116 }
00117
00118 template <class InputIterator>
00119 void insert (iterator pos, InputIterator f, InputIterator l)
00120 {
00121 if (pos == finish)
00122 {
00123 for (InputIterator iter = f; iter < l; iter++)
00124 push_back (*iter);
00125 }
00126 else
00127 {
00128 int ofst = pos - start;
00129 int n = l - f;
00130 int newsize = stfinish - start + n;
00131 T * oldstart = start;
00132 start = (T *) realloc (start, newsize * sizeof (T));
00133 finish = start + (finish - oldstart);
00134 stfinish = start + newsize;
00135
00136 pos = start + ofst;
00137 {
00138
00139 iterator iter = pos;
00140 int i = 0;
00141 InputIterator ii = f;
00142 for (; i < n; iter++, i++, ii++)
00143 {
00144 *(iter + n) = *iter;
00145 *iter = *ii;
00146 }
00147 }
00148 }
00149 }
00150 private:
00151 void allocate () {
00152 if (start == NULL) {
00153 start = finish = (T*)malloc (10 * sizeof(T));
00154 stfinish = start + 10;
00155 } else {
00156 T *oldstart = start;
00157 int newsize = (finish - start) * 2;
00158 start = (T*)realloc (start, newsize * sizeof(T));
00159 finish = start + (finish - oldstart);
00160 stfinish = start + newsize;
00161 }
00162 }
00163
00164
00165 T *start;
00166
00167 T *finish;
00168
00169 T *stfinish;
00170 };
00171
00172 }
00173
00174 #endif