00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __loaded__array_h__
00021 #define __loaded__array_h__
00022 using namespace std;
00023 #line 1 "array.h++"
00024 #include <stdlib.h>
00025 #include "types.h"
00026 #include "data-visitor.h"
00027 #include "coordinates.h"
00028 #include "array-meta.h"
00029 #include "type-names.h"
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 template <int D, class T, bool PT, int SM, bool O> class ArrayIterator;
00040
00041
00084 template <int D, class T> class Array: public DataClass
00085 {
00086
00087 protected:
00088 virtual QString type_name() const
00089 {
00090 return "Array<"
00091 + QString::number(D)
00092 + ","
00093 + ::type_name(T())
00094 + ">";
00095 };
00096 virtual DataClass* shallow_copy() const
00097 {
00098 return new Array<D,T>(*this);
00099 };
00100 virtual void visit(DataVisitor& v)
00101 {
00102 if (D>0) v.visit(*this);
00103 }
00104 Array(ArrayMeta<D,T> * content_with_correct_refcount)
00105 {
00106 content = content_with_correct_refcount;
00107 }
00108 private:
00109 void init(Size<D> size)
00110 {
00111 content = new ArrayMeta<D,T>(size);
00112 }
00113 void deref()
00114 {
00115 if (content->decref())
00116 delete content;
00117 }
00118 public:
00119 ArrayMeta<D,T> *content;
00120
00121 Array()
00122 {
00123 init(Size<D>());
00124 }
00125
00126 Array(Size<D> size)
00127 {
00128 init(size);
00129 };
00130 Array(int x)
00131 {
00132 init(Size<D>(x));
00133 }
00134 Array(int x, int y)
00135 {
00136 init(Size<D>(x,y));
00137 };
00138 Array(int x, int y, int z)
00139 {
00140 init(Size<D>(x,y,z));
00141 };
00142 Array(int x, int y, int z, int a)
00143 {
00144 init(Size<D>(x,y,z,a));
00145 };
00146 Array(int x, int y, int z, int a, int b, int c)
00147 {
00148 init(Size<D>(x,y,z,a,b,c));
00149 };
00150 Array(const Array<D,T> & m) : DataClass()
00151 {
00152 content = m.content;
00153 content->incref();
00154 }
00155
00162 Array(SpecialStorage<T> *store, Size<D> sizes)
00163 {
00164 content = new ArrayMeta<D,T>(store,sizes);
00165 }
00166
00172 template <int O> Array(const Array<O,T> &m);
00173
00178 template<int O> Array(const Array<O,T>& other, const Select<D>& selected);
00179 Array<D,T> &operator =(const Array<D,T> &m);
00180 Array<D,T> &operator =(const T &m);
00181 Array<D,T> &operator +=(const T &m);
00182 Array<D,T> &operator +=(const Array<D,T> &m);
00183 Array<D,T> &operator -=(const T &m);
00184 Array<D,T> &operator /=(const T &m);
00185 Array<D,T> &operator *=(const T &m);
00186 Array<D,T> operator *(const T m) const;
00187 Array<D,T> operator /(const T m) const;
00188 Array<D,T> operator +(const Array<D,T> &m) const;
00189
00190 ~Array()
00191 {
00192 deref();
00193 };
00194
00195
00196 Array<D,T> operator ()(const From<D> & from) const
00197 {
00198 return Array<D,T>(new ArrayMeta<D,T>(content,from));
00199 };
00200 Array<D,T> operator ()(const To<D>& to) const
00201 {
00202 return Array<D,T>(new ArrayMeta<D,T>(content,to));
00203 }
00204 Array<D,T> operator()(const Size<D>& s) const
00205 {
00206 return Array<D,T>(new ArrayMeta<D,T>(content,s));
00207 }
00208 Array<D,T> operator ()(const From<D> & from, const To<D>& to) const
00209 {
00210 return Array<D,T>(new ArrayMeta<D,T>(content,from,to));
00211 };
00212 Array<D,T> operator ()(const From<D> & from, const Size<D>& size) const
00213 {
00214 return Array<D,T>(new ArrayMeta<D,T>(content,from,size));
00215 }
00216 template <int O> Array<O,T> operator()(const Select<O> keep) const
00217 {
00218 return Array<O,T>(*this,keep);
00219 };
00220
00221 void setAddress(T* start)
00222 {
00223 content->setAddress(start);
00224 };
00225 int size(int i) const
00226 {
00227 return content->size[i];
00228 };
00229 Size<D> size() const
00230 {
00231 return content->size;
00232 };
00233 bool empty() const
00234 {
00235 return content->size.has(0);
00236 };
00237 Delta<D> delta() const
00238 {
00239 return content->delta;
00240 };
00241 int delta(int i) const
00242 {
00243 return content->delta[i];
00244 };
00245 T* address(Position<D> i) const
00246 {
00247 return content->address(i);
00248 };
00249 T & operator [](Position<D> i) const
00250 {
00251 return *address(i);
00252 };
00253 bool operator ==(const Array<D,T> &m) const;
00254 bool operator !=(const Array<D,T> &m) const
00255 {
00256 return !(*this==m);
00257 };
00258 void printMetaInfo() const;
00259
00264 template <class F> void copyFrom(const Array<D,F> &source);
00265
00272 void copyFrom(const Array<D,T> &source, const From<D>& where);
00273
00274
00275 typedef T value;
00276 typedef Array<1,T> vector;
00277 typedef Array<2,T> matrix;
00278
00279 typedef ArrayIterator<D,T,false,0,false> values;
00280 typedef ArrayIterator<D,T,false,0,true> ordered;
00281 typedef ArrayIterator<D,T,true ,0,false> positions;
00282 typedef ArrayIterator<D,T,false,1,false> vector_values;
00283 typedef ArrayIterator<D,T,true ,1,false> vector_positions;
00284 typedef ArrayIterator<D,T,true ,1,true> ordered_vectors;
00285 typedef ArrayIterator<D,T,false,2,false> matrix_values;
00286 typedef ArrayIterator<D,T,true ,2,false> matrix_positions;
00287
00288 virtual Data getField(QString e);
00289 private:
00290 Data getField1(int idx);
00291 Data getField2(int idx);
00292 Data getField3(int idx);
00293 Data getField4(int idx);
00294 Data getField5(int idx);
00295 Data getField6(int idx);
00296 Data getField7(int idx);
00297 Data getField8(int idx);
00298 };
00299
00300 template <int D, class T>
00301 Data Array<D,T>::getField(QString p)
00302 {
00303 int pos = atol(p.toAscii().data());
00304 assert(pos>=0);
00305 assert(pos<size()[0]);
00306 if (D==1) return getField1(pos);
00307 if (D==2) return getField2(pos);
00308 if (D==3) return getField3(pos);
00309 if (D==4) return getField4(pos);
00310 if (D==5) return getField5(pos);
00311 if (D==6) return getField6(pos);
00312 if (D==7) return getField7(pos);
00313 if (D==8) return getField8(pos);
00314 assert(0);
00315 return getField1(pos);
00316 }
00317
00318 template <int D, class T>
00319 Data Array<D,T>::getField1(int idx)
00320 {
00321 assert(D==1);
00322 Position<D> p;
00323 p[0]=idx;
00324 return to_data(Array<D,T>::operator[](p));
00325 }
00326
00327 #define GETFIELD(NR) \
00328 template <int D, class T> \
00329 Data Array<D,T>::getField##NR(int idx) \
00330 {\
00331 assert(D==NR);\
00332 assert(D>1);\
00333 Position<D> p;\
00334 p[0]=idx;\
00335 From<D> f(p);\
00336 Select<NR-1> s;\
00337 for(int i = 0 ; i < D-1;i++)\
00338 s[i]=i+1;\
00339 Array<NR-1,T> result((*this)(f),s);\
00340 return result;\
00341 }
00342
00343 GETFIELD(2);
00344 GETFIELD(3);
00345 GETFIELD(4);
00346 GETFIELD(5);
00347 GETFIELD(6);
00348 GETFIELD(7);
00349 GETFIELD(8);
00350
00356 template <int D, class T> Array<D,T> &Array<D,T>::operator =(const T &m)
00357 {
00358 ArrayIterator<D,T,false,0,false> values(*this);
00359
00360 if (values.linear() && values.size()>8)
00361 {
00362 if (sizeof(T)==sizeof(char))
00363 {
00364 char C = *(char*)(void*)(&m);
00365 for(int s = values.size(); values.more(); values.skipBlock())
00366 memset((char*)(T*)values, C, s);
00367 return *this;
00368 }
00369 if (sizeof(T)==sizeof(wchar_t))
00370 {
00371 wchar_t C = *(wchar_t*)(void*)(&m);
00372 for(int s = values.size(); values.more() ; values.skipBlock())
00373 wmemset((wchar_t*)(T*)values, C, s);
00374 return *this;
00375 }
00376 }
00377
00378 for( ; values.more() ; values++) values=m;
00379 return *this;
00380 }
00381
00382 template <int D, class T>
00383 void Array<D,T>::copyFrom(const Array<D,T> &source, const From<D> &where)
00384 {
00385
00386 Size<D> copySize(size());
00387 copySize(where);
00388 Size<D> source_size(source.size());
00389 copySize.min(source_size);
00390
00391 Array<D,T> target_area((*this)(where,copySize));
00392 Array<D,T> source_area(source(copySize));
00393 target_area.copyFrom(source_area);
00394 }
00395
00396 template <int D, class T>
00397 template <class F>
00398 void Array<D,T>::copyFrom(const Array<D,F> &source)
00399 {
00400
00401 ArrayIterator<D,T,false,0,true> d(this);
00402 ArrayIterator<D,F,false,0,true> s(source);
00403
00404 while(d.more() && s.more())
00405 {
00406 d=(T)(F&)s;
00407 d++;
00408 s++;
00409 }
00410 }
00411
00412 template <int D, class T> Array<D,T> &Array<D,T>::operator +=(const T &m)
00413 {
00414 for(values value(*this); value.more() ; value++)
00415 value+=m;
00416 return *this;
00417 }
00418
00419 template <int D, class T>
00420 Array<D,T> &Array<D,T>::operator +=(const Array<D,T> &m)
00421 {
00422 for(positions v(*this); v.more() ; ++v)
00423 v+=m[v];
00424 return *this;
00425 }
00426
00427 template <int D, class T> Array<D,T> &Array<D,T>::operator -=(const T &m)
00428 {
00429 for(values pos(*this); pos.more() ; ++pos)
00430 pos-=m;
00431 return *this;
00432 }
00433
00434 template <int D, class T> Array<D,T> &Array<D,T>::operator /=(const T &m)
00435 {
00436 for(values pos(*this); pos.more(); ++pos)
00437 pos/=m;
00438 return *this;
00439 }
00440
00441 template <int D, class T> Array<D,T> &Array<D,T>::operator *=(const T &m)
00442 {
00443 for(values pos(*this); pos.more(); ++pos)
00444 pos*=m;
00445 return *this;
00446 }
00447
00448 template <int D, class T>
00449 bool Array<D,T>::operator ==(const Array<D,T> &m) const
00450 {
00451 if (content==m.content) return true;
00452 if (content->size!=m.content->size) return false;
00453 for(positions pos(*this); pos.more() ; ++pos)
00454 if (pos!=m[pos]) return false;
00455 return true;
00456 }
00457
00458 template <int D, class T>
00459 template <int O>
00460 Array<D,T>::Array(const Array<O,T> &m, const Select<D>& selected)
00461 {
00462 content = new ArrayMeta<D,T>(*m.content,selected);
00463 }
00464
00465 template <int D, class T>
00466 template <int O>
00467 Array<D,T>::Array(const Array<O,T> &m)
00468 {
00469 content = new ArrayMeta<D,T>(*m.content);
00470 }
00471
00472 template <int D, class T>
00473 Array<D,T>& Array<D,T>::operator =(const Array<D,T> &m)
00474 {
00475 m.content->incref();
00476 deref();
00477 content = m.content;
00478 return *this;
00479 }
00480
00481 template <int D, class T>
00482 void Array<D,T>::printMetaInfo() const
00483 {
00484 content->printMetaInfo();
00485 };
00486
00487 template <int D, class T>
00488 Array<D,T> Array<D,T>::operator *(const T val) const
00489 {
00490 Array<D,T> out(size());
00491 out.copyFrom(*this);
00492 out*=val;
00493 return out;
00494 }
00495
00496 template <int D, class T>
00497 Array<D,T> Array<D,T>::operator /(const T val) const
00498 {
00499 Array<D,T> out(size());
00500 out.copyFrom(*this);
00501 out/=val;
00502 return out;
00503 }
00504
00505 template <int D, class T>
00506 Array<D,T> Array<D,T>::operator +(const Array<D,T>& in2) const
00507 {
00508 assert(size()==in2.size());
00509 Array<D,T> out(size());
00510 out.copyFrom(*this);
00511 out+=in2;
00512 return out;
00513 }
00514 #endif // __loaded__array_h__