SimpleArray.h

00001 /*  _________________________________________________________________________
00002  *
00003  *  UTILIB: A utility library for developing portable C++ codes.
00004  *  Copyright (c) 2001, Sandia National Laboratories.
00005  *  This software is distributed under the GNU Lesser General Public License.
00006  *  For more information, see the README file in the top UTILIB directory.
00007  *  _________________________________________________________________________
00008  */
00009 
00010 //
00011 // SimpleArray.h
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