$treeview $search $mathjax
Palabos  Version 1.1
$projectbrief
$projectbrief
$searchbox

array.h

Go to the documentation of this file.
00001 /* This file is part of the Palabos library.
00002  *
00003  * Copyright (C) 2011 FlowKit Sarl
00004  * Avenue de Chailly 23
00005  * 1012 Lausanne, Switzerland
00006  * E-mail contact: contact@flowkit.com
00007  *
00008  * The most recent release of Palabos can be downloaded at 
00009  * <http://www.palabos.org/>
00010  *
00011  * The library Palabos is free software: you can redistribute it and/or
00012  * modify it under the terms of the GNU Affero General Public License as
00013  * published by the Free Software Foundation, either version 3 of the
00014  * License, or (at your option) any later version.
00015  *
00016  * The library is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU Affero General Public License for more details.
00020  * 
00021  * You should have received a copy of the GNU Affero General Public License
00022  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00023 */
00024 
00029 #ifndef ARRAY_H
00030 #define ARRAY_H
00031 
00032 #include "core/globalDefs.h"
00033 #include "core/plbDebug.h"
00034 #include <algorithm>
00035 
00036 namespace plb {
00037 
00048 template<typename T, pluint size>
00049 class Array {
00050 public:
00051     Array() { }
00054     template<typename U>
00055     Array(Array<U,size> const& rhs) {
00056         std::copy(&rhs[0], &rhs[0]+size, data);
00057     }
00060     template<typename U>
00061     Array<T,size>& operator=(Array<U,size> const& rhs) {
00062         std::copy(&rhs[0], &rhs[0]+size, data);
00063     }
00064     T& operator[](pluint index) {
00065         PLB_PRECONDITION(index<size);
00066         return data[index];
00067     }
00068     T const& operator[](pluint index) const {
00069         PLB_PRECONDITION(index<size);
00070         return data[index];
00071     }
00072     void from_cArray(T const* cArray) {
00073         std::copy(cArray, cArray+size, data);
00074     }
00075     void to_cArray(T* cArray) const {
00076         std::copy(data, data+size, cArray);
00077     }
00078     void resetToZero() {
00079         std::fill_n(data, size, T());
00080     }
00081     Array<T,size>& operator += (Array<T,size> const& b) {
00082         for (pluint i=0; i<size; ++i) {
00083             data[i] += b[i];
00084         }
00085         return *this;
00086     }
00087     Array<T,size>& operator += (T alpha) {
00088         for (pluint i=0; i<size; ++i) {
00089             data[i] += alpha;
00090         }
00091         return *this;
00092     }
00093     Array<T,size>& operator -= (Array<T,size> const& b) {
00094         for (pluint i=0; i<size; ++i) {
00095             data[i] -= b[i];
00096         }
00097         return *this;
00098     }
00099     Array<T,size>& operator -= (T alpha) {
00100         for (pluint i=0; i<size; ++i) {
00101             data[i] -= alpha;
00102         }
00103         return *this;
00104     }
00105     Array<T,size>& operator *= (Array<T,size> const& b) {
00106         for (pluint i=0; i<size; ++i) {
00107             data[i] *= b[i];
00108         }
00109         return *this;
00110     }
00111     Array<T,size>& operator *= (T alpha) {
00112         for (pluint i=0; i<size; ++i) {
00113             data[i] *= alpha;
00114         }
00115         return *this;
00116     }
00117     Array<T,size>& operator /= (Array<T,size> const& b) {
00118         for (pluint i=0; i<size; ++i) {
00119             data[i] /= b[i];
00120         }
00121         return *this;
00122     }
00123     Array<T,size>& operator /= (T alpha) {
00124         for (pluint i=0; i<size; ++i) {
00125             data[i] /= alpha;
00126         }
00127         return *this;
00128     }
00129 private:
00130     T data[size];
00131 };
00132 
00133 template <typename T, pluint size>
00134 Array<T,size> operator+(Array<T,size> const& a, Array<T,size> const& b) {
00135     Array<T,size> result;
00136     for (pluint i=0; i<size; ++i) {
00137         result[i] = a[i] + b[i];
00138     }
00139     return result;
00140 }
00141 
00142 template<typename T, pluint size>
00143 Array<T,size> operator+(Array<T,size> const& a, T alpha) {
00144     Array<T,size> result;
00145     for (pluint i=0; i<size; ++i) {
00146         result[i] = a[i] + alpha;
00147     }
00148     return result;
00149 }
00150 
00151 template<typename T, pluint size>
00152 Array<T,size> operator+(T alpha, Array<T,size> const& a) {
00153     Array<T,size> result;
00154     for (pluint i=0; i<size; ++i) {
00155         result[i] = alpha + a[i];
00156     }
00157     return result;
00158 }
00159 
00160 template<typename T, pluint size>
00161 Array<T,size> operator-(Array<T,size> const& a, Array<T,size> const& b) {
00162     Array<T,size> result;
00163     for (pluint i=0; i<size; ++i) {
00164         result[i] = a[i] - b[i];
00165     }
00166     return result;
00167 }
00168 
00169 template<typename T, pluint size>
00170 Array<T,size> operator-(Array<T,size> const& a) {
00171     Array<T,size> result;
00172     for (pluint i=0; i<size; ++i) {
00173         result[i] = -a[i];
00174     }
00175     return result;
00176 }
00177 
00178 template<typename T, pluint size>
00179 Array<T,size> operator-(Array<T,size> const& a, T alpha) {
00180     Array<T,size> result;
00181     for (pluint i=0; i<size; ++i) {
00182         result[i] = a[i] - alpha;
00183     }
00184     return result;
00185 }
00186 
00187 template<typename T, pluint size>
00188 Array<T,size> operator-(T alpha, Array<T,size> const& a) {
00189     Array<T,size> result;
00190     for (pluint i=0; i<size; ++i) {
00191         result[i] = alpha - a[i];
00192     }
00193     return result;
00194 }
00195 
00196 template<typename T, pluint size>
00197 Array<T,size> operator*(Array<T,size> const& a, Array<T,size> const& b) {
00198     Array<T,size> result;
00199     for (pluint i=0; i<size; ++i) {
00200         result[i] = a[i] * b[i];
00201     }
00202     return result;
00203 }
00204 
00205 template<typename T, pluint size>
00206 Array<T,size> operator*(Array<T,size> const& a, T alpha) {
00207     Array<T,size> result;
00208     for (pluint i=0; i<size; ++i) {
00209         result[i] = a[i] * alpha;
00210     }
00211     return result;
00212 }
00213 
00214 template<typename T, pluint size>
00215 Array<T,size> operator*(T alpha, Array<T,size> const& a) {
00216     Array<T,size> result;
00217     for (pluint i=0; i<size; ++i) {
00218         result[i] = alpha * a[i];
00219     }
00220     return result;
00221 }
00222 
00223 template<typename T, pluint size>
00224 Array<T,size> operator/(Array<T,size> const& a, Array<T,size> const& b) {
00225     Array<T,size> result;
00226     for (pluint i=0; i<size; ++i) {
00227         result[i] = a[i] / b[i];
00228     }
00229     return result;
00230 }
00231 
00232 template<typename T, pluint size>
00233 Array<T,size> operator/(Array<T,size> const& a, T alpha) {
00234     Array<T,size> result;
00235     for (pluint i=0; i<size; ++i) {
00236         result[i] = a[i] / alpha;
00237     }
00238     return result;
00239 }
00240 
00241 template<typename T, pluint size>
00242 inline bool operator==(Array<T,size> const& A, Array<T,size> const& B) {
00243     for (pluint iA = 0; iA < size; ++iA) {
00244         if (A[iA] != B[iA]) return false;
00245     }
00246     return true;
00247 }
00248 
00249 template<typename T, pluint size>
00250 inline bool operator!=(Array<T,size> const& A, Array<T,size> const& B) {
00251     for (pluint iA = 0; iA < size; ++iA) {
00252         if (A[iA] != B[iA]) return true;
00253     }
00254     return false;
00255 }
00256 
00257 template<typename T, pluint size>
00258 inline bool operator<(Array<T,size> const& A, Array<T,size> const& B) {
00259     for (pluint iA=0; iA<size; ++iA) {
00260         if (A[iA] < B[iA]) return true;
00261         if (A[iA] > B[iA]) return false;
00262     }
00263     return false;
00264 }
00265 
00266 template<typename T, pluint size>
00267 Array<T,size> operator/(T alpha, Array<T,size> const& a) {
00268     Array<T,size> result;
00269     for (pluint i=0; i<size; ++i) {
00270         result[i] = alpha / a[i];
00271     }
00272     return result;
00273 }
00274 
00275 
00276 template<typename T>
00277 class Array<T,2> {
00278 public:
00279     Array() { }
00280     Array(T x, T y) {
00281         data[0] = x;
00282         data[1] = y;
00283     }
00284     template<typename U>
00285     Array(Array<U,2> const& rhs) {
00286         data[0] = (T) rhs[0];
00287         data[1] = (T) rhs[1];
00288     }
00289     template<typename U>
00290     Array<T,2>& operator=(Array<U,2> const& rhs) {
00291         data[0] = (T) rhs[0];
00292         data[1] = (T) rhs[1];
00293     }
00294     T& operator[](pluint index) {
00295         PLB_PRECONDITION(index<2);
00296         return data[index];
00297     }
00298     T const& operator[](pluint index) const {
00299         PLB_PRECONDITION(index<2);
00300         return data[index];
00301     }
00302     void from_cArray(T const* cArray) {
00303         data[0] = cArray[0];
00304         data[1] = cArray[1];
00305     }
00306     void to_cArray(T* cArray) const {
00307         cArray[0] = data[0];
00308         cArray[1] = data[1];
00309     }
00310     void resetToZero() {
00311         data[0] = T();
00312         data[1] = T();
00313     }
00314     Array<T,2>& operator+=(Array<T,2> const& b) {
00315         data[0] += b[0];
00316         data[1] += b[1];
00317         return *this;
00318     }
00319     Array<T,2>& operator+=(T alpha) {
00320         data[0] += alpha;
00321         data[1] += alpha;
00322         return *this;
00323     }
00324     Array<T,2>& operator-=(Array<T,2> const& b) {
00325         data[0] -= b[0];
00326         data[1] -= b[1];
00327         return *this;
00328     }
00329     Array<T,2>& operator-=(T alpha) {
00330         data[0] -= alpha;
00331         data[1] -= alpha;
00332         return *this;
00333     }
00334     Array<T,2>& operator*=(Array<T,2> const& b) {
00335         data[0] *= b[0];
00336         data[1] *= b[1];
00337         return *this;
00338     }
00339     Array<T,2>& operator*=(T alpha) {
00340         data[0] *= alpha;
00341         data[1] *= alpha;
00342         return *this;
00343     }
00344     Array<T,2>& operator/=(Array<T,2> const& b) {
00345         data[0] /= b[0];
00346         data[1] /= b[1];
00347         return *this;
00348     }
00349     Array<T,2>& operator/=(T alpha) {
00350         data[0] /= alpha;
00351         data[1] /= alpha;
00352         return *this;
00353     }
00354 private:
00355     T data[2];
00356 };
00357 
00358 template<typename T>
00359 Array<T,2> operator+(Array<T,2> const& a, Array<T,2> const& b) {
00360     return Array<T,2>(a[0]+b[0], a[1]+b[1]);
00361 }
00362 
00363 template<typename T>
00364 Array<T,2> operator+(Array<T,2> const& a, T alpha) {
00365     return Array<T,2>(a[0]+alpha, a[1]+alpha);
00366 }
00367 
00368 template<typename T>
00369 Array<T,2> operator+(T alpha, Array<T,2> const& a) {
00370     return Array<T,2>(alpha+a[0], alpha+a[1]);
00371 }
00372 
00373 template<typename T>
00374 Array<T,2> operator-(Array<T,2> const& a, Array<T,2> const& b) {
00375     return Array<T,2>(a[0]-b[0], a[1]-b[1]);
00376 }
00377 
00378 template<typename T>
00379 Array<T,2> operator-(Array<T,2> const& a) {
00380     return Array<T,2>(-a[0],-a[1]);
00381 }
00382 
00383 template<typename T>
00384 Array<T,2> operator-(Array<T,2> const& a, T alpha) {
00385     return Array<T,2>(a[0]-alpha, a[1]-alpha);
00386 }
00387 
00388 template<typename T>
00389 Array<T,2> operator-(T alpha, Array<T,2> const& a) {
00390     return Array<T,2>(alpha-a[0], alpha-a[1]);
00391 }
00392 
00393 template<typename T>
00394 Array<T,2> operator*(Array<T,2> const& a, Array<T,2> const& b) {
00395     return Array<T,2>(a[0]*b[0], a[1]*b[1]);
00396 }
00397 
00398 template<typename T>
00399 Array<T,2> operator*(Array<T,2> const& a, T alpha) {
00400     return Array<T,2>(a[0]*alpha, a[1]*alpha);
00401 }
00402 
00403 template<typename T>
00404 Array<T,2> operator*(T alpha, Array<T,2> const& a) {
00405     return Array<T,2>(alpha*a[0], alpha*a[1]);
00406 }
00407 
00408 template<typename T>
00409 Array<T,2> operator/(Array<T,2> const& a, Array<T,2> const& b) {
00410     return Array<T,2>(a[0]/b[0], a[1]/b[1]);
00411 }
00412 
00413 template<typename T>
00414 Array<T,2> operator/(Array<T,2> const& a, T alpha) {
00415     return Array<T,2>(a[0]/alpha, a[1]/alpha);
00416 }
00417 
00418 template<typename T>
00419 Array<T,2> operator/(T alpha, Array<T,2> const& a) {
00420     return Array<T,2>(alpha/a[0], alpha/a[1]);
00421 }
00422 
00423 template<typename T>
00424 class Array<T,3> {
00425 public:
00426     Array() { }
00427     Array(T x, T y, T z) {
00428         data[0] = x;
00429         data[1] = y;
00430         data[2] = z;
00431     }
00432     template<typename U>
00433     Array(Array<U,3> const& rhs) {
00434         data[0] = (T) rhs[0];
00435         data[1] = (T) rhs[1];
00436         data[2] = (T) rhs[2];
00437     }
00438     template<typename U>
00439     Array<T,3>& operator=(Array<U,3> const& rhs) {
00440         data[0] = (T) rhs[0];
00441         data[1] = (T) rhs[1];
00442         data[2] = (T) rhs[2];
00443     }
00444     T& operator[](pluint index) {
00445         PLB_PRECONDITION(index<3);
00446         return data[index];
00447     }
00448     T const& operator[](pluint index) const {
00449         PLB_PRECONDITION(index<3);
00450         return data[index];
00451     }
00452     void from_cArray(T const* cArray) {
00453         data[0] = cArray[0];
00454         data[1] = cArray[1];
00455         data[2] = cArray[2];
00456     }
00457     void to_cArray(T* cArray) const {
00458         cArray[0] = data[0];
00459         cArray[1] = data[1];
00460         cArray[2] = data[2];
00461     }
00462     void resetToZero() {
00463         data[0] = T();
00464         data[1] = T();
00465         data[2] = T();
00466     }
00467     Array<T,3>& operator += (Array<T,3> const& b) {
00468         data[0] += b[0];
00469         data[1] += b[1];
00470         data[2] += b[2];
00471         return *this;
00472     }
00473     Array<T,3>& operator += (T alpha) {
00474         data[0] += alpha;
00475         data[1] += alpha;
00476         data[2] += alpha;
00477         return *this;
00478     }
00479     Array<T,3>& operator -= (Array<T,3> const& b) {
00480         data[0] -= b[0];
00481         data[1] -= b[1];
00482         data[2] -= b[2];
00483         return *this;
00484     }
00485     Array<T,3>& operator -= (T alpha) {
00486         data[0] -= alpha;
00487         data[1] -= alpha;
00488         data[2] -= alpha;
00489         return *this;
00490     }
00491     Array<T,3>& operator *= (Array<T,3> const& b) {
00492         data[0] *= b[0];
00493         data[1] *= b[1];
00494         data[2] *= b[2];
00495         return *this;
00496     }
00497     Array<T,3>& operator *= (T alpha) {
00498         data[0] *= alpha;
00499         data[1] *= alpha;
00500         data[2] *= alpha;
00501         return *this;
00502     }
00503     Array<T,3>& operator /= (Array<T,3> const& b) {
00504         data[0] /= b[0];
00505         data[1] /= b[1];
00506         data[2] /= b[2];
00507         return *this;
00508     }
00509     Array<T,3>& operator /= (T alpha) {
00510         data[0] /= alpha;
00511         data[1] /= alpha;
00512         data[2] /= alpha;
00513         return *this;
00514     }
00515 private:
00516     T data[3];
00517 };
00518 
00519 template<typename T>
00520 Array<T,3> operator+(Array<T,3> const& a, Array<T,3> const& b) {
00521     return Array<T,3>(a[0]+b[0], a[1]+b[1], a[2]+b[2]);
00522 }
00523 
00524 template<typename T>
00525 Array<T,3> operator+(Array<T,3> const& a, T alpha) {
00526     return Array<T,3>(a[0]+alpha, a[1]+alpha, a[2]+alpha);
00527 }
00528 
00529 template<typename T>
00530 Array<T,3> operator+(T alpha, Array<T,3> const& a) {
00531     return Array<T,3>(alpha+a[0], alpha+a[1], alpha+a[2]);
00532 }
00533 
00534 template<typename T>
00535 Array<T,3> operator-(Array<T,3> const& a, Array<T,3> const& b) {
00536     return Array<T,3>(a[0]-b[0], a[1]-b[1], a[2]-b[2]);
00537 }
00538 
00539 template<typename T>
00540 Array<T,3> operator-(Array<T,3> const& a) {
00541     return Array<T,3>(-a[0], -a[1], -a[2]);
00542 }
00543 
00544 template<typename T>
00545 Array<T,3> operator-(Array<T,3> const& a, T alpha) {
00546     return Array<T,3>(a[0]-alpha, a[1]-alpha, a[2]-alpha);
00547 }
00548 
00549 template<typename T>
00550 Array<T,3> operator-(T alpha, Array<T,3> const& a) {
00551     return Array<T,3>(alpha-a[0], alpha-a[1], alpha-a[2]);
00552 }
00553 
00554 template<typename T>
00555 Array<T,3> operator*(Array<T,3> const& a, Array<T,3> const& b) {
00556     return Array<T,3>(a[0]*b[0], a[1]*b[1], a[2]*b[2]);
00557 }
00558 
00559 template<typename T>
00560 Array<T,3> operator*(Array<T,3> const& a, T alpha) {
00561     return Array<T,3>(a[0]*alpha, a[1]*alpha, a[2]*alpha);
00562 }
00563 
00564 template<typename T>
00565 Array<T,3> operator*(T alpha, Array<T,3> const& a) {
00566     return Array<T,3>(alpha*a[0], alpha*a[1], alpha*a[2]);
00567 }
00568 
00569 template<typename T>
00570 Array<T,3> operator/(Array<T,3> const& a, Array<T,3> const& b) {
00571     return Array<T,3>(a[0]/b[0], a[1]/b[1], a[2]/b[2]);
00572 }
00573 
00574 template<typename T>
00575 Array<T,3> operator/(Array<T,3> const& a, T alpha) {
00576     return Array<T,3>(a[0]/alpha, a[1]/alpha, a[2]/alpha);
00577 }
00578 
00579 template<typename T>
00580 Array<T,3> operator/(T alpha, Array<T,3> const& a) {
00581     return Array<T,3>(alpha/a[0], alpha/a[1], alpha/a[2]);
00582 }
00583 
00584 
00585 template<typename T>
00586 class Array<T,4> {
00587 public:
00588     Array() { }
00589     Array(T a0, T a1, T a2, T a3) {
00590         data[0] = a0;
00591         data[1] = a1;
00592         data[2] = a2;
00593         data[3] = a3;
00594     }
00595     template<typename U>
00596     Array(Array<U,4> const& rhs) {
00597         data[0] = (T) rhs[0];
00598         data[1] = (T) rhs[1];
00599         data[2] = (T) rhs[2];
00600         data[3] = (T) rhs[3];
00601     }
00602     template<typename U>
00603     Array<T,4>& operator=(Array<U,4> const& rhs) {
00604         data[0] = (T) rhs[0];
00605         data[1] = (T) rhs[1];
00606         data[2] = (T) rhs[2];
00607         data[3] = (T) rhs[3];
00608     }
00609     T& operator[](pluint index) {
00610         PLB_PRECONDITION(index<4);
00611         return data[index];
00612     }
00613     T const& operator[](pluint index) const {
00614         PLB_PRECONDITION(index<4);
00615         return data[index];
00616     }
00617     void from_cArray(T const* cArray) {
00618         data[0] = cArray[0];
00619         data[1] = cArray[1];
00620         data[2] = cArray[2];
00621         data[3] = cArray[3];
00622     }
00623     void to_cArray(T* cArray) const {
00624         cArray[0] = data[0];
00625         cArray[1] = data[1];
00626         cArray[2] = data[2];
00627         cArray[3] = data[3];
00628     }
00629     void resetToZero() {
00630         data[0] = T();
00631         data[1] = T();
00632         data[2] = T();
00633         data[3] = T();
00634     }
00635     Array<T,4>& operator += (Array<T,4> const& b) {
00636         data[0] += b[0];
00637         data[1] += b[1];
00638         data[2] += b[2];
00639         data[3] += b[3];
00640         return *this;
00641     }
00642     Array<T,4>& operator += (T alpha) {
00643         data[0] += alpha;
00644         data[1] += alpha;
00645         data[2] += alpha;
00646         data[3] += alpha;
00647         return *this;
00648     }
00649     Array<T,4>& operator -= (Array<T,4> const& b) {
00650         data[0] -= b[0];
00651         data[1] -= b[1];
00652         data[2] -= b[2];
00653         data[3] -= b[3];
00654         return *this;
00655     }
00656     Array<T,4>& operator -= (T alpha) {
00657         data[0] -= alpha;
00658         data[1] -= alpha;
00659         data[2] -= alpha;
00660         data[3] -= alpha;
00661         return *this;
00662     }
00663     Array<T,4>& operator *= (Array<T,4> const& b) {
00664         data[0] *= b[0];
00665         data[1] *= b[1];
00666         data[2] *= b[2];
00667         data[3] *= b[3];
00668         return *this;
00669     }
00670     Array<T,4>& operator *= (T alpha) {
00671         data[0] *= alpha;
00672         data[1] *= alpha;
00673         data[2] *= alpha;
00674         data[3] *= alpha;
00675         return *this;
00676     }
00677     Array<T,4>& operator /= (Array<T,4> const& b) {
00678         data[0] /= b[0];
00679         data[1] /= b[1];
00680         data[2] /= b[2];
00681         data[3] /= b[3];
00682         return *this;
00683     }
00684     Array<T,4>& operator /= (T alpha) {
00685         data[0] /= alpha;
00686         data[1] /= alpha;
00687         data[2] /= alpha;
00688         data[3] /= alpha;
00689         return *this;
00690     }
00691 private:
00692     T data[4];
00693 };
00694 
00695 template<typename T>
00696 Array<T,4> operator+(Array<T,4> const& a, Array<T,4> const& b) {
00697     return Array<T,4>(a[0]+b[0], a[1]+b[1], a[2]+b[2], a[3]+b[3]);
00698 }
00699 
00700 template<typename T>
00701 Array<T,4> operator+(Array<T,4> const& a, T alpha) {
00702     return Array<T,4>(a[0]+alpha, a[1]+alpha, a[2]+alpha, a[3]+alpha);
00703 }
00704 
00705 template<typename T>
00706 Array<T,4> operator+(T alpha, Array<T,4> const& a) {
00707     return Array<T,4>(alpha+a[0], alpha+a[1], alpha+a[2], alpha+a[3]);
00708 }
00709 
00710 template<typename T>
00711 Array<T,4> operator-(Array<T,4> const& a, Array<T,4> const& b) {
00712     return Array<T,4>(a[0]-b[0], a[1]-b[1], a[2]-b[2], a[3]-b[3]);
00713 }
00714 
00715 template<typename T>
00716 Array<T,4> operator-(Array<T,4> const& a) {
00717     return Array<T,4>(-a[0], -a[1], -a[2], -a[3]);
00718 }
00719 
00720 template<typename T>
00721 Array<T,4> operator-(Array<T,4> const& a, T alpha) {
00722     return Array<T,4>(a[0]-alpha, a[1]-alpha, a[2]-alpha, a[3]-alpha);
00723 }
00724 
00725 template<typename T>
00726 Array<T,4> operator-(T alpha, Array<T,4> const& a) {
00727     return Array<T,4>(alpha-a[0], alpha-a[1], alpha-a[2], alpha-a[3]);
00728 }
00729 
00730 template<typename T>
00731 Array<T,4> operator*(Array<T,4> const& a, Array<T,4> const& b) {
00732     return Array<T,4>(a[0]*b[0], a[1]*b[1], a[2]*b[2], a[3]*b[3]);
00733 }
00734 
00735 template<typename T>
00736 Array<T,4> operator*(Array<T,4> const& a, T alpha) {
00737     return Array<T,4>(a[0]*alpha, a[1]*alpha, a[2]*alpha, a[3]*alpha);
00738 }
00739 
00740 template<typename T>
00741 Array<T,4> operator*(T alpha, Array<T,4> const& a) {
00742     return Array<T,4>(alpha*a[0], alpha*a[1], alpha*a[2], alpha*a[3]);
00743 }
00744 
00745 template<typename T>
00746 Array<T,4> operator/(Array<T,4> const& a, Array<T,4> const& b) {
00747     return Array<T,4>(a[0]/b[0], a[1]/b[1], a[2]/b[2], a[3]/b[3]);
00748 }
00749 
00750 template<typename T>
00751 Array<T,4> operator/(Array<T,4> const& a, T alpha) {
00752     return Array<T,4>(a[0]/alpha, a[1]/alpha, a[2]/alpha, a[3]/alpha);
00753 }
00754 
00755 template<typename T>
00756 Array<T,4> operator/(T alpha, Array<T,4> const& a) {
00757     return Array<T,4>(alpha/a[0], alpha/a[1], alpha/a[2], alpha/a[3]);
00758 }
00759 
00760 } // end namespace plb
00761 
00762 #endif