00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "marray.h"
00020
00021
00022 template<class E> MultiArray<E>::MultiArray(const vector<int> &dims,
00023 const E &x) {
00024 int i,offset;
00025
00026 MaxSize = 10000000;
00027 Dimensions = dims;
00028 Dimension = dims.size();
00029
00030 Offsets = vector<int>(Dimension);
00031
00032 offset = 1;
00033 for (i = 0; i < Dimension; i++) {
00034 Offsets[i] = offset;
00035 offset *= Dimensions[i];
00036 }
00037
00038 Size = offset;
00039
00040 if (Size <= MaxSize) {
00041
00042 A = vector<E>(Size);
00043 for (i = 0; i < Size; i++)
00044 A[i] = x;
00045 }
00046 else {
00047 cout << "Size " << Size << " exceeds MaxSize limit " << MaxSize << "\n";
00048 exit(-1);
00049 }
00050
00051 }
00052
00053
00054 template<class E> MultiArray<E>::MultiArray(const vector<int> &dims) {
00055 E x;
00056
00057 MultiArray(dims,x);
00058 }
00059
00060
00061 template<class E> inline E& MultiArray<E>::operator[](const vector<int>
00062 &indices) {
00063 int i,index;
00064
00065 index = indices[0];
00066
00067 for (i = 1; i < Dimension; i++) {
00068 index += indices[i]*Offsets[i];
00069 }
00070
00071 return A[index];
00072 }
00073
00074
00075 template<class E> inline bool MultiArray<E>::Increment(vector<int> &indices) {
00076 int i;
00077 bool carry,done;
00078
00079 carry = false;
00080 done = false;
00081
00082 if (indices[0] < Dimensions[0] - 1)
00083 indices[0]++;
00084 else {
00085 indices[0] = 0;
00086 carry = true;
00087 i = 1;
00088 while ((carry)&&(i < Dimension)) {
00089 if (indices[i] < Dimensions[i] - 1) {
00090 indices[i]++;
00091 carry = false;
00092 }
00093 else {
00094 indices[i] = 0;
00095 if (i == Dimension - 1)
00096 done = true;
00097 }
00098 i++;
00099 }
00100 }
00101
00102
00103 return done;
00104 }
00105
00106
00107
00108
00109