00001
00002 #ifndef HDNUM_ARRAY_HH
00003 #define HDNUM_ARRAY_HH
00004
00009 namespace hdnum {
00010
00011 template<class T>
00012 class Array {
00013 public:
00014
00016 typedef T value_type;
00017
00019 typedef value_type& reference;
00020
00022 typedef const value_type& const_reference;
00023
00025 typedef std::size_t size_type;
00026
00028 typedef std::ptrdiff_t difference_type;
00029
00031 Array ()
00032 {
00033 n = 0;
00034 p = 0;
00035 }
00036
00038 Array (size_type _n) : n(_n)
00039 {
00040 if (n>0)
00041 p = new T[n];
00042 else
00043 {
00044 n = 0;
00045 p = 0;
00046 }
00047 }
00048
00050 Array (size_type _n, const T& _t) : n(_n)
00051 {
00052 if (n>0)
00053 p = new T[n];
00054 else
00055 {
00056 n = 0;
00057 p = 0;
00058 }
00059 for (size_type i=0; i<n; i++) p[i] = _t;
00060 }
00061
00063 Array (const Array& a)
00064 {
00065
00066 n = a.n;
00067 if (n>0)
00068 p = new T[n];
00069 else
00070 {
00071 n = 0;
00072 p = 0;
00073 }
00074
00075
00076 for (size_type i=0; i<n; i++) p[i]=a.p[i];
00077 }
00078
00080 ~Array ()
00081 {
00082 if (n>0) delete [] p;
00083 }
00084
00086 void resize (size_type _n)
00087 {
00088 if (n==_n) return;
00089 if (n>0) delete [] p;
00090 n = _n;
00091 if (n>0)
00092 p = new T[n];
00093 else
00094 {
00095 n = 0;
00096 p = 0;
00097 }
00098 }
00099
00101 void resize (size_type _n, const T& _t)
00102 {
00103 if (n==_n) return;
00104 if (n>0) delete [] p;
00105 n = _n;
00106 if (n>0)
00107 p = new T[n];
00108 else
00109 {
00110 n = 0;
00111 p = 0;
00112 }
00113 for (size_type i=0; i<n; i++) p[i] = _t;
00114 }
00115
00117 Array& operator= (const Array& a)
00118 {
00119 if (&a!=this)
00120 {
00121
00122 if (n!=a.n)
00123 {
00124 if (n>0) delete [] p;
00125 n = a.n;
00126 if (n>0)
00127 p = new T[n];
00128 else
00129 {
00130 n = 0;
00131 p = 0;
00132 }
00133 }
00134
00135 for (size_type i=0; i<this->n; i++) p[i]=a.p[i];
00136 }
00137 return *this;
00138 }
00139
00141 reference operator[] (size_type i)
00142 {
00143 return p[i];
00144 }
00145
00147 const_reference operator[] (size_type i) const
00148 {
00149 return p[i];
00150 }
00151
00153 size_type size () const
00154 {
00155 return n;
00156 }
00157
00158 private:
00159 size_type n;
00160 T* p;
00161 };
00162
00163 }
00164
00165 #endif