Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef CAN_ARRAY_H
00009 #define CAN_ARRAY_H
00010
00014 #include <cstddef>
00015
00019 namespace can {
00020
00022 template <class T, unsigned N=0>
00023 class Array
00024 {
00025 public:
00027 Array() {}
00029 Array(Array<T,N> const& other) {copy(other);}
00031 ~Array() {}
00033 Array<T,N>& operator=(Array<T,N> const& other)
00034 {
00035 copy(other);
00036 return *this;
00037 }
00039 T& operator[](unsigned i) {return elems[i];}
00041 T const& operator[](unsigned i) const {return elems[i];}
00043 unsigned size() const {return N;}
00044 void resize(unsigned n) { (void) n; }
00045 protected:
00046 T elems[N];
00047 void copy(Array<T,N> const& other)
00048 {
00049 for (unsigned i=0; i < N; ++i)
00050 elems[i] = other.elems[i];
00051 }
00052 };
00053
00055 template <class T>
00056 class Array<T,0>
00057 {
00058 public:
00060 Array() : sz(0), elems(0) {}
00062 Array(unsigned n) : sz(0), elems(0) {resize(n);}
00064 Array(Array<T,0> const& other) : sz(0), elems(0) {copy(other);}
00066 ~Array() {delete [] elems;}
00068 Array<T,0>& operator=(Array<T,0> const& other)
00069 {
00070 copy(other);
00071 return *this;
00072 }
00074 T& operator[](unsigned i) {return elems[i];}
00076 T const& operator[](unsigned i) const {return elems[i];}
00078 unsigned size() const {return sz;}
00080 void resize(unsigned n)
00081 {
00082 if (sz == n)
00083 return;
00084 delete [] elems;
00085 sz = n;
00086 elems = new T[n];
00087 }
00088 void resize_copy(unsigned n)
00089 {
00090 if (sz == n)
00091 return;
00092 T* tmp = new T[n];
00093 unsigned min = sz > n ? n : sz;
00094 for(unsigned int x = 0; x < min; x++)
00095 tmp[x] = elems[x];
00096 delete [] elems;
00097 sz = n;
00098 elems = tmp;
00099 }
00100 typedef T* iterator;
00101 typedef T const* const_iterator;
00102 T const* begin() const {return elems;}
00103 T const* end() const {return elems + sz;}
00104 T* begin() {return elems;}
00105 T* end() {return elems + sz;}
00106 protected:
00107 unsigned sz;
00108 T* elems;
00109 void copy(Array<T,0> const& other)
00110 {
00111 if (sz != other.sz)
00112 resize(other.sz);
00113 for (unsigned i = 0; i < sz; ++i)
00114 elems[i] = other.elems[i];
00115 }
00116 };
00117
00118 }
00119
00120 #endif