Array.hGo to the documentation of this file.00001 #ifndef _ARRAY_H
00002 #define _ARRAY_H
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 #include "ClassNames.h"
00031 #include <stream.h>
00032 #include "p-assert.h"
00033
00034 template<class T>
00035
00036 class Array {
00037 public:
00038 inline Array();
00039 inline Array(int size);
00040 inline Array(const Array<T> &other);
00041 inline ~Array();
00042
00043 inline int entries() const;
00044
00045
00046 inline const T & operator[] (int sub) const;
00047 inline T & operator[] (int sub);
00048
00049
00050 inline void clear();
00051
00052
00053
00054 inline void resize(int size);
00055
00056
00057 inline void print(ostream &out) const;
00058
00059
00060
00061 friend ostream & operator << <> (ostream &o, const Array<T> & a);
00062
00063
00064
00065
00066 inline void print(ostream &out, char *sep) const;
00067
00068
00069
00070 inline Array<T> & operator = (const Array<T> & l);
00071
00072
00073 inline int structures_OK() const;
00074
00075
00076
00077
00078 private:
00079 T *_array;
00080 int _entries;
00081 };
00082
00083
00084
00085
00086 template <class T>
00087 inline
00088 Array<T>::Array()
00089 {
00090 #ifdef CLASS_INSTANCE_REGISTRY
00091 register_instance(ARRAY_CLASS, sizeof(Array), this);
00092 #endif
00093
00094 _entries = 0;
00095 _array = 0;
00096 }
00097
00098 template <class T>
00099 inline
00100 Array<T>::Array(int size)
00101 {
00102 #ifdef CLASS_INSTANCE_REGISTRY
00103 register_instance(ARRAY_CLASS, sizeof(Array), this);
00104 #endif
00105
00106 _entries = 0;
00107 _array = 0;
00108 resize(size);
00109 }
00110
00111 template <class T>
00112 inline
00113 Array<T>::Array(const Array<T> &other)
00114 {
00115 #ifdef CLASS_INSTANCE_REGISTRY
00116 register_instance(ARRAY_CLASS, sizeof(Array), this);
00117 #endif
00118
00119 _entries = 0;
00120 _array = 0;
00121 *this = other;
00122 }
00123
00124 template <class T>
00125 inline
00126 Array<T>::~Array()
00127 {
00128 #ifdef CLASS_INSTANCE_REGISTRY
00129 unregister_instance(ARRAY_CLASS, this);
00130 #endif
00131
00132 if (_array)
00133 delete [] _array;
00134 }
00135
00136 template <class T>
00137 inline int
00138 Array<T>::entries() const
00139 {
00140 return _entries;
00141 }
00142
00143 template <class T>
00144 inline const T &
00145 Array<T>::operator[] (int sub) const
00146 {
00147 p_assert(0 <= sub && sub < _entries,
00148 "Subscript out of range for Array::operator[]().");
00149
00150 return _array[sub];
00151 }
00152
00153 template <class T>
00154 inline T &
00155 Array<T>::operator[] (int sub)
00156 {
00157 p_assert(0 <= sub && sub < _entries,
00158 "Subscript out of range for Array::operator[]().");
00159
00160 return _array[sub];
00161 }
00162
00163 template <class T>
00164 inline void
00165 Array<T>::clear()
00166 {
00167 _entries = 0;
00168
00169 if (_array) {
00170 delete [] _array;
00171 _array = 0;
00172 }
00173 }
00174
00175 template <class T>
00176 inline void
00177 Array<T>::resize(int size)
00178 {
00179 if (size < 0)
00180 size = 0;
00181
00182 if (size != _entries) {
00183 int min_size = (size < _entries) ? size : _entries;
00184 T * old_array = _array;
00185 _entries = size;
00186 _array = new T [_entries];
00187
00188 for (int i = 0; i < min_size; ++i)
00189 _array[i] = old_array[i];
00190
00191 if (old_array)
00192 delete [] old_array;
00193 }
00194 }
00195
00196 template <class T>
00197 inline Array<T> &
00198 Array<T>::operator = (const Array<T> & other)
00199 {
00200 if (_entries != other._entries)
00201 resize(other._entries);
00202
00203 for (int i = 0; i < _entries; ++i)
00204 _array[i] = other._array[i];
00205
00206 return *this;
00207 }
00208
00209 template <class T>
00210 inline void
00211 Array<T>::print(ostream & out, char *sep) const
00212 {
00213 if (_entries > 0) {
00214 out << _array[0];
00215
00216 for (int i = 1; i < _entries; ++i)
00217 out << sep << _array[i];
00218 }
00219 }
00220
00221 template <class T>
00222 inline void
00223 Array<T>::print(ostream & out) const
00224 {
00225 if (_entries > 0) {
00226 out << 0 << ":" << _array[0];
00227
00228 for (int i = 1; i < _entries; ++i)
00229 out << ", " << i << ":" << _array[i];
00230 }
00231 }
00232
00233 template <class T> ostream &
00234 operator << (ostream &o, const Array<T> & a)
00235 {
00236 a.print(o);
00237 return o;
00238 }
00239
00240 template <class T>
00241 inline int
00242 Array<T>::structures_OK() const
00243 {
00244 if (_entries < 0) {
00245 cerr << "\n\nError: Array::structures_OK(): Has a negative size.\n";
00246 return 0;
00247 }
00248 else if (_array == 0 && _entries != 0) {
00249 cerr << "\n\nError: Array::structures_OK(): _array field is NULL.\n";
00250 return 0;
00251 }
00252
00253 return 1;
00254 }
00255
00256 #endif
|