00001
00002
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
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #pragma once
00060 #ifndef ARRAY_H
00061 #define ARRAY_H
00062
00063 #include "./Cleaner.h"
00064 #include "./Utility.h"
00065 #include "./Matrix.h"
00066 #include "./Vector.h"
00067
00068
00069 #include <cstdarg>
00070
00071 #include <iostream>
00072
00073 using std::cout;
00074 using std::cerr;
00075 using std::endl;
00076
00077
00078
00079
00080
00081 template< class T > class Array;
00082 template< class T > class Matrix;
00083 template< class T > class Vector;
00084 template< class T, int l > class List;
00085 template< class T > class VarList;
00086
00088 template< class T >
00089 class Array
00090 {
00091
00092 friend class Matrix<T>;
00093 friend class Vector<T>;
00094
00095
00096 protected:
00097 T *data;
00098 int ndims;
00099 int length;
00100 int *dims;
00101 Cleaner<T> *clean;
00102
00103
00104 public:
00105 Array();
00106 explicit Array(const int);
00107 Array(const int, const int);
00108 Array(const int, const int, const int);
00109 Array(const int, const int, const int, const int, ...);
00110 Array(const int _ndims, const int* _dims);
00111 Array(Array<T> &m);
00112
00113
00114 ~Array();
00115
00116
00117 const T* DataPtr();
00118 T* Data();
00119
00120 Array<T> Clone() const;
00121
00122
00123
00124 const int XDim() const;
00125 const int YDim() const;
00126 const int ZDim() const;
00127 const int* Dims() const;
00128
00129 const int* Size() const;
00130 int Length() const;
00131 int NDims() const;
00132 void Init(const T init);
00133
00134
00135
00136 static bool IsCompatible(Array<T>& m1, Array<T>& m2);
00137
00138
00139 static Array<int> And(Array<T>& m1, Array<T>& m2);
00140 static Array<int> Or(Array<T>& m1, Array<T>& m2);
00141 static Array<int> Lt(Array<T>& m1, Array<T>& m2);
00142 static Array<int> Gt(Array<T>& m1, Array<T>& m2);
00143 static Array<int> Le(Array<T>& m1, Array<T>& m2);
00144 static Array<int> Ge(Array<T>& m1, Array<T>& m2);
00145 static Array<int> Eq(Array<T>& m1, Array<T>& m2);
00146 static Array<int> Ne(Array<T>& m1, Array<T>& m2);
00147
00148
00149 static Array<int> And(Array<T>& m, T v);
00150 static Array<int> Or(Array<T>& m, T v);
00151 static Array<int> Lt(Array<T>& m, T v);
00152 static Array<int> Gt(Array<T>& m, T v);
00153 static Array<int> Le(Array<T>& m, T v);
00154 static Array<int> Ge(Array<T>& m, T v);
00155 static Array<int> Eq(Array<T>& m, T v);
00156 static Array<int> Ne(Array<T>& m, T v);
00157
00158
00159
00160 static Array<T> Add(Array<T>& m1, Array<T>& m2);
00161 static Array<T> Subtract(Array<T>& m1, Array<T>& m2);
00162 static Array<T> Multiply(Array<T>& m1, Array<T>& m2);
00163 static Array<T> Divide(Array<T>& m1, Array<T>& m2);
00164
00165
00166 static Array<T> Add(Array<T>& m1, T v2);
00167 static Array<T> Subtract(Array<T>& m1, T v2);
00168 static Array<T> Subtract(T v2, Array<T>& m1);
00169 static Array<T> Multiply(Array<T>& m1, T v2);
00170 static Array<T> Divide(Array<T>& m1, T v2);
00171 static Array<T> Divide(T v2, Array<T>& m1);
00172
00173
00174
00175
00176 Array<T>& Add(Array<T>& m);
00177 Array<T>& Subtract(Array<T>& m);
00178 Array<T>& Multiply(Array<T>& m);
00179 Array<T>& Divide(Array<T>& m);
00180
00181
00182 Array<T>& Add(T v);
00183 Array<T>& Subtract(T v);
00184 Array<T>& Multiply(T v);
00185 Array<T>& Divide(T v);
00186
00187
00188
00189
00190
00191
00192
00193
00194 Array<T>& operator= (Array<T>& m);
00195 Array<T>& operator= (Matrix<T>& m);
00196
00197 Array<T>& operator= (Vector<T>& m);
00198
00199
00200
00201 Array<T> operator+ ();
00202 Array<T> operator- ();
00203 Array<int> operator! ();
00204
00205
00206
00207 T& operator() (const int i);
00208
00209
00210 T& operator[] (const int i);
00211
00212
00213 T& operator() (const int i, const int j, ...);
00214
00215
00216 T& Elem(const int i, const int j, ...);
00217 T& ElemNC(const int i, const int j, ...);
00218 T& Elem(const int i);
00219 T& ElemNC(const int i);
00220
00221
00222
00223
00224 friend Array<int> operator&& (Array<T>& m1, Array<T>& m2)
00225 {
00226 return Array<T>::And(m1, m2);
00227 }
00228
00229 friend Array<int> operator|| (Array<T>& m1, Array<T>& m2)
00230 {
00231 return Array<T>::Or(m1, m2);
00232 }
00233
00234 friend Array<int> operator< (Array<T>& m1, Array<T>& m2)
00235 {
00236 return Array<T>::Lt(m1, m2);
00237 }
00238
00239 friend Array<int> operator> (Array<T>& m1, Array<T>& m2)
00240 {
00241 return Array<T>::Gt(m1, m2);
00242 }
00243
00244 friend Array<int> operator<= (Array<T>& m1, Array<T>& m2)
00245 {
00246 return Array<T>::Le(m1, m2);
00247 }
00248
00249 friend Array<int> operator>= (Array<T>& m1, Array<T>& m2)
00250 {
00251 return Array<T>::Ge(m1, m2);
00252 }
00253
00254 friend Array<int> operator== (Array<T>& m1, Array<T>& m2)
00255 {
00256 return Array<T>::Eq(m1, m2);
00257 }
00258
00259 friend Array<int> operator!= (Array<T>& m1, Array<T>& m2)
00260 {
00261 return Array<T>::Ne(m1, m2);
00262 }
00263
00264
00265
00266
00267 friend Array<int> operator&& (Array<T>& m, T v)
00268 {
00269 return Array<T>::And(m, v);
00270 }
00271 friend Array<int> operator&& (T v, Array<T>& m)
00272 {
00273 return Array<T>::And(m, v);
00274 }
00275
00276 friend Array<int> operator|| (Array<T>& m, T v)
00277 {
00278 return Array<T>::Or(m, v);
00279 }
00280 friend Array<int> operator|| (T v, Array<T>& m)
00281 {
00282 return Array<T>::Or(m, v);
00283 }
00284
00285 friend Array<int> operator< (Array<T>& m, T v)
00286 {
00287 return Array<T>::Lt(m, v);
00288 }
00289 friend Array<int> operator< (T v, Array<T>& m)
00290 {
00291 return Array<T>::Gt(m, v);
00292 }
00293
00294 friend Array<int> operator> (Array<T>& m, T v)
00295 {
00296 return Array<T>::Gt(m, v);
00297 }
00298 friend Array<int> operator> (T v, Array<T>& m)
00299 {
00300 return Array<T>::Lt(m, v);
00301 }
00302
00303 friend Array<int> operator<= (Array<T>& m, T v)
00304 {
00305 return Array<T>::Le(m, v);
00306 }
00307 friend Array<int> operator<= (T v, Array<T>& m)
00308 {
00309 return Array<T>::Ge(m, v);
00310 }
00311
00312 friend Array<int> operator>= (Array<T>& m, T v)
00313 {
00314 return Array<T>::Ge(m, v);
00315 }
00316 friend Array<int> operator>= (T v, Array<T>& m)
00317 {
00318 return Array<T>::Le(m, v);
00319 }
00320
00321 friend Array<int> operator== (Array<T>& m, T v)
00322 {
00323 return Array<T>::Eq(m, v);
00324 }
00325 friend Array<int> operator== (T v, Array<T>& m)
00326 {
00327 return Array<T>::Eq(m, v);
00328 }
00329
00330 friend Array<int> operator!= (Array<T>& m, T v)
00331 {
00332 return Array<T>::Ne(m, v);
00333 }
00334 friend Array<int> operator!= (T v, Array<T>& m)
00335 {
00336 return Array<T>::Ne(m, v);
00337 }
00338
00339
00340
00341
00342
00343
00344 friend Array<T> operator+ (Array<T>& m1, Array<T>& m2)
00345 {
00346 return Array<T>::Add(m1, m2);
00347 }
00348
00349 friend Array<T> operator- (Array<T>& m1, Array<T>& m2)
00350 {
00351 return Array<T>::Subtract(m1, m2);
00352 }
00353
00354 friend Array<T> operator* (Array<T>& m1, Array<T>& m2)
00355 {
00356 return Array<T>::Multiply(m1, m2);
00357 }
00358
00359 friend Array<T> operator/ (Array<T>& m1, Array<T>& m2)
00360 {
00361 return Array<T>::Divide(m1, m2);
00362 }
00363
00364
00365
00366
00367 friend Array<T> operator+ (Array<T>& m, T v)
00368 {
00369 return Array<T>::Add(m, v);
00370 }
00371
00372 friend Array<T> operator+ (T v, Array<T>& m)
00373 {
00374 return Array<T>::Add(m, v);
00375 }
00376
00377 friend Array<T> operator- (Array<T>& m, T v)
00378 {
00379 return Array<T>::Subtract(m, v);
00380 }
00381
00382 friend Array<T> operator- (T v, Array<T>& m)
00383 {
00384 return Array<T>::Subtract(v, m);
00385 }
00386
00387 friend Array<T> operator* (Array<T>& m, T v)
00388 {
00389 return Array<T>::Multiply(m, v);
00390 }
00391
00392 friend Array<T> operator* (T v, Array<T>& m)
00393 {
00394 return Array<T>::Multiply(m, v);
00395 }
00396
00397 friend Array<T> operator/ (Array<T>& m, T v)
00398 {
00399 return Array<T>::Divide(m, v);
00400 }
00401
00402 friend Array<T> operator/ (T v, Array<T>& m)
00403 {
00404 return Array<T>::Divide(v, m);
00405 }
00406
00407
00408
00409
00410
00411 Array<T>& operator+= (Array<T>& m);
00412 Array<T>& operator-= (Array<T>& m);
00413 Array<T>& operator*= (Array<T>& m);
00414 Array<T>& operator/= (Array<T>& m);
00415
00416 Array<T>& operator+= (T v);
00417 Array<T>& operator-= (T v);
00418 Array<T>& operator*= (T v);
00419 Array<T>& operator/= (T v);
00420
00421
00422
00423 Array(Matrix<T> &m);
00424 Array(Vector<T> &m);
00425
00426
00427 };
00428
00429
00430
00431
00432
00433 #include "./Array.inl"
00434
00435
00436
00437
00438 #endif
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
CIMPL 0.1 Code Reference.
Copyright © 2004, Baris Sumengen. All rights reserved.