46 #ifdef BZ_ARRAY_SPACE_FILLING_TRAVERSAL
53 #include <blitz/array/slice.h>
54 #include <blitz/array/map.h>
55 #include <blitz/array/multi.h>
56 #include <blitz/array/domain.h>
57 #include <blitz/array/storage.h>
66 template<typename T_numtype,
int N_rank>
69 template<typename T_numtype,
int N_rank>
70 class ConstArrayIterator;
72 template<typename T_numtype,
int N_rank>
73 class FastArrayIterator;
75 template<typename P_expr>
78 template<typename T_array, typename T_index>
81 template <typename P_numtype,
int N_rank>
84 template <typename P_numtype,
int N_rank>
95 template<typename P_numtype,
int N_rank>
97 #ifdef BZ_NEW_EXPRESSION_TEMPLATES
105 using T_base::changeToNullBlock;
106 using T_base::numReferences;
132 static const int _bz_rank = N_rank;
143 template<
typename T_expr>
144 explicit Array(_bz_ArrayExpr<T_expr> expr);
153 Array(GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
162 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
165 length_[0] = length0;
170 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
173 BZPRECONDITION(N_rank >= 2);
174 TAU_TYPE_STRING(p1,
"Array<T,N>::Array() [T="
175 + CT(T_numtype) +
",N=" + CT(N_rank) +
"]");
176 TAU_PROFILE(p1,
"void (int,int)", TAU_BLITZ);
178 length_[0] = length0;
179 length_[1] = length1;
183 Array(
int length0,
int length1,
int length2,
184 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
187 BZPRECONDITION(N_rank >= 3);
188 length_[0] = length0;
189 length_[1] = length1;
190 length_[2] = length2;
194 Array(
int length0,
int length1,
int length2,
int length3,
195 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
198 BZPRECONDITION(N_rank >= 4);
199 length_[0] = length0;
200 length_[1] = length1;
201 length_[2] = length2;
202 length_[3] = length3;
206 Array(
int length0,
int length1,
int length2,
int length3,
int length4,
207 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
210 BZPRECONDITION(N_rank >= 5);
211 length_[0] = length0;
212 length_[1] = length1;
213 length_[2] = length2;
214 length_[3] = length3;
215 length_[4] = length4;
219 Array(
int length0,
int length1,
int length2,
int length3,
int length4,
221 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
224 BZPRECONDITION(N_rank >= 6);
225 length_[0] = length0;
226 length_[1] = length1;
227 length_[2] = length2;
228 length_[3] = length3;
229 length_[4] = length4;
230 length_[5] = length5;
234 Array(
int length0,
int length1,
int length2,
int length3,
int length4,
235 int length5,
int length6,
236 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
239 BZPRECONDITION(N_rank >= 7);
240 length_[0] = length0;
241 length_[1] = length1;
242 length_[2] = length2;
243 length_[3] = length3;
244 length_[4] = length4;
245 length_[5] = length5;
246 length_[6] = length6;
250 Array(
int length0,
int length1,
int length2,
int length3,
int length4,
251 int length5,
int length6,
int length7,
252 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
255 BZPRECONDITION(N_rank >= 8);
256 length_[0] = length0;
257 length_[1] = length1;
258 length_[2] = length2;
259 length_[3] = length3;
260 length_[4] = length4;
261 length_[5] = length5;
262 length_[6] = length6;
263 length_[7] = length7;
267 Array(
int length0,
int length1,
int length2,
int length3,
int length4,
268 int length5,
int length6,
int length7,
int length8,
269 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
272 BZPRECONDITION(N_rank >= 9);
273 length_[0] = length0;
274 length_[1] = length1;
275 length_[2] = length2;
276 length_[3] = length3;
277 length_[4] = length4;
278 length_[5] = length5;
279 length_[6] = length6;
280 length_[7] = length7;
281 length_[8] = length8;
285 Array(
int length0,
int length1,
int length2,
int length3,
int length4,
286 int length5,
int length6,
int length7,
int length8,
int length9,
287 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
290 BZPRECONDITION(N_rank >= 10);
291 length_[0] = length0;
292 length_[1] = length1;
293 length_[2] = length2;
294 length_[3] = length3;
295 length_[4] = length4;
296 length_[5] = length5;
297 length_[6] = length6;
298 length_[7] = length7;
299 length_[8] = length8;
300 length_[9] = length9;
304 Array(
int length0,
int length1,
int length2,
int length3,
int length4,
305 int length5,
int length6,
int length7,
int length8,
int length9,
307 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
310 BZPRECONDITION(N_rank >= 11);
311 length_[0] = length0;
312 length_[1] = length1;
313 length_[2] = length2;
314 length_[3] = length3;
315 length_[4] = length4;
316 length_[5] = length5;
317 length_[6] = length6;
318 length_[7] = length7;
319 length_[8] = length8;
320 length_[9] = length9;
321 length_[10] = length10;
330 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
335 BZPRECONDITION(dataFirst != 0);
339 data_ += zeroOffset_;
349 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
354 BZPRECONDITION(dataFirst != 0);
358 calculateZeroOffset();
359 data_ += zeroOffset_;
367 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
372 BZPRECONDITION(dataFirst != 0);
376 data_ += zeroOffset_;
389 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
394 BZPRECONDITION(dataFirst != 0);
398 calculateZeroOffset();
399 data_ += zeroOffset_;
410 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
414 setupStorage(N_rank - 1);
424 const GeneralArrayStorage<N_rank>& storage
425 = GeneralArrayStorage<N_rank>());
433 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
439 storage_.setBase(0, r0.
first());
444 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
451 storage_.setBase(0, r0.
first());
453 storage_.setBase(1, r1.
first());
459 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
466 storage_.setBase(0, r0.
first());
468 storage_.setBase(1, r1.
first());
470 storage_.setBase(2, r2.
first());
476 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
484 storage_.setBase(0, r0.
first());
486 storage_.setBase(1, r1.
first());
488 storage_.setBase(2, r2.
first());
490 storage_.setBase(3, r3.
first());
496 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
504 storage_.setBase(0, r0.
first());
506 storage_.setBase(1, r1.
first());
508 storage_.setBase(2, r2.
first());
510 storage_.setBase(3, r3.
first());
512 storage_.setBase(4, r4.
first());
518 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
527 storage_.setBase(0, r0.
first());
529 storage_.setBase(1, r1.
first());
531 storage_.setBase(2, r2.
first());
533 storage_.setBase(3, r3.
first());
535 storage_.setBase(4, r4.
first());
537 storage_.setBase(5, r5.
first());
544 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
553 storage_.setBase(0, r0.
first());
555 storage_.setBase(1, r1.
first());
557 storage_.setBase(2, r2.
first());
559 storage_.setBase(3, r3.
first());
561 storage_.setBase(4, r4.
first());
563 storage_.setBase(5, r5.
first());
565 storage_.setBase(6, r6.
first());
572 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
582 storage_.setBase(0, r0.
first());
584 storage_.setBase(1, r1.
first());
586 storage_.setBase(2, r2.
first());
588 storage_.setBase(3, r3.
first());
590 storage_.setBase(4, r4.
first());
592 storage_.setBase(5, r5.
first());
594 storage_.setBase(6, r6.
first());
596 storage_.setBase(7, r7.
first());
603 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
613 storage_.setBase(0, r0.
first());
615 storage_.setBase(1, r1.
first());
617 storage_.setBase(2, r2.
first());
619 storage_.setBase(3, r3.
first());
621 storage_.setBase(4, r4.
first());
623 storage_.setBase(5, r5.
first());
625 storage_.setBase(6, r6.
first());
627 storage_.setBase(7, r7.
first());
629 storage_.setBase(8, r8.
first());
636 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
647 storage_.setBase(0, r0.
first());
649 storage_.setBase(1, r1.
first());
651 storage_.setBase(2, r2.
first());
653 storage_.setBase(3, r3.
first());
655 storage_.setBase(4, r4.
first());
657 storage_.setBase(5, r5.
first());
659 storage_.setBase(6, r6.
first());
661 storage_.setBase(7, r7.
first());
663 storage_.setBase(8, r8.
first());
665 storage_.setBase(9, r9.
first());
672 GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
683 storage_.setBase(0, r0.
first());
685 storage_.setBase(1, r1.
first());
687 storage_.setBase(2, r2.
first());
689 storage_.setBase(3, r3.
first());
691 storage_.setBase(4, r4.
first());
693 storage_.setBase(5, r5.
first());
695 storage_.setBase(6, r6.
first());
697 storage_.setBase(7, r7.
first());
699 storage_.setBase(8, r8.
first());
701 storage_.setBase(9, r9.
first());
702 length_[10] = r10.
length();
703 storage_.setBase(10, r10.
first());
712 #ifdef BZ_NEW_EXPRESSION_TEMPLATES
720 reference(const_cast<T_array&>(array));
728 int lastExtent,
const GeneralArrayStorage<N_rank>& storage);
743 constructSubarray(array, r0);
748 constructSubarray(array, r0, r1);
753 constructSubarray(array, r0, r1, r2);
759 constructSubarray(array, r0, r1, r2, r3);
765 constructSubarray(array, r0, r1, r2, r3, r4);
771 constructSubarray(array, r0, r1, r2, r3, r4, r5);
777 constructSubarray(array, r0, r1, r2, r3, r4, r5, r6);
783 constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7);
789 constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7, r8);
795 constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9);
802 constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10);
806 const RectDomain<N_rank>& subdomain)
808 constructSubarray(array, subdomain);
813 const StridedDomain<N_rank>& subdomain)
815 constructSubarray(array, subdomain);
823 template<
int N_rank2,
typename R0,
typename R1,
typename R2,
typename R3,
typename R4,
824 typename R5,
typename R6,
typename R7,
typename R8,
typename R9,
typename R10>
826 R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10)
828 constructSlice(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10);
836 {
return storage_.base(); }
838 int base(
int rank)
const
839 {
return storage_.base(rank); }
842 {
return iterator(*
this); }
844 const_iterator begin()
const
845 {
return const_iterator(*
this); }
847 T_iterator beginFast()
const
848 {
return T_iterator(*
this); }
851 template<
typename P_numtype2>
853 int numComponents)
const
854 {
return extractComponent(a, compNum, numComponents); }
857 {
return length_[1]; }
860 {
return length_[1]; }
862 T_array copy()
const;
870 int dataOffset()
const
872 return dot(storage_.base(), stride_);
876 {
return data_ + dataOffset(); }
879 {
return data_ + dataOffset(); }
893 int dataFirstOffset()
const
901 for (
int i=0;
i < N_rank; ++
i)
902 pos += (storage_.base(
i) + (1-storage_.isRankStoredAscending(
i)) *
903 (length_(
i)-1)) * stride_(
i);
910 return data_ + dataFirstOffset();
915 return data_ + dataFirstOffset();
919 {
return length_[2]; }
921 int dimensions()
const
924 RectDomain<N_rank> domain()
const
926 return RectDomain<N_rank>(lbound(), ubound());
929 void dumpStructureInformation(ostream& os = cout)
const;
936 const_iterator end()
const
938 return const_iterator();
941 int extent(
int rank)
const
942 {
return length_[rank]; }
947 template<
typename P_numtype2>
949 int numComponents)
const;
957 bool isMajorRank(
int rank)
const {
return storage_.ordering(rank) == 0; }
958 bool isMinorRank(
int rank)
const {
return storage_.ordering(rank) != 0; }
960 return storage_.isRankStoredAscending(rank);
963 bool isStorageContiguous()
const;
965 int lbound(
int rank)
const {
return base(rank); }
968 int length(
int rank)
const {
return length_[rank]; }
983 int ordering(
int storageRankIndex)
const
984 {
return storage_.ordering(storageRankIndex); }
987 {
return storage_.ordering(); }
989 void transposeSelf(
int r0,
int r1,
int r2=0,
990 int r3=0,
int r4=0,
int r5=0,
int r6=0,
int r7=0,
int r8=0,
int
992 T_array transpose(
int r0,
int r1,
int r2=0,
993 int r3=0,
int r4=0,
int r5=0,
int r6=0,
int r7=0,
int r8=0,
int
999 void reference(
const T_array&);
1003 void reindexSelf(
const
1006 void resize(
int extent);
1007 void resize(
int extent1,
int extent2);
1008 void resize(
int extent1,
int extent2,
1010 void resize(
int extent1,
int extent2,
1011 int extent3,
int extent4);
1012 void resize(
int extent1,
int extent2,
1013 int extent3,
int extent4,
int extent5);
1014 void resize(
int extent1,
int extent2,
1015 int extent3,
int extent4,
int extent5,
1017 void resize(
int extent1,
int extent2,
1018 int extent3,
int extent4,
int extent5,
1019 int extent6,
int extent7);
1020 void resize(
int extent1,
int extent2,
1021 int extent3,
int extent4,
int extent5,
1022 int extent6,
int extent7,
int extent8);
1023 void resize(
int extent1,
int extent2,
1024 int extent3,
int extent4,
int extent5,
1025 int extent6,
int extent7,
int extent8,
1027 void resize(
int extent1,
int extent2,
1028 int extent3,
int extent4,
int extent5,
1029 int extent6,
int extent7,
int extent8,
1030 int extent9,
int extent10);
1031 void resize(
int extent1,
int extent2,
1032 int extent3,
int extent4,
int extent5,
1033 int extent6,
int extent7,
int extent8,
1034 int extent9,
int extent10,
1038 void resize(
Range r1);
1070 void resizeAndPreserve(
int extent);
1071 void resizeAndPreserve(
int extent1,
1073 void resizeAndPreserve(
int extent1,
1074 int extent2,
int extent3);
1075 void resizeAndPreserve(
int extent1,
1076 int extent2,
int extent3,
int extent4);
1077 void resizeAndPreserve(
int extent1,
1078 int extent2,
int extent3,
int extent4,
1080 void resizeAndPreserve(
int extent1,
1081 int extent2,
int extent3,
int extent4,
1082 int extent5,
int extent6);
1083 void resizeAndPreserve(
int extent1,
1084 int extent2,
int extent3,
int extent4,
1085 int extent5,
int extent6,
int extent7);
1086 void resizeAndPreserve(
int extent1,
1087 int extent2,
int extent3,
int extent4,
1088 int extent5,
int extent6,
int extent7,
1090 void resizeAndPreserve(
int extent1,
1091 int extent2,
int extent3,
int extent4,
1092 int extent5,
int extent6,
int extent7,
1093 int extent8,
int extent9);
1094 void resizeAndPreserve(
int extent1,
1095 int extent2,
int extent3,
int extent4,
1096 int extent5,
int extent6,
int extent7,
1097 int extent8,
int extent9,
1099 void resizeAndPreserve(
int extent1,
1100 int extent2,
int extent3,
int extent4,
1101 int extent5,
int extent6,
int extent7,
1102 int extent8,
int extent9,
int extent10,
1108 T_array reverse(
int rank);
1109 void reverseSelf(
int rank);
1112 {
return length_[0]; }
1114 void setStorage(GeneralArrayStorage<N_rank>);
1116 void slice(
int rank,
Range r);
1122 {
return numElements(); }
1127 int stride(
int rank)
const
1128 {
return stride_[rank]; }
1130 int ubound(
int rank)
const
1131 {
return base(rank) + length_(rank) - 1; }
1136 for (
int i=0;
i < N_rank; ++
i)
1137 ub(
i) = base(
i) + extent(
i) - 1;
1142 int zeroOffset()
const
1143 {
return zeroOffset_; }
1150 return i >= base(d) && (i - base(d)) < length_[d];
1154 return i0 >= base(0) && (i0 - base(0)) < length_[0];
1158 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1159 && i1 >= base(1) && (i1 - base(1)) < length_[1];
1163 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1164 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1165 && i2 >= base(2) && (i2 - base(2)) < length_[2];
1169 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1170 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1171 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1172 && i3 >= base(3) && (i3 - base(3)) < length_[3];
1175 bool isInRange(
int i0,
int i1,
int i2,
int i3,
int i4)
const {
1176 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1177 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1178 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1179 && i3 >= base(3) && (i3 - base(3)) < length_[3]
1180 && i4 >= base(4) && (i4 - base(4)) < length_[4];
1183 bool isInRange(
int i0,
int i1,
int i2,
int i3,
int i4,
int i5)
const {
1184 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1185 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1186 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1187 && i3 >= base(3) && (i3 - base(3)) < length_[3]
1188 && i4 >= base(4) && (i4 - base(4)) < length_[4]
1189 && i5 >= base(5) && (i5 - base(5)) < length_[5];
1192 bool isInRange(
int i0,
int i1,
int i2,
int i3,
int i4,
int i5,
int i6)
const {
1193 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1194 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1195 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1196 && i3 >= base(3) && (i3 - base(3)) < length_[3]
1197 && i4 >= base(4) && (i4 - base(4)) < length_[4]
1198 && i5 >= base(5) && (i5 - base(5)) < length_[5]
1199 && i6 >= base(6) && (i6 - base(6)) < length_[6];
1202 bool isInRange(
int i0,
int i1,
int i2,
int i3,
int i4,
1203 int i5,
int i6,
int i7)
const {
1204 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1205 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1206 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1207 && i3 >= base(3) && (i3 - base(3)) < length_[3]
1208 && i4 >= base(4) && (i4 - base(4)) < length_[4]
1209 && i5 >= base(5) && (i5 - base(5)) < length_[5]
1210 && i6 >= base(6) && (i6 - base(6)) < length_[6]
1211 && i7 >= base(7) && (i7 - base(7)) < length_[7];
1214 bool isInRange(
int i0,
int i1,
int i2,
int i3,
int i4,
1215 int i5,
int i6,
int i7,
int i8)
const {
1216 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1217 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1218 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1219 && i3 >= base(3) && (i3 - base(3)) < length_[3]
1220 && i4 >= base(4) && (i4 - base(4)) < length_[4]
1221 && i5 >= base(5) && (i5 - base(5)) < length_[5]
1222 && i6 >= base(6) && (i6 - base(6)) < length_[6]
1223 && i7 >= base(7) && (i7 - base(7)) < length_[7]
1224 && i8 >= base(8) && (i8 - base(8)) < length_[8];
1227 bool isInRange(
int i0,
int i1,
int i2,
int i3,
int i4,
1228 int i5,
int i6,
int i7,
int i8,
int i9)
const {
1229 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1230 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1231 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1232 && i3 >= base(3) && (i3 - base(3)) < length_[3]
1233 && i4 >= base(4) && (i4 - base(4)) < length_[4]
1234 && i5 >= base(5) && (i5 - base(5)) < length_[5]
1235 && i6 >= base(6) && (i6 - base(6)) < length_[6]
1236 && i7 >= base(7) && (i7 - base(7)) < length_[7]
1237 && i8 >= base(8) && (i8 - base(8)) < length_[8]
1238 && i9 >= base(9) && (i9 - base(9)) < length_[9];
1241 bool isInRange(
int i0,
int i1,
int i2,
int i3,
int i4,
1242 int i5,
int i6,
int i7,
int i8,
int i9,
int i10)
const {
1243 return i0 >= base(0) && (i0 - base(0)) < length_[0]
1244 && i1 >= base(1) && (i1 - base(1)) < length_[1]
1245 && i2 >= base(2) && (i2 - base(2)) < length_[2]
1246 && i3 >= base(3) && (i3 - base(3)) < length_[3]
1247 && i4 >= base(4) && (i4 - base(4)) < length_[4]
1248 && i5 >= base(5) && (i5 - base(5)) < length_[5]
1249 && i6 >= base(6) && (i6 - base(6)) < length_[6]
1250 && i7 >= base(7) && (i7 - base(7)) < length_[7]
1251 && i8 >= base(8) && (i8 - base(8)) < length_[8]
1252 && i9 >= base(9) && (i9 - base(9)) < length_[9]
1253 && i10 >= base(10) && (i10 - base(10)) < length_[10];
1257 for (
int i=0;
i < N_rank; ++
i)
1258 if (index[
i] < base(
i) || (index[
i] - base(
i)) >= length_[
i])
1265 BZPRECHECK(isInRange(index),
"Array index out of range: " << index
1266 << endl <<
"Lower bounds: " << storage_.base() << endl
1267 <<
"Length: " << length_ << endl);
1272 BZPRECHECK(isInRange(i0),
"Array index out of range: " << i0
1273 << endl <<
"Lower bounds: " << storage_.base() << endl
1274 <<
"Length: " << length_ << endl);
1279 BZPRECHECK(isInRange(i0,i1),
"Array index out of range: ("
1280 << i0 <<
", " << i1 <<
")"
1281 << endl <<
"Lower bounds: " << storage_.base() << endl
1282 <<
"Length: " << length_ << endl);
1286 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1287 int BZ_DEBUG_PARAM(i2))
const
1289 BZPRECHECK(isInRange(i0,i1,i2),
"Array index out of range: ("
1290 << i0 <<
", " << i1 <<
", " << i2 <<
")"
1291 << endl <<
"Lower bounds: " << storage_.base() << endl
1292 <<
"Length: " << length_ << endl);
1296 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1297 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3))
const
1299 BZPRECHECK(isInRange(i0,i1,i2,i3),
"Array index out of range: ("
1300 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3 <<
")"
1301 << endl <<
"Lower bounds: " << storage_.base() << endl
1302 <<
"Length: " << length_ << endl);
1306 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1307 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3),
1308 int BZ_DEBUG_PARAM(i4))
const
1310 BZPRECHECK(isInRange(i0,i1,i2,i3,i4),
"Array index out of range: ("
1311 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3
1312 <<
", " << i4 <<
")"
1313 << endl <<
"Lower bounds: " << storage_.base() << endl
1314 <<
"Length: " << length_ << endl);
1318 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1319 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3),
int BZ_DEBUG_PARAM(i4),
1320 int BZ_DEBUG_PARAM(i5))
const
1322 BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5),
"Array index out of range: ("
1323 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3
1324 <<
", " << i4 <<
", " << i5 <<
")"
1325 << endl <<
"Lower bounds: " << storage_.base() << endl
1326 <<
"Length: " << length_ << endl);
1330 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1331 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3),
int BZ_DEBUG_PARAM(i4),
1332 int BZ_DEBUG_PARAM(i5),
int BZ_DEBUG_PARAM(i6))
const
1334 BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6),
1335 "Array index out of range: ("
1336 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3
1337 <<
", " << i4 <<
", " << i5 <<
", " << i6 <<
")"
1338 << endl <<
"Lower bounds: " << storage_.base() << endl
1339 <<
"Length: " << length_ << endl);
1343 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1344 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3),
int BZ_DEBUG_PARAM(i4),
1345 int BZ_DEBUG_PARAM(i5),
int BZ_DEBUG_PARAM(i6),
1346 int BZ_DEBUG_PARAM(i7))
const
1348 BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7),
1349 "Array index out of range: ("
1350 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3
1351 <<
", " << i4 <<
", " << i5 <<
", " << i6 <<
", " << i7 <<
")"
1352 << endl <<
"Lower bounds: " << storage_.base() << endl
1353 <<
"Length: " << length_ << endl);
1357 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1358 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3),
int BZ_DEBUG_PARAM(i4),
1359 int BZ_DEBUG_PARAM(i5),
int BZ_DEBUG_PARAM(i6),
int BZ_DEBUG_PARAM(i7),
1360 int BZ_DEBUG_PARAM(i8))
const
1362 BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7,i8),
1363 "Array index out of range: ("
1364 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3
1365 <<
", " << i4 <<
", " << i5 <<
", " << i6 <<
", " << i7
1366 <<
", " << i8 <<
")"
1367 << endl <<
"Lower bounds: " << storage_.base() << endl
1368 <<
"Length: " << length_ << endl);
1372 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1373 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3),
int BZ_DEBUG_PARAM(i4),
1374 int BZ_DEBUG_PARAM(i5),
int BZ_DEBUG_PARAM(i6),
int BZ_DEBUG_PARAM(i7),
1375 int BZ_DEBUG_PARAM(i8),
int BZ_DEBUG_PARAM(i9))
const
1377 BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9),
1378 "Array index out of range: ("
1379 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3
1380 <<
", " << i4 <<
", " << i5 <<
", " << i6 <<
", " << i7
1381 <<
", " << i8 <<
", " << i9 <<
")"
1382 << endl <<
"Lower bounds: " << storage_.base() << endl
1383 <<
"Length: " << length_ << endl);
1387 bool assertInRange(
int BZ_DEBUG_PARAM(i0),
int BZ_DEBUG_PARAM(i1),
1388 int BZ_DEBUG_PARAM(i2),
int BZ_DEBUG_PARAM(i3),
int BZ_DEBUG_PARAM(i4),
1389 int BZ_DEBUG_PARAM(i5),
int BZ_DEBUG_PARAM(i6),
int BZ_DEBUG_PARAM(i7),
1390 int BZ_DEBUG_PARAM(i8),
int BZ_DEBUG_PARAM(i9),
1391 int BZ_DEBUG_PARAM(i10))
const
1393 BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10),
1394 "Array index out of range: ("
1395 << i0 <<
", " << i1 <<
", " << i2 <<
", " << i3
1396 <<
", " << i4 <<
", " << i5 <<
", " << i6 <<
", " << i7
1397 <<
", " << i8 <<
", " << i9 <<
", " << i10 <<
")"
1398 << endl <<
"Lower bounds: " << storage_.base() << endl
1399 <<
"Length: " << length_ << endl);
1407 template<
int N_rank2>
1410 assertInRange(index);
1411 return data_[dot(index, stride_)];
1414 template<
int N_rank2>
1417 assertInRange(index);
1418 return data_[dot(index, stride_)];
1423 assertInRange(index[0]);
1424 return data_[index[0] * stride_[0]];
1429 assertInRange(index[0]);
1430 return data_[index[0] * stride_[0]];
1435 assertInRange(index[0], index[1]);
1436 return data_[index[0] * stride_[0] + index[1] * stride_[1]];
1441 assertInRange(index[0], index[1]);
1442 return data_[index[0] * stride_[0] + index[1] * stride_[1]];
1447 assertInRange(index[0], index[1], index[2]);
1448 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1449 + index[2] * stride_[2]];
1454 assertInRange(index[0], index[1], index[2]);
1455 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1456 + index[2] * stride_[2]];
1461 assertInRange(index[0], index[1], index[2], index[3]);
1462 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1463 + index[2] * stride_[2] + index[3] * stride_[3]];
1468 assertInRange(index[0], index[1], index[2], index[3]);
1469 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1470 + index[2] * stride_[2] + index[3] * stride_[3]];
1475 assertInRange(index[0], index[1], index[2], index[3],
1477 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1478 + index[2] * stride_[2] + index[3] * stride_[3]
1479 + index[4] * stride_[4]];
1484 assertInRange(index[0], index[1], index[2], index[3],
1486 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1487 + index[2] * stride_[2] + index[3] * stride_[3]
1488 + index[4] * stride_[4]];
1493 assertInRange(index[0], index[1], index[2], index[3],
1494 index[4], index[5]);
1495 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1496 + index[2] * stride_[2] + index[3] * stride_[3]
1497 + index[4] * stride_[4] + index[5] * stride_[5]];
1502 assertInRange(index[0], index[1], index[2], index[3],
1503 index[4], index[5]);
1504 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1505 + index[2] * stride_[2] + index[3] * stride_[3]
1506 + index[4] * stride_[4] + index[5] * stride_[5]];
1511 assertInRange(index[0], index[1], index[2], index[3],
1512 index[4], index[5], index[6]);
1513 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1514 + index[2] * stride_[2] + index[3] * stride_[3]
1515 + index[4] * stride_[4] + index[5] * stride_[5]
1516 + index[6] * stride_[6]];
1521 assertInRange(index[0], index[1], index[2], index[3],
1522 index[4], index[5], index[6]);
1523 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1524 + index[2] * stride_[2] + index[3] * stride_[3]
1525 + index[4] * stride_[4] + index[5] * stride_[5]
1526 + index[6] * stride_[6]];
1531 assertInRange(index[0], index[1], index[2], index[3],
1532 index[4], index[5], index[6], index[7]);
1533 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1534 + index[2] * stride_[2] + index[3] * stride_[3]
1535 + index[4] * stride_[4] + index[5] * stride_[5]
1536 + index[6] * stride_[6] + index[7] * stride_[7]];
1541 assertInRange(index[0], index[1], index[2], index[3],
1542 index[4], index[5], index[6], index[7]);
1543 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1544 + index[2] * stride_[2] + index[3] * stride_[3]
1545 + index[4] * stride_[4] + index[5] * stride_[5]
1546 + index[6] * stride_[6] + index[7] * stride_[7]];
1551 assertInRange(index[0], index[1], index[2], index[3],
1552 index[4], index[5], index[6], index[7], index[8]);
1553 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1554 + index[2] * stride_[2] + index[3] * stride_[3]
1555 + index[4] * stride_[4] + index[5] * stride_[5]
1556 + index[6] * stride_[6] + index[7] * stride_[7]
1557 + index[8] * stride_[8]];
1562 assertInRange(index[0], index[1], index[2], index[3],
1563 index[4], index[5], index[6], index[7], index[8]);
1564 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1565 + index[2] * stride_[2] + index[3] * stride_[3]
1566 + index[4] * stride_[4] + index[5] * stride_[5]
1567 + index[6] * stride_[6] + index[7] * stride_[7]
1568 + index[8] * stride_[8]];
1573 assertInRange(index[0], index[1], index[2], index[3],
1574 index[4], index[5], index[6], index[7], index[8], index[9]);
1575 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1576 + index[2] * stride_[2] + index[3] * stride_[3]
1577 + index[4] * stride_[4] + index[5] * stride_[5]
1578 + index[6] * stride_[6] + index[7] * stride_[7]
1579 + index[8] * stride_[8] + index[9] * stride_[9]];
1584 assertInRange(index[0], index[1], index[2], index[3],
1585 index[4], index[5], index[6], index[7], index[8], index[9]);
1586 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1587 + index[2] * stride_[2] + index[3] * stride_[3]
1588 + index[4] * stride_[4] + index[5] * stride_[5]
1589 + index[6] * stride_[6] + index[7] * stride_[7]
1590 + index[8] * stride_[8] + index[9] * stride_[9]];
1595 assertInRange(index[0], index[1], index[2], index[3],
1596 index[4], index[5], index[6], index[7], index[8], index[9],
1598 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1599 + index[2] * stride_[2] + index[3] * stride_[3]
1600 + index[4] * stride_[4] + index[5] * stride_[5]
1601 + index[6] * stride_[6] + index[7] * stride_[7]
1602 + index[8] * stride_[8] + index[9] * stride_[9]
1603 + index[10] * stride_[10]];
1608 assertInRange(index[0], index[1], index[2], index[3],
1609 index[4], index[5], index[6], index[7], index[8], index[9],
1611 return data_[index[0] * stride_[0] + index[1] * stride_[1]
1612 + index[2] * stride_[2] + index[3] * stride_[3]
1613 + index[4] * stride_[4] + index[5] * stride_[5]
1614 + index[6] * stride_[6] + index[7] * stride_[7]
1615 + index[8] * stride_[8] + index[9] * stride_[9]
1616 + index[10] * stride_[10]];
1622 return data_[i0 * stride_[0]];
1628 return data_[i0 * stride_[0]];
1631 const T_numtype&
restrict operator()(
int i0,
int i1)
const
1633 assertInRange(i0, i1);
1634 return data_[i0 * stride_[0] + i1 * stride_[1]];
1639 assertInRange(i0, i1);
1640 return data_[i0 * stride_[0] + i1 * stride_[1]];
1643 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2)
const
1645 assertInRange(i0, i1, i2);
1646 return data_[i0 * stride_[0] + i1 * stride_[1]
1652 assertInRange(i0, i1, i2);
1653 return data_[i0 * stride_[0] + i1 * stride_[1]
1657 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3)
const
1659 assertInRange(i0, i1, i2, i3);
1660 return data_[i0 * stride_[0] + i1 * stride_[1]
1661 + i2 * stride_[2] + i3 * stride_[3]];
1664 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3)
1666 assertInRange(i0, i1, i2, i3);
1667 return data_[i0 * stride_[0] + i1 * stride_[1]
1668 + i2 * stride_[2] + i3 * stride_[3]];
1671 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1674 assertInRange(i0, i1, i2, i3, i4);
1675 return data_[i0 * stride_[0] + i1 * stride_[1]
1676 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]];
1679 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1682 assertInRange(i0, i1, i2, i3, i4);
1683 return data_[i0 * stride_[0] + i1 * stride_[1]
1684 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]];
1687 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1688 int i4,
int i5)
const
1690 assertInRange(i0, i1, i2, i3, i4, i5);
1691 return data_[i0 * stride_[0] + i1 * stride_[1]
1692 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1696 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1699 assertInRange(i0, i1, i2, i3, i4, i5);
1700 return data_[i0 * stride_[0] + i1 * stride_[1]
1701 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1705 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1706 int i4,
int i5,
int i6)
const
1708 assertInRange(i0, i1, i2, i3, i4, i5, i6);
1709 return data_[i0 * stride_[0] + i1 * stride_[1]
1710 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1711 + i5 * stride_[5] + i6 * stride_[6]];
1714 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1715 int i4,
int i5,
int i6)
1717 assertInRange(i0, i1, i2, i3, i4, i5, i6);
1718 return data_[i0 * stride_[0] + i1 * stride_[1]
1719 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1720 + i5 * stride_[5] + i6 * stride_[6]];
1723 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1724 int i4,
int i5,
int i6,
int i7)
const
1726 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7);
1727 return data_[i0 * stride_[0] + i1 * stride_[1]
1728 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1729 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]];
1732 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1733 int i4,
int i5,
int i6,
int i7)
1735 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7);
1736 return data_[i0 * stride_[0] + i1 * stride_[1]
1737 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1738 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]];
1741 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1742 int i4,
int i5,
int i6,
int i7,
int i8)
const
1744 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8);
1745 return data_[i0 * stride_[0] + i1 * stride_[1]
1746 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1747 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
1751 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1752 int i4,
int i5,
int i6,
int i7,
int i8)
1754 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8);
1755 return data_[i0 * stride_[0] + i1 * stride_[1]
1756 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1757 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
1761 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1762 int i4,
int i5,
int i6,
int i7,
int i8,
int i9)
const
1764 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);
1765 return data_[i0 * stride_[0] + i1 * stride_[1]
1766 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1767 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
1768 + i8 * stride_[8] + i9 * stride_[9]];
1771 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1772 int i4,
int i5,
int i6,
int i7,
int i8,
int i9)
1774 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);
1775 return data_[i0 * stride_[0] + i1 * stride_[1]
1776 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1777 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
1778 + i8 * stride_[8] + i9 * stride_[9]];
1781 const T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1782 int i4,
int i5,
int i6,
int i7,
int i8,
int i9,
int i10)
const
1784 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8,
1786 return data_[i0 * stride_[0] + i1 * stride_[1]
1787 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1788 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
1789 + i8 * stride_[8] + i9 * stride_[9] + i10 * stride_[10]];
1792 T_numtype&
restrict operator()(
int i0,
int i1,
int i2,
int i3,
1793 int i4,
int i5,
int i6,
int i7,
int i8,
int i9,
int i10)
1795 assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8,
1797 return data_[i0 * stride_[0] + i1 * stride_[1]
1798 + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
1799 + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
1800 + i8 * stride_[8] + i9 * stride_[9] + i10 * stride_[10]];
1808 T_array& noConst()
const
1809 {
return const_cast<T_array&
>(*this); }
1811 T_array operator()(
const RectDomain<N_rank>& subdomain)
const
1813 return T_array(noConst(), subdomain);
1817 T_array operator()(
const StridedDomain<N_rank>& subdomain)
const
1819 return T_array(noConst(), subdomain);
1824 return T_array(noConst(), r0);
1829 return T_array(noConst(), r0, r1);
1834 return T_array(noConst(), r0, r1, r2);
1839 return T_array(noConst(), r0, r1, r2, r3);
1844 return T_array(noConst(), r0, r1, r2, r3, r4);
1850 return T_array(noConst(), r0, r1, r2, r3, r4, r5);
1856 return T_array(noConst(), r0, r1, r2, r3, r4, r5, r6);
1862 return T_array(noConst(), r0, r1, r2, r3, r4, r5, r6, r7);
1868 return T_array(noConst(), r0, r1, r2, r3, r4, r5, r6, r7, r8);
1874 return T_array(noConst(), r0, r1, r2, r3, r4, r5, r6, r7, r8, r9);
1880 return T_array(noConst(), r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10);
1906 #ifdef BZ_HAVE_PARTIAL_ORDERING
1908 template<
typename T1,
typename T2>
1909 typename SliceInfo<T_numtype,T1,T2>::T_slice
1910 operator()(T1 r1, T2 r2)
const
1912 typedef typename SliceInfo<T_numtype,T1,T2>::T_slice slice;
1913 return slice(noConst(), r1, r2, nilArraySection(), nilArraySection(), nilArraySection(),
1914 nilArraySection(), nilArraySection(), nilArraySection(),
1915 nilArraySection(), nilArraySection(), nilArraySection());
1918 template<
typename T1,
typename T2,
typename T3>
1919 typename SliceInfo<T_numtype,T1,T2,T3>::T_slice
1920 operator()(T1 r1, T2 r2, T3 r3)
const
1922 typedef typename SliceInfo<T_numtype,T1,T2,T3>::T_slice slice;
1923 return slice(noConst(), r1, r2, r3, nilArraySection(), nilArraySection(), nilArraySection(),
1924 nilArraySection(), nilArraySection(), nilArraySection(),
1925 nilArraySection(), nilArraySection());
1928 template<
typename T1,
typename T2,
typename T3,
typename T4>
1929 typename SliceInfo<T_numtype,T1,T2,T3,T4>::T_slice
1930 operator()(T1 r1, T2 r2, T3 r3, T4 r4)
const
1932 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4>::T_slice slice;
1933 return slice(noConst(), r1, r2, r3, r4, nilArraySection(), nilArraySection(),
1934 nilArraySection(), nilArraySection(), nilArraySection(),
1935 nilArraySection(), nilArraySection());
1938 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
1939 typename SliceInfo<T_numtype,T1,T2,T3,T4,T5>::T_slice
1940 operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5)
const
1942 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4,T5>::T_slice slice;
1943 return slice(noConst(), r1, r2, r3, r4, r5, nilArraySection(),
1944 nilArraySection(), nilArraySection(), nilArraySection(),
1945 nilArraySection(), nilArraySection());
1948 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6>
1949 typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6>::T_slice
1950 operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6)
const
1952 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6>::T_slice slice;
1953 return slice(noConst(), r1, r2, r3, r4, r5, r6, nilArraySection(), nilArraySection(), nilArraySection(),
1954 nilArraySection(), nilArraySection());
1957 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
1959 typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7>::T_slice
1960 operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7)
const
1962 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7>::T_slice slice;
1963 return slice(noConst(), r1, r2, r3, r4, r5, r6, r7, nilArraySection(), nilArraySection(),
1964 nilArraySection(), nilArraySection());
1967 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
1968 typename T7,
typename T8>
1969 typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8>::T_slice
1970 operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8)
const
1972 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8>::T_slice slice;
1973 return slice(noConst(), r1, r2, r3, r4, r5, r6, r7, r8,
1974 nilArraySection(), nilArraySection(), nilArraySection());
1977 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
1978 typename T7,
typename T8,
typename T9>
1979 typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9>::T_slice
1980 operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8, T9 r9)
const
1982 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9>::T_slice slice;
1983 return slice(noConst(), r1, r2, r3, r4, r5, r6, r7, r8, r9, nilArraySection(), nilArraySection());
1986 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
1987 typename T7,
typename T8,
typename T9,
typename T10>
1988 typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>::T_slice
1989 operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8, T9 r9, T10 r10)
const
1991 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>::T_slice slice;
1992 return slice(noConst(), r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, nilArraySection());
1995 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
1996 typename T7,
typename T8,
typename T9,
typename T10,
typename T11>
1997 typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>::T_slice
1998 operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8, T9 r9, T10 r10, T11 r11)
const
2000 typedef typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>::T_slice slice;
2001 return slice(noConst(), r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11);
2004 #endif // BZ_HAVE_PARTIAL_ORDERING
2018 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0> >
2021 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0> >
2025 template<
int N0,
int N1>
2026 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1> >
2029 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2033 template<
int N0,
int N1,
int N2>
2034 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2> >
2038 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2039 N1, N2> >(noConst());
2042 template<
int N0,
int N1,
int N2,
int N3>
2043 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3> >
2047 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2048 N1, N2, N3> >(noConst());
2051 template<
int N0,
int N1,
int N2,
int N3,
int N4>
2052 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3, N4> >
2057 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2058 N1, N2, N3, N4> >(noConst());
2061 template<
int N0,
int N1,
int N2,
int N3,
int N4,
int N5>
2062 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
2068 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2069 N1, N2, N3, N4, N5> >(noConst());
2072 template<
int N0,
int N1,
int N2,
int N3,
int N4,
int N5,
int N6>
2073 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
2079 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2080 N1, N2, N3, N4, N5, N6> >(noConst());
2083 template<
int N0,
int N1,
int N2,
int N3,
int N4,
int N5,
int N6,
2085 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
2092 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2093 N1, N2, N3, N4, N5, N6, N7> >(noConst());
2096 template<
int N0,
int N1,
int N2,
int N3,
int N4,
int N5,
int N6,
2098 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
2099 N4, N5, N6, N7, N8> >
2105 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2106 N1, N2, N3, N4, N5, N6, N7, N8> >(noConst());
2109 template<
int N0,
int N1,
int N2,
int N3,
int N4,
int N5,
int N6,
2110 int N7,
int N8,
int N9>
2111 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
2112 N4, N5, N6, N7, N8, N9> >
2118 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2119 N1, N2, N3, N4, N5, N6, N7, N8, N9> >(noConst());
2122 template<
int N0,
int N1,
int N2,
int N3,
int N4,
int N5,
int N6,
2123 int N7,
int N8,
int N9,
int N10>
2124 _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
2125 N4, N5, N6, N7, N8, N9, N10> >
2132 return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
2133 N1, N2, N3, N4, N5, N6, N7, N8, N9, N10> >(noConst());
2147 typedef typename multicomponent_traits<T_numtype>::T_element T_compType;
2149 return extractComponent(T_compType(),component,
2150 multicomponent_traits<T_numtype>::numComponents);
2155 typedef typename multicomponent_traits<T_numtype>::T_element T_compType;
2157 return extractComponent(T_compType(),component,
2158 multicomponent_traits<T_numtype>::numComponents);
2163 return operator[](static_cast<unsigned>(component));
2168 return operator[](static_cast<unsigned>(component));
2175 template<
typename T_indexContainer>
2176 IndirectArray<T_array, T_indexContainer>
2177 operator[](
const T_indexContainer& index)
2179 return IndirectArray<T_array, T_indexContainer>(*
this,
2180 const_cast<T_indexContainer&
>(index));
2195 T_array& initialize(T_numtype);
2200 #ifdef BZ_NEW_EXPRESSION_TEMPLATES
2201 template<
typename T_expr>
2205 template<
typename T> T_array& operator+=(
const T&);
2206 template<
typename T> T_array& operator-=(
const T&);
2207 template<
typename T> T_array& operator*=(
const T&);
2208 template<
typename T> T_array& operator/=(
const T&);
2209 template<
typename T> T_array& operator%=(
const T&);
2210 template<
typename T> T_array& operator^=(
const T&);
2211 template<
typename T> T_array& operator&=(
const T&);
2212 template<
typename T> T_array& operator|=(
const T&);
2213 template<
typename T> T_array& operator>>=(
const T&);
2214 template<
typename T> T_array& operator<<=(
const T&);
2217 T_array& operator+=(T_numtype);
2218 T_array& operator-=(T_numtype);
2219 T_array& operator*=(T_numtype);
2220 T_array& operator/=(T_numtype);
2221 T_array& operator%=(T_numtype);
2222 T_array& operator^=(T_numtype);
2223 T_array& operator&=(T_numtype);
2224 T_array& operator|=(T_numtype);
2225 T_array& operator>>=(T_numtype);
2226 T_array& operator<<=(T_numtype);
2231 template<
typename P_numtype2>
2233 template<
typename P_numtype2>
2235 template<
typename P_numtype2>
2237 template<
typename P_numtype2>
2239 template<
typename P_numtype2>
2241 template<
typename P_numtype2>
2243 template<
typename P_numtype2>
2245 template<
typename P_numtype2>
2247 template<
typename P_numtype2>
2249 template<
typename P_numtype2>
2251 template<
typename P_numtype2>
2252 T_array& operator<<=(const Array<P_numtype2,N_rank>&);
2255 template<
typename T_expr>
2256 inline T_array& operator=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2257 template<
typename T_expr>
2258 inline T_array& operator+=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2259 template<
typename T_expr>
2260 inline T_array& operator-=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2261 template<
typename T_expr>
2262 inline T_array& operator*=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2263 template<
typename T_expr>
2264 inline T_array& operator/=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2265 template<
typename T_expr>
2266 inline T_array& operator%=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2267 template<
typename T_expr>
2268 inline T_array& operator^=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2269 template<
typename T_expr>
2270 inline T_array& operator&=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2271 template<
typename T_expr>
2272 inline T_array& operator|=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2273 template<
typename T_expr>
2274 inline T_array& operator>>=(
BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2275 template<
typename T_expr>
2276 inline T_array& operator<<=(BZ_ETPARM(_bz_ArrayExpr<T_expr>) expr);
2286 template<
typename T_expr,
typename T_update>
2287 inline T_array& evaluate(T_expr expr, T_update);
2290 #ifdef BZ_ARRAY_SPACE_FILLING_TRAVERSAL
2291 template<
typename T_expr,
typename T_update>
2292 inline T_array& evaluateWithFastTraversal(
2293 const TraversalOrder<N_rank - 1>& order,
2294 T_expr expr, T_update);
2295 #endif // BZ_ARRAY_SPACE_FILLING_TRAVERSAL
2298 #ifdef BZ_ARRAY_2D_STENCIL_TILING
2299 template<
typename T_expr,
typename T_update>
2300 inline T_array& evaluateWithTiled2DTraversal(
2301 T_expr expr, T_update);
2304 template<
typename T_expr,
typename T_update>
2305 inline T_array& evaluateWithIndexTraversal1(
2306 T_expr expr, T_update);
2308 template<
typename T_expr,
typename T_update>
2309 inline T_array& evaluateWithIndexTraversalN(
2310 T_expr expr, T_update);
2312 template<
typename T_expr,
typename T_update>
2313 inline T_array& evaluateWithStackTraversal1(
2314 T_expr expr, T_update);
2316 template<
typename T_expr,
typename T_update>
2317 inline T_array& evaluateWithStackTraversalN(
2318 T_expr expr, T_update);
2324 #ifdef BZ_DEBUG_TRAVERSE
2325 BZ_DEBUG_MESSAGE(
"stride(" << innerRank <<
")=" << stride(innerRank)
2326 <<
", extent()=" << extent(innerRank) <<
", stride(outerRank)="
2327 << stride(outerRank));
2329 return (stride(innerRank) * extent(innerRank) == stride(outerRank));
2340 const RectDomain<N_rank>&);
2342 const StridedDomain<N_rank>&);
2368 void calculateZeroOffset();
2370 template<
int N_rank2,
typename R0,
typename R1,
typename R2,
typename R3,
typename R4,
2371 typename R5,
typename R6,
typename R7,
typename R8,
typename R9,
typename R10>
2373 R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10);
2375 template<
int N_rank2>
2379 template<
int N_rank2>
2383 template<
int N_rank2>
2388 void doTranspose(
int destRank,
int sourceRank, T_array& array);
2458 template<
typename T_numtype>
2459 ostream& operator<<(ostream&, const Array<T_numtype,1>&);
2461 template<
typename T_numtype>
2462 ostream& operator<<(ostream&, const Array<T_numtype,2>&);
2464 template<
typename T_numtype,
int N_rank>
2465 ostream& operator<<(ostream&, const Array<T_numtype,N_rank>&);
2467 template<
typename T_numtype,
int N_rank>
2470 template <
typename P_numtype,
int N_rank>
2477 template <
typename P_expr>
2479 const _bz_ArrayExpr<P_expr>& expr) {
2484 template <
typename P_numtype,
int N_rank>
2487 indices.resize(exprVals.
size());
2490 for (it = exprVals.
begin(); it != end; ++it)
2492 indices(j++) = it.position();
2508 #include <blitz/array/iter.h>
2509 #include <blitz/array/fastiter.h>
2510 #include <blitz/array/expr.h>
2511 #include <blitz/array/methods.cc>
2512 #include <blitz/array/eval.cc>
2513 #include <blitz/array/ops.cc>
2514 #include <blitz/array/io.cc>
2515 #include <blitz/array/et.h>
2516 #include <blitz/array/reduce.h>
2517 #include <blitz/array/interlace.cc>
2518 #include <blitz/array/resize.cc>
2519 #include <blitz/array/slicing.cc>
2520 #include <blitz/array/cycle.cc>
2521 #include <blitz/array/complex.cc>
2522 #include <blitz/array/zip.h>
2523 #include <blitz/array/where.h>
2524 #include <blitz/array/indirect.h>
2525 #include <blitz/array/stencils.h>
2527 #endif // BZ_ARRAY_H