00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00021 #ifndef __SimpleArray_h
00022 #define __SimpleArray_h
00023
00024 #ifdef NON_ANSI
00025 #include <iostream.h>
00026 #else
00027 #include <iostream>
00028 using namespace std;
00029 #endif
00030
00031 #if !defined (ANSI_HDRS)
00032 #include <stdlib.h>
00033 #include <assert.h>
00034 #else
00035 #include <cstdlib>
00036 #include <cassert>
00037 #endif
00038
00039
00040 #include "_generic.h"
00041 #include "BasicArray.h"
00042 #include "PackBuf.h"
00043
00044 #ifdef SWIG
00045 template <class T>
00046 class SimpleArray : public BasicArray<T> {
00047 #else
00048 template <class T>
00049 class UTILIB_API SimpleArray : public BasicArray<T> {
00050 #endif
00051
00052 public:
00053
00055 SimpleArray() : BasicArray<T>() {}
00066 #ifndef NON_ANSI
00067 explicit
00068 #endif
00069 SimpleArray(const int len, T *d=((T*)0), const EnumDataOwned o=DataNotOwned)
00070 : BasicArray<T>(len,d,o) {}
00072 SimpleArray(const SimpleArray<T>& array)
00073 : BasicArray<T>(array) {}
00074
00076 SimpleArray<T>& operator=(const SimpleArray<T>& array)
00077 {BasicArray<T>::operator=(array); return *this;}
00079 SimpleArray<T>& operator=(const T& val)
00080 {BasicArray<T>::operator=(val); return *this;}
00082 virtual ~SimpleArray() {}
00083
00085 int operator==(const T& val) const;
00087 int operator!=(const T& val) const;
00089 int operator==(const SimpleArray<T>& array) const;
00091 int operator!=(const SimpleArray<T>& array) const;
00099 int compare(const SimpleArray<T>& array) const;
00100
00106 virtual int write(ostream& os) const;
00108 virtual int read(istream& is);
00110 virtual int write(PackBuffer& os) const;
00112 virtual int read(UnPackBuffer& is);
00113
00114 };
00115
00116
00117 #ifndef SWIG
00118
00120 template <class T>
00121 inline UTILIB_API ostream& operator<<(ostream& output, const SimpleArray<T>& array)
00122 { array.write(output); return(output); }
00123
00125 template <class T>
00126 inline UTILIB_API istream& operator>>(istream& input, SimpleArray<T>& array)
00127 { array.read(input); return(input); }
00128
00130 template <class T>
00131 inline UTILIB_API PackBuffer& operator<<(PackBuffer& output, const SimpleArray<T>& array)
00132 { array.write(output); return(output); }
00133
00135 template <class T>
00136 inline UTILIB_API UnPackBuffer& operator>>(UnPackBuffer& input, SimpleArray<T>& array)
00137 { array.read(input); return(input); }
00138 #endif // SWIG
00139
00140
00141
00142 template <class T>
00143 int SimpleArray<T>::operator==(const T& val) const
00144 {
00145 T* tmp = Data;
00146 size_type mylen = size();
00147 for (size_type i=0; i<mylen; i++)
00148 if (tmp[i] != val)
00149 return 0;
00150
00151 return 1;
00152 }
00153
00154
00155 template <class T>
00156 int SimpleArray<T>::operator!=(const T& val) const
00157 {
00158 T* tmp = Data;
00159 size_type mylen = size();
00160 for (size_type i=0; i<mylen; i++)
00161 if (tmp[i] != val)
00162 return 1;
00163
00164 return 0;
00165 }
00166
00167
00168
00169 template <class T>
00170 int SimpleArray<T>::operator==(const SimpleArray<T>& array) const
00171 {
00172 if (array.Data == Data)
00173 return 1;
00174 if (array.size() != size())
00175 return 0;
00176
00177 T* tmp = Data;
00178 T* arraytmp = array.Data;
00179 size_type mylen = size();
00180 for (size_type i=0; i<mylen; i++)
00181 if (tmp[i] != arraytmp[i])
00182 return 0;
00183
00184 return 1;
00185 }
00186
00187
00188 template <class T>
00189 int SimpleArray<T>::compare(const SimpleArray<T>& array) const
00190 {
00191 if (array.Data == Data)
00192 return 0;
00193
00194 size_type mylen = size();
00195 size_type arraylen = array.size();
00196 if (arraylen > mylen)
00197 return 1;
00198 if (arraylen < mylen)
00199 return -1;
00200
00201 T* tmp = Data;
00202 T* arraytmp = array.Data;
00203 for (size_type i=0; i<mylen; i++) {
00204 if (tmp[i] != arraytmp[i]) {
00205 if (tmp[i] < arraytmp[i]) return -1;
00206 else return 1;
00207 }
00208 }
00209
00210 return 0;
00211 }
00212
00213
00214 template <class T>
00215 int SimpleArray<T>::operator!=(const SimpleArray<T>& array) const
00216 {
00217 if (array.Data == Data)
00218 return 0;
00219
00220 size_type mylen = size();
00221 if (array.size() != mylen)
00222 return 1;
00223
00224 T* tmp = Data;
00225 T* arraytmp = array.Data;
00226 for (size_type i=0; i<mylen; i++)
00227 if (tmp[i] != arraytmp[i])
00228 return 1;
00229
00230 return 0;
00231 }
00232
00233
00234 template <class T>
00235 inline int SimpleArray<T>::write(PackBuffer& os) const
00236 {
00237 size_type mylen = size();
00238 os << mylen;
00239 T* tmp = Data;
00240 for (size_type i=0; i<mylen; i++, tmp++)
00241 os << *tmp;
00242 return OK;
00243 }
00244
00245
00246 template <class T>
00247 inline int SimpleArray<T>::write(ostream& os) const
00248 {
00249 size_type mylen = size();
00250 os << mylen << " : ";
00251 T* tmp = Data;
00252 for (size_type i=0; i<mylen; i++, tmp++)
00253 os << *tmp << " ";
00254 return OK;
00255 }
00256
00257
00258 template <class T>
00259 inline int SimpleArray<T>::read(UnPackBuffer& is)
00260 {
00261 size_type len;
00262 is >> len;
00263 resize(len);
00264
00265 T* tmp = Data;
00266 for (size_type i=0; i<len; i++, tmp++)
00267 is >> *tmp;
00268
00269 return OK;
00270 }
00271
00272
00273
00274 template <class T>
00275 inline int SimpleArray<T>::read(istream& is)
00276 {
00277 size_type len;
00278 is >> len;
00279 resize(len);
00280
00281 char c;
00282 is >> c;
00283
00284 T* tmp = Data;
00285 for (size_type i=0; i<len; i++, tmp++)
00286 is >> *tmp;
00287
00288 return OK;
00289 }
00290
00291 template <class T>
00292 inline int compare(const SimpleArray<T>& first, const SimpleArray<T>& second)
00293 { return first.compare(second);}
00294 #endif