| [221] | 1 | /***************************************************************************
 | 
|---|
 | 2 |  * blitz/array.h      Declaration of the Array<P_numtype, N_rank> class
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  * $Id: array.h,v 1.1.1.1 1999-04-09 17:59:01 ansari Exp $
 | 
|---|
 | 5 |  *
 | 
|---|
 | 6 |  * Copyright (C) 1997,1998 Todd Veldhuizen <tveldhui@seurat.uwaterloo.ca>
 | 
|---|
 | 7 |  *
 | 
|---|
 | 8 |  * This program is free software; you can redistribute it and/or
 | 
|---|
 | 9 |  * modify it under the terms of the GNU General Public License
 | 
|---|
 | 10 |  * as published by the Free Software Foundation; either version 2
 | 
|---|
 | 11 |  * of the License, or (at your option) any later version.
 | 
|---|
 | 12 |  *
 | 
|---|
 | 13 |  * This program is distributed in the hope that it will be useful,
 | 
|---|
 | 14 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|---|
 | 15 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|---|
 | 16 |  * GNU General Public License for more details.
 | 
|---|
 | 17 |  *
 | 
|---|
 | 18 |  * Suggestions:          blitz-suggest@cybervision.com
 | 
|---|
 | 19 |  * Bugs:                 blitz-bugs@cybervision.com
 | 
|---|
 | 20 |  *
 | 
|---|
 | 21 |  * For more information, please see the Blitz++ Home Page:
 | 
|---|
 | 22 |  *    http://seurat.uwaterloo.ca/blitz/
 | 
|---|
 | 23 |  *
 | 
|---|
 | 24 |  ***************************************************************************
 | 
|---|
 | 25 |  * $Log: not supported by cvs2svn $
 | 
|---|
 | 26 |  * Revision 1.2  1998/03/14 00:04:47  tveldhui
 | 
|---|
 | 27 |  * 0.2-alpha-05
 | 
|---|
 | 28 |  *
 | 
|---|
 | 29 |  * Revision 1.1  1997/07/16 14:51:20  tveldhui
 | 
|---|
 | 30 |  * Update: Alpha release 0.2 (Arrays)
 | 
|---|
 | 31 |  *
 | 
|---|
 | 32 |  */
 | 
|---|
 | 33 | 
 | 
|---|
 | 34 | /*
 | 
|---|
 | 35 |  * Wish list for array classes.
 | 
|---|
 | 36 |  *  - Arrays whose dimensions are unknown at compile time.
 | 
|---|
 | 37 |  *  - where()/elsewhere()/elsewhere() as in Dan Quinlan's implementation
 | 
|---|
 | 38 |  *  - block reduction operations
 | 
|---|
 | 39 |  *  - conversion to/from matrix & vector
 | 
|---|
 | 40 |  *  - apply(T func(T))
 | 
|---|
 | 41 |  *  - apply(T func(const T&))
 | 
|---|
 | 42 |  *  - apply<T func(T)>
 | 
|---|
 | 43 |  */
 | 
|---|
 | 44 | 
 | 
|---|
 | 45 | #ifndef BZ_ARRAY_H
 | 
|---|
 | 46 | #define BZ_ARRAY_H
 | 
|---|
 | 47 | 
 | 
|---|
 | 48 | #ifndef BZ_BLITZ_H
 | 
|---|
 | 49 |  #include <blitz/blitz.h>
 | 
|---|
 | 50 | #endif
 | 
|---|
 | 51 | 
 | 
|---|
 | 52 | #ifndef BZ_MEMBLOCK_H
 | 
|---|
 | 53 |  #include <blitz/memblock.h>
 | 
|---|
 | 54 | #endif
 | 
|---|
 | 55 | 
 | 
|---|
 | 56 | #ifndef BZ_RANGE_H
 | 
|---|
 | 57 |  #include <blitz/range.h>
 | 
|---|
 | 58 | #endif
 | 
|---|
 | 59 | 
 | 
|---|
 | 60 | #ifndef BZ_TINYVEC_H
 | 
|---|
 | 61 |  #include <blitz/tinyvec.h>
 | 
|---|
 | 62 | #endif
 | 
|---|
 | 63 | 
 | 
|---|
 | 64 | #ifndef BZ_TRAVERSAL_H
 | 
|---|
 | 65 |  #include <blitz/traversal.h>
 | 
|---|
 | 66 | #endif
 | 
|---|
 | 67 | 
 | 
|---|
 | 68 | #ifndef BZ_INDEXEXPR_H
 | 
|---|
 | 69 |  #include <blitz/indexexpr.h>
 | 
|---|
 | 70 | #endif
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 | #ifndef BZ_PRETTYPRINT_H
 | 
|---|
 | 73 |  #include <blitz/prettyprint.h>
 | 
|---|
 | 74 | #endif
 | 
|---|
 | 75 | 
 | 
|---|
 | 76 | #include <blitz/array/slice.h>     // Subarrays and slicing
 | 
|---|
 | 77 | #include <blitz/array/map.h>       // Tensor index notation
 | 
|---|
 | 78 | #include <blitz/array/multi.h>     // Multicomponent arrays
 | 
|---|
 | 79 | #include <blitz/array/domain.h>    // RectDomain class
 | 
|---|
 | 80 | 
 | 
|---|
 | 81 | BZ_NAMESPACE(blitz)
 | 
|---|
 | 82 | 
 | 
|---|
 | 83 | /*
 | 
|---|
 | 84 |  * Forward declarations
 | 
|---|
 | 85 |  */
 | 
|---|
 | 86 | 
 | 
|---|
 | 87 | template<class T_numtype, int N_rank>
 | 
|---|
 | 88 | class ArrayIterator;
 | 
|---|
 | 89 | 
 | 
|---|
 | 90 | template<class P_expr>
 | 
|---|
 | 91 | class _bz_ArrayExpr;
 | 
|---|
 | 92 | 
 | 
|---|
 | 93 | #ifdef BZ_NEW_EXPRESSION_TEMPLATES
 | 
|---|
 | 94 | template<class T>
 | 
|---|
 | 95 | class ETBase { };
 | 
|---|
 | 96 | #endif
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 | template<class T_array, class T_index>
 | 
|---|
 | 99 | class IndirectArray;
 | 
|---|
 | 100 | 
 | 
|---|
 | 101 | /*
 | 
|---|
 | 102 |  * Declaration of class GeneralStorage<N_rank>
 | 
|---|
 | 103 |  *
 | 
|---|
 | 104 |  * This class describes a storage format for an N-dimensional array.
 | 
|---|
 | 105 |  * The dimensions can be stored in an arbitrary order (for example, as
 | 
|---|
 | 106 |  * a C-style row major array or Fortran-style column major array, or
 | 
|---|
 | 107 |  * something else entirely).  Each dimension can be stored in either
 | 
|---|
 | 108 |  * ascending (the most common) or descending order.  Each dimension
 | 
|---|
 | 109 |  * can have its own base (starting index value: e.g. 0 for C-style arrays, 
 | 
|---|
 | 110 |  * 1 for Fortran arrays).
 | 
|---|
 | 111 |  *
 | 
|---|
 | 112 |  * GeneralArrayStorage<N> defaults to C-style arrays.  To implement
 | 
|---|
 | 113 |  * other storage formats, subclass and modify the constructor.  The
 | 
|---|
 | 114 |  * class FortranArray, below, is an example.
 | 
|---|
 | 115 |  *
 | 
|---|
 | 116 |  * Objects inheriting from GeneralArrayStorage<N> can be passed as
 | 
|---|
 | 117 |  * an optional constructor argument to Array objects.
 | 
|---|
 | 118 |  * e.g. Array<int,3> A(16,16,16, FortranArray<3>());
 | 
|---|
 | 119 |  * will create a 3-dimensional 16x16x16 Fortran-style array.
 | 
|---|
 | 120 |  */
 | 
|---|
 | 121 | 
 | 
|---|
 | 122 | template<int N_rank>
 | 
|---|
 | 123 | class GeneralArrayStorage {
 | 
|---|
 | 124 | public:
 | 
|---|
 | 125 |     class noInitializeFlag { };
 | 
|---|
 | 126 | 
 | 
|---|
 | 127 |     GeneralArrayStorage(noInitializeFlag)
 | 
|---|
 | 128 |     { }
 | 
|---|
 | 129 | 
 | 
|---|
 | 130 |     GeneralArrayStorage()
 | 
|---|
 | 131 |     {
 | 
|---|
 | 132 |         ordering_ = Range(N_rank - 1, 0, -1);
 | 
|---|
 | 133 |         ascendingFlag_ = 1;
 | 
|---|
 | 134 |         base_ = 0;
 | 
|---|
 | 135 |     }
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 |     GeneralArrayStorage(const GeneralArrayStorage<N_rank>& x)
 | 
|---|
 | 138 |         : ordering_(x.ordering_), ascendingFlag_(x.ascendingFlag_),
 | 
|---|
 | 139 |           base_(x.base_)
 | 
|---|
 | 140 |     { 
 | 
|---|
 | 141 |     }
 | 
|---|
 | 142 | 
 | 
|---|
 | 143 |     ~GeneralArrayStorage()
 | 
|---|
 | 144 |     { }
 | 
|---|
 | 145 | 
 | 
|---|
 | 146 |     TinyVector<int, N_rank>& ordering()
 | 
|---|
 | 147 |     { return ordering_; }
 | 
|---|
 | 148 | 
 | 
|---|
 | 149 |     const TinyVector<int, N_rank>& ordering() const
 | 
|---|
 | 150 |     { return ordering_; }
 | 
|---|
 | 151 | 
 | 
|---|
 | 152 |     int ordering(int i) const
 | 
|---|
 | 153 |     { return ordering_[i]; }
 | 
|---|
 | 154 | 
 | 
|---|
 | 155 |     void setOrdering(int i, int order) 
 | 
|---|
 | 156 |     { ordering_[i] = order; }
 | 
|---|
 | 157 | 
 | 
|---|
 | 158 |     _bz_bool allRanksStoredAscending() const
 | 
|---|
 | 159 |     {
 | 
|---|
 | 160 |         _bz_bool result = _bz_true;
 | 
|---|
 | 161 |         for (int i=0; i < N_rank; ++i)
 | 
|---|
 | 162 |             result &= ascendingFlag_[i];
 | 
|---|
 | 163 |         return result;
 | 
|---|
 | 164 |     }
 | 
|---|
 | 165 | 
 | 
|---|
 | 166 |     _bz_bool isRankStoredAscending(int i) const
 | 
|---|
 | 167 |     { return ascendingFlag_[i]; }
 | 
|---|
 | 168 | 
 | 
|---|
 | 169 |     TinyVector<bool, N_rank>& ascendingFlag() 
 | 
|---|
 | 170 |     { return ascendingFlag_; }
 | 
|---|
 | 171 | 
 | 
|---|
 | 172 |     const TinyVector<bool, N_rank>& ascendingFlag() const
 | 
|---|
 | 173 |     { return ascendingFlag_; }
 | 
|---|
 | 174 | 
 | 
|---|
 | 175 |     void setAscendingFlag(int i, int ascendingFlag) 
 | 
|---|
 | 176 |     { ascendingFlag_[i] = ascendingFlag; }
 | 
|---|
 | 177 | 
 | 
|---|
 | 178 |     TinyVector<int, N_rank>& base()
 | 
|---|
 | 179 |     { return base_; }
 | 
|---|
 | 180 | 
 | 
|---|
 | 181 |     const TinyVector<int, N_rank>& base() const
 | 
|---|
 | 182 |     { return base_; }
 | 
|---|
 | 183 | 
 | 
|---|
 | 184 |     int base(int i) const
 | 
|---|
 | 185 |     { return base_[i]; }
 | 
|---|
 | 186 | 
 | 
|---|
 | 187 |     void setBase(int i, int base)
 | 
|---|
 | 188 |     { base_[i] = base; }
 | 
|---|
 | 189 | 
 | 
|---|
 | 190 |     void setBase(const TinyVector<int, N_rank>& base)
 | 
|---|
 | 191 |     { base_ = base; }
 | 
|---|
 | 192 | 
 | 
|---|
 | 193 | protected:
 | 
|---|
 | 194 |     /*
 | 
|---|
 | 195 |      * ordering_[] specifies the order in which the array is stored in
 | 
|---|
 | 196 |      * memory.  For a newly allocated array, ordering_(0) will give the
 | 
|---|
 | 197 |      * rank with unit stride, and ordering_(N_rank-1) will be the rank
 | 
|---|
 | 198 |      * with largest stride.  An order like [2, 1, 0] corresponds to
 | 
|---|
 | 199 |      * C-style array storage; an order like [0, 1, 2] corresponds to
 | 
|---|
 | 200 |      * Fortran array storage.
 | 
|---|
 | 201 |      *
 | 
|---|
 | 202 |      * ascendingFlag_[] indicates whether the data in a rank is stored
 | 
|---|
 | 203 |      * in ascending or descending order.  Most of the time these values
 | 
|---|
 | 204 |      * will all be true (indicating ascending order).  Some peculiar 
 | 
|---|
 | 205 |      * formats (e.g. MS-Windows BMP image format) store the data in 
 | 
|---|
 | 206 |      * descending order.
 | 
|---|
 | 207 |      *  
 | 
|---|
 | 208 |      * base_[] gives the first valid index for each rank.  For a C-style
 | 
|---|
 | 209 |      * array, all the base_ elements will be zero; for a Fortran-style
 | 
|---|
 | 210 |      * array, they will be one.  base_[] can be set arbitrarily using
 | 
|---|
 | 211 |      * the Array constructor which takes a Range argument, e.g.
 | 
|---|
 | 212 |      * Array<float,2> A(Range(30,40),Range(23,33));
 | 
|---|
 | 213 |      * will create an array with base_[] = { 30, 23 }.
 | 
|---|
 | 214 |      */
 | 
|---|
 | 215 |     TinyVector<int,  N_rank> ordering_;
 | 
|---|
 | 216 |     TinyVector<bool, N_rank> ascendingFlag_;
 | 
|---|
 | 217 |     TinyVector<int,  N_rank> base_;
 | 
|---|
 | 218 | };
 | 
|---|
 | 219 | 
 | 
|---|
 | 220 | /*
 | 
|---|
 | 221 |  * Class FortranArray specializes GeneralArrayStorage to provide Fortran
 | 
|---|
 | 222 |  * style arrays (column major ordering, base of 1).  The noInitializeFlag()
 | 
|---|
 | 223 |  * passed to the base constructor indicates that the subclass will take
 | 
|---|
 | 224 |  * care of initializing the ordering_, ascendingFlag_ and base_ members.
 | 
|---|
 | 225 |  */
 | 
|---|
 | 226 | 
 | 
|---|
 | 227 | template<int N_rank>
 | 
|---|
 | 228 | class FortranArray : public GeneralArrayStorage<N_rank> {
 | 
|---|
 | 229 | public:
 | 
|---|
 | 230 |     FortranArray()
 | 
|---|
 | 231 |         : GeneralArrayStorage<N_rank>(noInitializeFlag())
 | 
|---|
 | 232 |     {
 | 
|---|
 | 233 |         ordering_ = Range(0, N_rank - 1);
 | 
|---|
 | 234 |         ascendingFlag_ = 1;
 | 
|---|
 | 235 |         base_ = 1;
 | 
|---|
 | 236 |     }
 | 
|---|
 | 237 | };
 | 
|---|
 | 238 | 
 | 
|---|
 | 239 | /*
 | 
|---|
 | 240 |  * Class ColumnMajorArray specializes GeneralArrayStorage to provide column
 | 
|---|
 | 241 |  * major arrays (column major ordering, base of 0).
 | 
|---|
 | 242 |  */
 | 
|---|
 | 243 | 
 | 
|---|
 | 244 | template<int N_rank>
 | 
|---|
 | 245 | class ColumnMajorArray : public GeneralArrayStorage<N_rank> {
 | 
|---|
 | 246 | public:
 | 
|---|
 | 247 |     ColumnMajorArray()
 | 
|---|
 | 248 |         : GeneralArrayStorage<N_rank>(noInitializeFlag())
 | 
|---|
 | 249 |     {
 | 
|---|
 | 250 |         ordering_ = Range(0, N_rank - 1);
 | 
|---|
 | 251 |         ascendingFlag_ = 1;
 | 
|---|
 | 252 |         base_ = 0;
 | 
|---|
 | 253 |     }
 | 
|---|
 | 254 | };
 | 
|---|
 | 255 | 
 | 
|---|
 | 256 | /*
 | 
|---|
 | 257 |  * Declaration of class Array
 | 
|---|
 | 258 |  */
 | 
|---|
 | 259 | 
 | 
|---|
 | 260 | // NEEDS_WORK: Array should inherit protected from MemoryBlockReference.
 | 
|---|
 | 261 | // To make this work, need to expose MemoryBlockReference::numReferences()
 | 
|---|
 | 262 | // and make Array<P,N2> a friend of Array<P,N> for slicing.
 | 
|---|
 | 263 | 
 | 
|---|
 | 264 | template<class P_numtype, int N_rank>
 | 
|---|
 | 265 | class Array : public MemoryBlockReference<P_numtype> 
 | 
|---|
 | 266 | #ifdef BZ_NEW_EXPRESSION_TEMPLATES
 | 
|---|
 | 267 |     , public ETBase<Array<P_numtype,N_rank> >
 | 
|---|
 | 268 | #endif
 | 
|---|
 | 269 | {
 | 
|---|
 | 270 | 
 | 
|---|
 | 271 | public:
 | 
|---|
 | 272 |     //////////////////////////////////////////////
 | 
|---|
 | 273 |     // Public Types
 | 
|---|
 | 274 |     //////////////////////////////////////////////
 | 
|---|
 | 275 | 
 | 
|---|
 | 276 |     /*
 | 
|---|
 | 277 |      * T_numtype  is the numeric type stored in the array.
 | 
|---|
 | 278 |      * T_index    is a vector type which can be used to access elements
 | 
|---|
 | 279 |      *            of many-dimensional arrays.
 | 
|---|
 | 280 |      * T_array    is the array type itself -- Array<T_numtype, N_rank>
 | 
|---|
 | 281 |      * T_iterator is an iterator for the array.
 | 
|---|
 | 282 |      */
 | 
|---|
 | 283 | 
 | 
|---|
 | 284 |     typedef P_numtype                T_numtype;
 | 
|---|
 | 285 |     typedef TinyVector<int, N_rank>  T_index;
 | 
|---|
 | 286 |     typedef Array<T_numtype, N_rank> T_array;
 | 
|---|
 | 287 |     typedef ArrayIterator<T_numtype, N_rank> T_iterator;
 | 
|---|
 | 288 | 
 | 
|---|
 | 289 |     enum { _bz_rank = N_rank };
 | 
|---|
 | 290 | 
 | 
|---|
 | 291 |     //////////////////////////////////////////////
 | 
|---|
 | 292 |     // Constructors                             //
 | 
|---|
 | 293 |     //////////////////////////////////////////////
 | 
|---|
 | 294 | 
 | 
|---|
 | 295 |     
 | 
|---|
 | 296 |     /*
 | 
|---|
 | 297 |      * Construct an array from an array expression.
 | 
|---|
 | 298 |      */
 | 
|---|
 | 299 | 
 | 
|---|
 | 300 |     template<class T_expr>
 | 
|---|
 | 301 |     Array(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 302 | 
 | 
|---|
 | 303 |     /*
 | 
|---|
 | 304 |      * Any missing length arguments will have their value taken from the
 | 
|---|
 | 305 |      * last argument.  For example,
 | 
|---|
 | 306 |      *   Array<int,3> A(32,64);
 | 
|---|
 | 307 |      * will create a 32x64x64 array.  This is handled by setupStorage().
 | 
|---|
 | 308 |      */
 | 
|---|
 | 309 | 
 | 
|---|
 | 310 |     Array(GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 311 |         : storage_(storage)
 | 
|---|
 | 312 |     {
 | 
|---|
 | 313 |         length_ = 0;
 | 
|---|
 | 314 |         stride_ = 0;
 | 
|---|
 | 315 |         zeroOffset_ = 0;
 | 
|---|
 | 316 |         storageContiguous_ = false;
 | 
|---|
 | 317 |     }
 | 
|---|
 | 318 | 
 | 
|---|
 | 319 |     _bz_explicit Array(int length0, 
 | 
|---|
 | 320 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 321 |         : storage_(storage)
 | 
|---|
 | 322 |     {
 | 
|---|
 | 323 |         length_[0] = length0;
 | 
|---|
 | 324 |         setupStorage(0);
 | 
|---|
 | 325 |     }
 | 
|---|
 | 326 | 
 | 
|---|
 | 327 |     Array(int length0, int length1,
 | 
|---|
 | 328 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 329 |         : storage_(storage)
 | 
|---|
 | 330 |     {
 | 
|---|
 | 331 |         BZPRECONDITION(N_rank >= 2);
 | 
|---|
 | 332 |         TAU_TYPE_STRING(p1, "Array<T,N>::Array() [T="
 | 
|---|
 | 333 |             + CT(T_numtype) + ",N=" + CT(N_rank) + "]");
 | 
|---|
 | 334 |         TAU_PROFILE(p1, "void (int,int)", TAU_BLITZ);
 | 
|---|
 | 335 | 
 | 
|---|
 | 336 |         length_[0] = length0;
 | 
|---|
 | 337 |         length_[1] = length1;
 | 
|---|
 | 338 |         setupStorage(1);
 | 
|---|
 | 339 |     }
 | 
|---|
 | 340 | 
 | 
|---|
 | 341 |     Array(int length0, int length1, int length2,
 | 
|---|
 | 342 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 343 |         : storage_(storage)
 | 
|---|
 | 344 |     {
 | 
|---|
 | 345 |         BZPRECONDITION(N_rank >= 3);
 | 
|---|
 | 346 |         length_[0] = length0;
 | 
|---|
 | 347 |         length_[1] = length1;
 | 
|---|
 | 348 |         length_[2] = length2;
 | 
|---|
 | 349 |         setupStorage(2);
 | 
|---|
 | 350 |     }
 | 
|---|
 | 351 | 
 | 
|---|
 | 352 |     Array(int length0, int length1, int length2, int length3,
 | 
|---|
 | 353 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 354 |         : storage_(storage)
 | 
|---|
 | 355 |     {
 | 
|---|
 | 356 |         BZPRECONDITION(N_rank >= 4);
 | 
|---|
 | 357 |         length_[0] = length0;
 | 
|---|
 | 358 |         length_[1] = length1;
 | 
|---|
 | 359 |         length_[2] = length2;
 | 
|---|
 | 360 |         length_[3] = length3;
 | 
|---|
 | 361 |         setupStorage(3);
 | 
|---|
 | 362 |     }
 | 
|---|
 | 363 | 
 | 
|---|
 | 364 |     Array(int length0, int length1, int length2, int length3, int length4,
 | 
|---|
 | 365 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 366 |         : storage_(storage)
 | 
|---|
 | 367 |     {
 | 
|---|
 | 368 |         BZPRECONDITION(N_rank >= 5);
 | 
|---|
 | 369 |         length_[0] = length0;
 | 
|---|
 | 370 |         length_[1] = length1;
 | 
|---|
 | 371 |         length_[2] = length2;
 | 
|---|
 | 372 |         length_[3] = length3;
 | 
|---|
 | 373 |         length_[4] = length4;
 | 
|---|
 | 374 |         setupStorage(4);
 | 
|---|
 | 375 |     }
 | 
|---|
 | 376 | 
 | 
|---|
 | 377 |     Array(int length0, int length1, int length2, int length3, int length4,
 | 
|---|
 | 378 |         int length5,
 | 
|---|
 | 379 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 380 |         : storage_(storage)
 | 
|---|
 | 381 |     {
 | 
|---|
 | 382 |         BZPRECONDITION(N_rank >= 6);
 | 
|---|
 | 383 |         length_[0] = length0;
 | 
|---|
 | 384 |         length_[1] = length1;
 | 
|---|
 | 385 |         length_[2] = length2;
 | 
|---|
 | 386 |         length_[3] = length3;
 | 
|---|
 | 387 |         length_[4] = length4;
 | 
|---|
 | 388 |         length_[5] = length5;
 | 
|---|
 | 389 |         setupStorage(5);
 | 
|---|
 | 390 |     }
 | 
|---|
 | 391 | 
 | 
|---|
 | 392 |     Array(int length0, int length1, int length2, int length3, int length4,
 | 
|---|
 | 393 |         int length5, int length6,
 | 
|---|
 | 394 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 395 |         : storage_(storage)
 | 
|---|
 | 396 |     {
 | 
|---|
 | 397 |         BZPRECONDITION(N_rank >= 7);
 | 
|---|
 | 398 |         length_[0] = length0;
 | 
|---|
 | 399 |         length_[1] = length1;
 | 
|---|
 | 400 |         length_[2] = length2;
 | 
|---|
 | 401 |         length_[3] = length3;
 | 
|---|
 | 402 |         length_[4] = length4;
 | 
|---|
 | 403 |         length_[5] = length5;
 | 
|---|
 | 404 |         length_[6] = length6;
 | 
|---|
 | 405 |         setupStorage(6);
 | 
|---|
 | 406 |     }
 | 
|---|
 | 407 | 
 | 
|---|
 | 408 |     Array(int length0, int length1, int length2, int length3, int length4,
 | 
|---|
 | 409 |         int length5, int length6, int length7,
 | 
|---|
 | 410 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 411 |         : storage_(storage)
 | 
|---|
 | 412 |     {
 | 
|---|
 | 413 |         BZPRECONDITION(N_rank >= 8);
 | 
|---|
 | 414 |         length_[0] = length0;
 | 
|---|
 | 415 |         length_[1] = length1;
 | 
|---|
 | 416 |         length_[2] = length2;
 | 
|---|
 | 417 |         length_[3] = length3;
 | 
|---|
 | 418 |         length_[4] = length4;
 | 
|---|
 | 419 |         length_[5] = length5;
 | 
|---|
 | 420 |         length_[6] = length6;
 | 
|---|
 | 421 |         length_[7] = length7;
 | 
|---|
 | 422 |         setupStorage(7);
 | 
|---|
 | 423 |     }
 | 
|---|
 | 424 | 
 | 
|---|
 | 425 |     Array(int length0, int length1, int length2, int length3, int length4,
 | 
|---|
 | 426 |         int length5, int length6, int length7, int length8,
 | 
|---|
 | 427 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 428 |         : storage_(storage)
 | 
|---|
 | 429 |     {
 | 
|---|
 | 430 |         BZPRECONDITION(N_rank >= 9);
 | 
|---|
 | 431 |         length_[0] = length0;
 | 
|---|
 | 432 |         length_[1] = length1;
 | 
|---|
 | 433 |         length_[2] = length2;
 | 
|---|
 | 434 |         length_[3] = length3;
 | 
|---|
 | 435 |         length_[4] = length4;
 | 
|---|
 | 436 |         length_[5] = length5;
 | 
|---|
 | 437 |         length_[6] = length6;
 | 
|---|
 | 438 |         length_[7] = length7;
 | 
|---|
 | 439 |         length_[8] = length8;
 | 
|---|
 | 440 |         setupStorage(8);
 | 
|---|
 | 441 |     }
 | 
|---|
 | 442 | 
 | 
|---|
 | 443 |     Array(int length0, int length1, int length2, int length3, int length4,
 | 
|---|
 | 444 |         int length5, int length6, int length7, int length8, int length9,
 | 
|---|
 | 445 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 446 |         : storage_(storage)
 | 
|---|
 | 447 |     {
 | 
|---|
 | 448 |         BZPRECONDITION(N_rank >= 10);
 | 
|---|
 | 449 |         length_[0] = length0;
 | 
|---|
 | 450 |         length_[1] = length1;
 | 
|---|
 | 451 |         length_[2] = length2;
 | 
|---|
 | 452 |         length_[3] = length3;
 | 
|---|
 | 453 |         length_[4] = length4;
 | 
|---|
 | 454 |         length_[5] = length5;
 | 
|---|
 | 455 |         length_[6] = length6;
 | 
|---|
 | 456 |         length_[7] = length7;
 | 
|---|
 | 457 |         length_[8] = length8;
 | 
|---|
 | 458 |         length_[9] = length9;
 | 
|---|
 | 459 |         setupStorage(9);
 | 
|---|
 | 460 |     }
 | 
|---|
 | 461 | 
 | 
|---|
 | 462 |     Array(int length0, int length1, int length2, int length3, int length4,
 | 
|---|
 | 463 |         int length5, int length6, int length7, int length8, int length9,
 | 
|---|
 | 464 |         int length10,
 | 
|---|
 | 465 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 466 |         : storage_(storage)
 | 
|---|
 | 467 |     {
 | 
|---|
 | 468 |         BZPRECONDITION(N_rank >= 11);
 | 
|---|
 | 469 |         length_[0] = length0;
 | 
|---|
 | 470 |         length_[1] = length1;
 | 
|---|
 | 471 |         length_[2] = length2;
 | 
|---|
 | 472 |         length_[3] = length3;
 | 
|---|
 | 473 |         length_[4] = length4;
 | 
|---|
 | 474 |         length_[5] = length5;
 | 
|---|
 | 475 |         length_[6] = length6;
 | 
|---|
 | 476 |         length_[7] = length7;
 | 
|---|
 | 477 |         length_[8] = length8;
 | 
|---|
 | 478 |         length_[9] = length9;
 | 
|---|
 | 479 |         length_[10] = length10;
 | 
|---|
 | 480 |         setupStorage(10);
 | 
|---|
 | 481 |     }
 | 
|---|
 | 482 | 
 | 
|---|
 | 483 |     /*
 | 
|---|
 | 484 |      * Construct an array from an existing block of memory.  Ownership
 | 
|---|
 | 485 |      * is not acquired (i.e. the memory block will not be freed by Blitz++).
 | 
|---|
 | 486 |      */
 | 
|---|
 | 487 |     Array(T_numtype* _bz_restrict dataFirst, TinyVector<int, N_rank> shape,
 | 
|---|
 | 488 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 489 |       : MemoryBlockReference<T_numtype>(product(shape), dataFirst),
 | 
|---|
 | 490 |         storage_(storage)
 | 
|---|
 | 491 |     {
 | 
|---|
 | 492 |         BZPRECONDITION(dataFirst != 0);
 | 
|---|
 | 493 | 
 | 
|---|
 | 494 |         length_ = shape;
 | 
|---|
 | 495 |         computeStrides();
 | 
|---|
 | 496 |         data_ += zeroOffset_;
 | 
|---|
 | 497 |         storageContiguous_ = _bz_true;
 | 
|---|
 | 498 |     }
 | 
|---|
 | 499 | 
 | 
|---|
 | 500 |     /*
 | 
|---|
 | 501 |      * Construct an array from an existing block of memory, with a
 | 
|---|
 | 502 |      * given set of strides.  Ownership is not acquired (i.e. the memory
 | 
|---|
 | 503 |      * block will not be freed by Blitz++).
 | 
|---|
 | 504 |      */
 | 
|---|
 | 505 |     Array(T_numtype* _bz_restrict dataFirst, TinyVector<int, N_rank> shape,
 | 
|---|
 | 506 |         TinyVector<int, N_rank> stride, 
 | 
|---|
 | 507 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 508 |       : MemoryBlockReference<T_numtype>(product(shape), dataFirst),
 | 
|---|
 | 509 |         storage_(storage)
 | 
|---|
 | 510 |     {
 | 
|---|
 | 511 |         BZPRECONDITION(dataFirst != 0);
 | 
|---|
 | 512 | 
 | 
|---|
 | 513 |         length_ = shape;
 | 
|---|
 | 514 |         stride_ = stride;
 | 
|---|
 | 515 |         calculateZeroOffset();
 | 
|---|
 | 516 |         data_ += zeroOffset_;
 | 
|---|
 | 517 | 
 | 
|---|
 | 518 |         // NEEDS_WORK: the setting of storageContiguous should be determined
 | 
|---|
 | 519 |         // by inspecting the strides.
 | 
|---|
 | 520 |         storageContiguous_ = _bz_false;   
 | 
|---|
 | 521 |     }
 | 
|---|
 | 522 | 
 | 
|---|
 | 523 |     /*
 | 
|---|
 | 524 |      * This constructor takes an extent (length) vector and storage format.
 | 
|---|
 | 525 |      */
 | 
|---|
 | 526 | 
 | 
|---|
 | 527 |     Array(const TinyVector<int, N_rank>& extent, 
 | 
|---|
 | 528 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 529 |         : storage_(storage)
 | 
|---|
 | 530 |     {
 | 
|---|
 | 531 |         length_ = extent;
 | 
|---|
 | 532 |         setupStorage(N_rank - 1);
 | 
|---|
 | 533 |     }
 | 
|---|
 | 534 | 
 | 
|---|
 | 535 |     /*
 | 
|---|
 | 536 |      * This construct takes a vector of bases (lbounds) and a vector of
 | 
|---|
 | 537 |      * extents.
 | 
|---|
 | 538 |      */
 | 
|---|
 | 539 | 
 | 
|---|
 | 540 |     Array(const TinyVector<int, N_rank>& lbounds,
 | 
|---|
 | 541 |         const TinyVector<int, N_rank>& extent,
 | 
|---|
 | 542 |         const GeneralArrayStorage<N_rank>& storage);
 | 
|---|
 | 543 | 
 | 
|---|
 | 544 |     /*
 | 
|---|
 | 545 |      * These constructors allow arbitrary bases (starting indices) to be set.
 | 
|---|
 | 546 |      * e.g. Array<int,2> A(Range(10,20), Range(20,30))
 | 
|---|
 | 547 |      * will create an 11x11 array whose indices are 10..20 and 20..30
 | 
|---|
 | 548 |      */
 | 
|---|
 | 549 |     Array(Range r0, 
 | 
|---|
 | 550 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 551 |         : storage_(storage)
 | 
|---|
 | 552 |     {
 | 
|---|
 | 553 |         BZPRECONDITION(r0.isAscendingContiguous());
 | 
|---|
 | 554 | 
 | 
|---|
 | 555 |         length_[0] = r0.length();
 | 
|---|
 | 556 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 557 |         setupStorage(0);
 | 
|---|
 | 558 |     }
 | 
|---|
 | 559 | 
 | 
|---|
 | 560 |     Array(Range r0, Range r1,
 | 
|---|
 | 561 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 562 |         : storage_(storage)
 | 
|---|
 | 563 |     {
 | 
|---|
 | 564 |         BZPRECONDITION(r0.isAscendingContiguous() && 
 | 
|---|
 | 565 |             r1.isAscendingContiguous());
 | 
|---|
 | 566 | 
 | 
|---|
 | 567 |         length_[0] = r0.length();
 | 
|---|
 | 568 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 569 |         length_[1] = r1.length();
 | 
|---|
 | 570 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 571 | 
 | 
|---|
 | 572 |         setupStorage(1);
 | 
|---|
 | 573 |     }
 | 
|---|
 | 574 | 
 | 
|---|
 | 575 |     Array(Range r0, Range r1, Range r2,
 | 
|---|
 | 576 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 577 |         : storage_(storage)
 | 
|---|
 | 578 |     {
 | 
|---|
 | 579 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 580 |             r1.isAscendingContiguous() && r2.isAscendingContiguous());
 | 
|---|
 | 581 | 
 | 
|---|
 | 582 |         length_[0] = r0.length();
 | 
|---|
 | 583 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 584 |         length_[1] = r1.length();
 | 
|---|
 | 585 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 586 |         length_[2] = r2.length();
 | 
|---|
 | 587 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 588 | 
 | 
|---|
 | 589 |         setupStorage(2);
 | 
|---|
 | 590 |     }
 | 
|---|
 | 591 | 
 | 
|---|
 | 592 |     Array(Range r0, Range r1, Range r2, Range r3,
 | 
|---|
 | 593 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 594 |         : storage_(storage)
 | 
|---|
 | 595 |     {
 | 
|---|
 | 596 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 597 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 598 |             && r3.isAscendingContiguous());
 | 
|---|
 | 599 | 
 | 
|---|
 | 600 |         length_[0] = r0.length();
 | 
|---|
 | 601 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 602 |         length_[1] = r1.length();
 | 
|---|
 | 603 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 604 |         length_[2] = r2.length();
 | 
|---|
 | 605 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 606 |         length_[3] = r3.length();
 | 
|---|
 | 607 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 608 | 
 | 
|---|
 | 609 |         setupStorage(3);
 | 
|---|
 | 610 |     }
 | 
|---|
 | 611 | 
 | 
|---|
 | 612 |     Array(Range r0, Range r1, Range r2, Range r3, Range r4,
 | 
|---|
 | 613 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 614 |         : storage_(storage)
 | 
|---|
 | 615 |     {
 | 
|---|
 | 616 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 617 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 618 |             && r3.isAscendingContiguous() && r4.isAscendingContiguous());
 | 
|---|
 | 619 | 
 | 
|---|
 | 620 |         length_[0] = r0.length();
 | 
|---|
 | 621 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 622 |         length_[1] = r1.length();
 | 
|---|
 | 623 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 624 |         length_[2] = r2.length();
 | 
|---|
 | 625 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 626 |         length_[3] = r3.length();
 | 
|---|
 | 627 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 628 |         length_[4] = r4.length();
 | 
|---|
 | 629 |         storage_.setBase(4, r4.first());
 | 
|---|
 | 630 | 
 | 
|---|
 | 631 |         setupStorage(4);
 | 
|---|
 | 632 |     }
 | 
|---|
 | 633 | 
 | 
|---|
 | 634 |     Array(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
 | 
|---|
 | 635 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 636 |         : storage_(storage)
 | 
|---|
 | 637 |     {
 | 
|---|
 | 638 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 639 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 640 |             && r3.isAscendingContiguous() && r4.isAscendingContiguous()
 | 
|---|
 | 641 |             && r5.isAscendingContiguous());
 | 
|---|
 | 642 | 
 | 
|---|
 | 643 |         length_[0] = r0.length();
 | 
|---|
 | 644 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 645 |         length_[1] = r1.length();
 | 
|---|
 | 646 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 647 |         length_[2] = r2.length();
 | 
|---|
 | 648 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 649 |         length_[3] = r3.length();
 | 
|---|
 | 650 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 651 |         length_[4] = r4.length();
 | 
|---|
 | 652 |         storage_.setBase(4, r4.first());
 | 
|---|
 | 653 |         length_[5] = r5.length();
 | 
|---|
 | 654 |         storage_.setBase(5, r5.first());
 | 
|---|
 | 655 | 
 | 
|---|
 | 656 |         setupStorage(5);
 | 
|---|
 | 657 |     }
 | 
|---|
 | 658 | 
 | 
|---|
 | 659 |     Array(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
 | 
|---|
 | 660 |         Range r6,
 | 
|---|
 | 661 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 662 |         : storage_(storage)
 | 
|---|
 | 663 |     {
 | 
|---|
 | 664 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 665 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 666 |             && r3.isAscendingContiguous() && r4.isAscendingContiguous()
 | 
|---|
 | 667 |             && r5.isAscendingContiguous() && r6.isAscendingContiguous());
 | 
|---|
 | 668 | 
 | 
|---|
 | 669 |         length_[0] = r0.length();
 | 
|---|
 | 670 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 671 |         length_[1] = r1.length();
 | 
|---|
 | 672 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 673 |         length_[2] = r2.length();
 | 
|---|
 | 674 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 675 |         length_[3] = r3.length();
 | 
|---|
 | 676 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 677 |         length_[4] = r4.length();
 | 
|---|
 | 678 |         storage_.setBase(4, r4.first());
 | 
|---|
 | 679 |         length_[5] = r5.length();
 | 
|---|
 | 680 |         storage_.setBase(5, r5.first());
 | 
|---|
 | 681 |         length_[6] = r6.length();
 | 
|---|
 | 682 |         storage_.setBase(6, r6.first());
 | 
|---|
 | 683 | 
 | 
|---|
 | 684 |         setupStorage(6);
 | 
|---|
 | 685 |     }
 | 
|---|
 | 686 | 
 | 
|---|
 | 687 |     Array(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
 | 
|---|
 | 688 |         Range r6, Range r7,
 | 
|---|
 | 689 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 690 |         : storage_(storage)
 | 
|---|
 | 691 |     {
 | 
|---|
 | 692 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 693 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 694 |             && r3.isAscendingContiguous() && r4.isAscendingContiguous()
 | 
|---|
 | 695 |             && r5.isAscendingContiguous() && r6.isAscendingContiguous()
 | 
|---|
 | 696 |             && r7.isAscendingContiguous());
 | 
|---|
 | 697 | 
 | 
|---|
 | 698 |         length_[0] = r0.length();
 | 
|---|
 | 699 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 700 |         length_[1] = r1.length();
 | 
|---|
 | 701 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 702 |         length_[2] = r2.length();
 | 
|---|
 | 703 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 704 |         length_[3] = r3.length();
 | 
|---|
 | 705 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 706 |         length_[4] = r4.length();
 | 
|---|
 | 707 |         storage_.setBase(4, r4.first());
 | 
|---|
 | 708 |         length_[5] = r5.length();
 | 
|---|
 | 709 |         storage_.setBase(5, r5.first());
 | 
|---|
 | 710 |         length_[6] = r6.length();
 | 
|---|
 | 711 |         storage_.setBase(6, r6.first());
 | 
|---|
 | 712 |         length_[7] = r7.length();
 | 
|---|
 | 713 |         storage_.setBase(7, r7.first());
 | 
|---|
 | 714 | 
 | 
|---|
 | 715 |         setupStorage(7);
 | 
|---|
 | 716 |     }
 | 
|---|
 | 717 | 
 | 
|---|
 | 718 |     Array(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
 | 
|---|
 | 719 |         Range r6, Range r7, Range r8,
 | 
|---|
 | 720 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 721 |         : storage_(storage)
 | 
|---|
 | 722 |     {
 | 
|---|
 | 723 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 724 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 725 |             && r3.isAscendingContiguous() && r4.isAscendingContiguous()
 | 
|---|
 | 726 |             && r5.isAscendingContiguous() && r6.isAscendingContiguous()
 | 
|---|
 | 727 |             && r7.isAscendingContiguous() && r8.isAscendingContiguous());
 | 
|---|
 | 728 | 
 | 
|---|
 | 729 |         length_[0] = r0.length();
 | 
|---|
 | 730 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 731 |         length_[1] = r1.length();
 | 
|---|
 | 732 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 733 |         length_[2] = r2.length();
 | 
|---|
 | 734 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 735 |         length_[3] = r3.length();
 | 
|---|
 | 736 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 737 |         length_[4] = r4.length();
 | 
|---|
 | 738 |         storage_.setBase(4, r4.first());
 | 
|---|
 | 739 |         length_[5] = r5.length();
 | 
|---|
 | 740 |         storage_.setBase(5, r5.first());
 | 
|---|
 | 741 |         length_[6] = r6.length();
 | 
|---|
 | 742 |         storage_.setBase(6, r6.first());
 | 
|---|
 | 743 |         length_[7] = r7.length();
 | 
|---|
 | 744 |         storage_.setBase(7, r7.first());
 | 
|---|
 | 745 |         length_[8] = r8.length();
 | 
|---|
 | 746 |         storage_.setBase(8, r8.first());
 | 
|---|
 | 747 | 
 | 
|---|
 | 748 |         setupStorage(8);
 | 
|---|
 | 749 |     }
 | 
|---|
 | 750 | 
 | 
|---|
 | 751 |     Array(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
 | 
|---|
 | 752 |         Range r6, Range r7, Range r8, Range r9,
 | 
|---|
 | 753 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 754 |         : storage_(storage)
 | 
|---|
 | 755 |     {
 | 
|---|
 | 756 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 757 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 758 |             && r3.isAscendingContiguous() && r4.isAscendingContiguous()
 | 
|---|
 | 759 |             && r5.isAscendingContiguous() && r6.isAscendingContiguous()
 | 
|---|
 | 760 |             && r7.isAscendingContiguous() && r8.isAscendingContiguous()
 | 
|---|
 | 761 |             && r9.isAscendingContiguous());
 | 
|---|
 | 762 | 
 | 
|---|
 | 763 |         length_[0] = r0.length();
 | 
|---|
 | 764 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 765 |         length_[1] = r1.length();
 | 
|---|
 | 766 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 767 |         length_[2] = r2.length();
 | 
|---|
 | 768 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 769 |         length_[3] = r3.length();
 | 
|---|
 | 770 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 771 |         length_[4] = r4.length();
 | 
|---|
 | 772 |         storage_.setBase(4, r4.first());
 | 
|---|
 | 773 |         length_[5] = r5.length();
 | 
|---|
 | 774 |         storage_.setBase(5, r5.first());
 | 
|---|
 | 775 |         length_[6] = r6.length();
 | 
|---|
 | 776 |         storage_.setBase(6, r6.first());
 | 
|---|
 | 777 |         length_[7] = r7.length();
 | 
|---|
 | 778 |         storage_.setBase(7, r7.first());
 | 
|---|
 | 779 |         length_[8] = r8.length();
 | 
|---|
 | 780 |         storage_.setBase(8, r8.first());
 | 
|---|
 | 781 |         length_[9] = r9.length();
 | 
|---|
 | 782 |         storage_.setBase(9, r9.first());
 | 
|---|
 | 783 | 
 | 
|---|
 | 784 |         setupStorage(9);
 | 
|---|
 | 785 |     }
 | 
|---|
 | 786 | 
 | 
|---|
 | 787 |     Array(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
 | 
|---|
 | 788 |         Range r6, Range r7, Range r8, Range r9, Range r10,
 | 
|---|
 | 789 |         GeneralArrayStorage<N_rank> storage = GeneralArrayStorage<N_rank>())
 | 
|---|
 | 790 |         : storage_(storage)
 | 
|---|
 | 791 |     {
 | 
|---|
 | 792 |         BZPRECONDITION(r0.isAscendingContiguous() &&
 | 
|---|
 | 793 |             r1.isAscendingContiguous() && r2.isAscendingContiguous()
 | 
|---|
 | 794 |             && r3.isAscendingContiguous() && r4.isAscendingContiguous()
 | 
|---|
 | 795 |             && r5.isAscendingContiguous() && r6.isAscendingContiguous()
 | 
|---|
 | 796 |             && r7.isAscendingContiguous() && r8.isAscendingContiguous()
 | 
|---|
 | 797 |             && r9.isAscendingContiguous() && r10.isAscendingContiguous());
 | 
|---|
 | 798 | 
 | 
|---|
 | 799 |         length_[0] = r0.length();
 | 
|---|
 | 800 |         storage_.setBase(0, r0.first());
 | 
|---|
 | 801 |         length_[1] = r1.length();
 | 
|---|
 | 802 |         storage_.setBase(1, r1.first());
 | 
|---|
 | 803 |         length_[2] = r2.length();
 | 
|---|
 | 804 |         storage_.setBase(2, r2.first());
 | 
|---|
 | 805 |         length_[3] = r3.length();
 | 
|---|
 | 806 |         storage_.setBase(3, r3.first());
 | 
|---|
 | 807 |         length_[4] = r4.length();
 | 
|---|
 | 808 |         storage_.setBase(4, r4.first());
 | 
|---|
 | 809 |         length_[5] = r5.length();
 | 
|---|
 | 810 |         storage_.setBase(5, r5.first());
 | 
|---|
 | 811 |         length_[6] = r6.length();
 | 
|---|
 | 812 |         storage_.setBase(6, r6.first());
 | 
|---|
 | 813 |         length_[7] = r7.length();
 | 
|---|
 | 814 |         storage_.setBase(7, r7.first());
 | 
|---|
 | 815 |         length_[8] = r8.length();
 | 
|---|
 | 816 |         storage_.setBase(8, r8.first());
 | 
|---|
 | 817 |         length_[9] = r9.length();
 | 
|---|
 | 818 |         storage_.setBase(9, r9.first());
 | 
|---|
 | 819 |         length_[10] = r10.length();
 | 
|---|
 | 820 |         storage_.setBase(10, r10.first());
 | 
|---|
 | 821 | 
 | 
|---|
 | 822 |         setupStorage(10);
 | 
|---|
 | 823 |     }
 | 
|---|
 | 824 | 
 | 
|---|
 | 825 |     /*
 | 
|---|
 | 826 |      * Create a reference of another array
 | 
|---|
 | 827 |      */
 | 
|---|
 | 828 |     Array(const Array<T_numtype, N_rank>& array)
 | 
|---|
 | 829 |     {
 | 
|---|
 | 830 |         // NEEDS_WORK: this const_cast is a tad ugly.
 | 
|---|
 | 831 |         reference(const_cast<T_array&>(array));
 | 
|---|
 | 832 |     }
 | 
|---|
 | 833 | 
 | 
|---|
 | 834 |     /*
 | 
|---|
 | 835 |      * These constructors are used for creating interlaced arrays (see
 | 
|---|
 | 836 |      * <blitz/arrayshape.h>
 | 
|---|
 | 837 |      */
 | 
|---|
 | 838 |     Array(const TinyVector<int,N_rank-1>& shape,
 | 
|---|
 | 839 |         int lastExtent, const GeneralArrayStorage<N_rank>& storage);
 | 
|---|
 | 840 |     //Array(const TinyVector<Range,N_rank-1>& shape,
 | 
|---|
 | 841 |     //    int lastExtent, const GeneralArrayStorage<N_rank>& storage);
 | 
|---|
 | 842 | 
 | 
|---|
 | 843 |     /*
 | 
|---|
 | 844 |      * These constructors make the array a view of a subportion of another
 | 
|---|
 | 845 |      * array.  If there fewer than N_rank Range arguments provided, no
 | 
|---|
 | 846 |      * slicing is performed in the unspecified ranks.
 | 
|---|
 | 847 |      * e.g. Array<int,3> A(20,20,20);
 | 
|---|
 | 848 |      *      Array<int,3> B(A, Range(5,15));
 | 
|---|
 | 849 |      * is equivalent to:
 | 
|---|
 | 850 |      *      Array<int,3> B(A, Range(5,15), Range::all(), Range::all());
 | 
|---|
 | 851 |      */
 | 
|---|
 | 852 |     Array(Array<T_numtype, N_rank>& array, Range r0)
 | 
|---|
 | 853 |     {
 | 
|---|
 | 854 |         constructSubarray(array, r0);
 | 
|---|
 | 855 |     }
 | 
|---|
 | 856 | 
 | 
|---|
 | 857 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1)
 | 
|---|
 | 858 |     {
 | 
|---|
 | 859 |         constructSubarray(array, r0, r1);
 | 
|---|
 | 860 |     }
 | 
|---|
 | 861 | 
 | 
|---|
 | 862 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2)
 | 
|---|
 | 863 |     {
 | 
|---|
 | 864 |         constructSubarray(array, r0, r1, r2);
 | 
|---|
 | 865 |     }
 | 
|---|
 | 866 | 
 | 
|---|
 | 867 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 868 |         Range r3)
 | 
|---|
 | 869 |     {
 | 
|---|
 | 870 |         constructSubarray(array, r0, r1, r2, r3);
 | 
|---|
 | 871 |     }
 | 
|---|
 | 872 | 
 | 
|---|
 | 873 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 874 |         Range r3, Range r4)
 | 
|---|
 | 875 |     {
 | 
|---|
 | 876 |         constructSubarray(array, r0, r1, r2, r3, r4);
 | 
|---|
 | 877 |     }
 | 
|---|
 | 878 | 
 | 
|---|
 | 879 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 880 |         Range r3, Range r4, Range r5)
 | 
|---|
 | 881 |     {
 | 
|---|
 | 882 |         constructSubarray(array, r0, r1, r2, r3, r4, r5);
 | 
|---|
 | 883 |     }
 | 
|---|
 | 884 | 
 | 
|---|
 | 885 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 886 |         Range r3, Range r4, Range r5, Range r6)
 | 
|---|
 | 887 |     {
 | 
|---|
 | 888 |         constructSubarray(array, r0, r1, r2, r3, r4, r5, r6);
 | 
|---|
 | 889 |     }
 | 
|---|
 | 890 | 
 | 
|---|
 | 891 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 892 |         Range r3, Range r4, Range r5, Range r6, Range r7)
 | 
|---|
 | 893 |     {
 | 
|---|
 | 894 |         constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7);
 | 
|---|
 | 895 |     }
 | 
|---|
 | 896 | 
 | 
|---|
 | 897 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 898 |         Range r3, Range r4, Range r5, Range r6, Range r7, Range r8)
 | 
|---|
 | 899 |     {
 | 
|---|
 | 900 |         constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7, r8);
 | 
|---|
 | 901 |     }
 | 
|---|
 | 902 | 
 | 
|---|
 | 903 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 904 |         Range r3, Range r4, Range r5, Range r6, Range r7, Range r8, Range r9)
 | 
|---|
 | 905 |     {
 | 
|---|
 | 906 |         constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9);
 | 
|---|
 | 907 |     }
 | 
|---|
 | 908 | 
 | 
|---|
 | 909 |     Array(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
 | 
|---|
 | 910 |         Range r3, Range r4, Range r5, Range r6, Range r7, Range r8, Range r9,
 | 
|---|
 | 911 |         Range r10)
 | 
|---|
 | 912 |     {
 | 
|---|
 | 913 |         constructSubarray(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10);
 | 
|---|
 | 914 |     }
 | 
|---|
 | 915 | 
 | 
|---|
 | 916 |     Array(Array<T_numtype, N_rank>& array, 
 | 
|---|
 | 917 |         const RectDomain<N_rank>& subdomain)
 | 
|---|
 | 918 |     {
 | 
|---|
 | 919 |         constructSubarray(array, subdomain);
 | 
|---|
 | 920 |     }
 | 
|---|
 | 921 | 
 | 
|---|
 | 922 |     /*
 | 
|---|
 | 923 |      * This constructor is invoked by the operator()'s which take
 | 
|---|
 | 924 |      * a combination of integer and Range arguments.  It's not intended
 | 
|---|
 | 925 |      * for end-user use.
 | 
|---|
 | 926 |      */
 | 
|---|
 | 927 |     template<int N_rank2, class R0, class R1, class R2, class R3, class R4,
 | 
|---|
 | 928 |         class R5, class R6, class R7, class R8, class R9, class R10>
 | 
|---|
 | 929 |     Array(Array<T_numtype,N_rank2>& array, R0 r0, R1 r1, R2 r2,
 | 
|---|
 | 930 |         R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10)
 | 
|---|
 | 931 |     {
 | 
|---|
 | 932 |         constructSlice(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10);
 | 
|---|
 | 933 |     }
 | 
|---|
 | 934 | 
 | 
|---|
 | 935 |     //////////////////////////////////////////////
 | 
|---|
 | 936 |     // Member functions
 | 
|---|
 | 937 |     //////////////////////////////////////////////
 | 
|---|
 | 938 | 
 | 
|---|
 | 939 |     const TinyVector<int, N_rank>&    base() const
 | 
|---|
 | 940 |     { return storage_.base(); }
 | 
|---|
 | 941 | 
 | 
|---|
 | 942 |     int                               base(int rank) const
 | 
|---|
 | 943 |     { return storage_.base(rank); }
 | 
|---|
 | 944 | 
 | 
|---|
 | 945 |     T_iterator                        begin() const
 | 
|---|
 | 946 |     { return T_iterator(*this); }
 | 
|---|
 | 947 | 
 | 
|---|
 | 948 |     // Deprecated: now extractComponent(...)
 | 
|---|
 | 949 |     template<class T_numtype2>
 | 
|---|
 | 950 |     Array<T_numtype2,N_rank>          chopComponent(T_numtype2 a, int compNum,
 | 
|---|
 | 951 |                                           int numComponents)
 | 
|---|
 | 952 |     { return extractComponent(a, compNum, numComponents); }
 | 
|---|
 | 953 | 
 | 
|---|
 | 954 |     int                               cols() const
 | 
|---|
 | 955 |     { return length_[1]; }
 | 
|---|
 | 956 | 
 | 
|---|
 | 957 |     int                               columns() const
 | 
|---|
 | 958 |     { return length_[1]; }
 | 
|---|
 | 959 | 
 | 
|---|
 | 960 |     T_array                           copy() const;
 | 
|---|
 | 961 | 
 | 
|---|
 | 962 |     // data_ always refers to the point (0,0,...,0) which may
 | 
|---|
 | 963 |     // not be in the array if the base is not zero in each rank.
 | 
|---|
 | 964 |     // These data() routines return a pointer to the first
 | 
|---|
 | 965 |     // element in the array (but note that it may not be
 | 
|---|
 | 966 |     // stored first in memory if some ranks are stored descending).
 | 
|---|
 | 967 | 
 | 
|---|
 | 968 |     const T_numtype* _bz_restrict     data() const
 | 
|---|
 | 969 |     { return data_ + dot(storage_.base(), stride_); }
 | 
|---|
 | 970 | 
 | 
|---|
 | 971 |     T_numtype* _bz_restrict           data() 
 | 
|---|
 | 972 |     { return data_ + dot(storage_.base(), stride_); }
 | 
|---|
 | 973 | 
 | 
|---|
 | 974 |     // These dataZero() routines refer to the point (0,0,...,0)
 | 
|---|
 | 975 |     // which may not be in the array if the bases are nonzero.
 | 
|---|
 | 976 |     
 | 
|---|
 | 977 |     const T_numtype* _bz_restrict     dataZero() const
 | 
|---|
 | 978 |     { return data_; }
 | 
|---|
 | 979 | 
 | 
|---|
 | 980 |     T_numtype* _bz_restrict           dataZero()
 | 
|---|
 | 981 |     { return data_; }
 | 
|---|
 | 982 | 
 | 
|---|
 | 983 |     // These dataFirst() routines refer to the element in the
 | 
|---|
 | 984 |     // array which falls first in memory.
 | 
|---|
 | 985 |     
 | 
|---|
 | 986 |     const T_numtype* _bz_restrict     dataFirst() const
 | 
|---|
 | 987 |     {
 | 
|---|
 | 988 |         return data_ + dot(storage_.base() 
 | 
|---|
 | 989 |             + (1 - storage_.ascendingFlag()) * (length_ - 1), stride_);
 | 
|---|
 | 990 |     }
 | 
|---|
 | 991 | 
 | 
|---|
 | 992 |     T_numtype* _bz_restrict           dataFirst()
 | 
|---|
 | 993 |     {
 | 
|---|
 | 994 |         return data_ + dot(storage_.base()
 | 
|---|
 | 995 |             + (1 - storage_.ascendingFlag()) * (length_ - 1), stride_);
 | 
|---|
 | 996 |     }
 | 
|---|
 | 997 | 
 | 
|---|
 | 998 |     int                               depth() const
 | 
|---|
 | 999 |     { return length_[2]; }
 | 
|---|
 | 1000 | 
 | 
|---|
 | 1001 |     int                               dimensions() const
 | 
|---|
 | 1002 |     { return N_rank; }
 | 
|---|
 | 1003 | 
 | 
|---|
 | 1004 |     RectDomain<N_rank>                domain() const
 | 
|---|
 | 1005 |     {
 | 
|---|
 | 1006 |         return RectDomain<N_rank>(lbound(), ubound());
 | 
|---|
 | 1007 |     }
 | 
|---|
 | 1008 | 
 | 
|---|
 | 1009 |     void dumpStructureInformation(ostream& os = cout) const;
 | 
|---|
 | 1010 | 
 | 
|---|
 | 1011 |     // NEEDS_WORK -- end()
 | 
|---|
 | 1012 | 
 | 
|---|
 | 1013 |     int                               extent(int rank) const
 | 
|---|
 | 1014 |     { return length_[rank]; }
 | 
|---|
 | 1015 | 
 | 
|---|
 | 1016 |     const TinyVector<int,N_rank>&     extent() const
 | 
|---|
 | 1017 |     { return length_; }
 | 
|---|
 | 1018 | 
 | 
|---|
 | 1019 |     template<class T_numtype2>
 | 
|---|
 | 1020 |     Array<T_numtype2,N_rank>          extractComponent(T_numtype2, int compNum,
 | 
|---|
 | 1021 |                                           int numComponents);
 | 
|---|
 | 1022 | 
 | 
|---|
 | 1023 |     void                              free() 
 | 
|---|
 | 1024 |     {
 | 
|---|
 | 1025 |         changeToNullBlock();
 | 
|---|
 | 1026 |         length_ = 0;
 | 
|---|
 | 1027 |     }
 | 
|---|
 | 1028 |  
 | 
|---|
 | 1029 |     _bz_bool                          isMajorRank(int rank) const
 | 
|---|
 | 1030 |     { return storage_.ordering(rank) == 0; }
 | 
|---|
 | 1031 | 
 | 
|---|
 | 1032 |     _bz_bool                          isMinorRank(int rank) const
 | 
|---|
 | 1033 |     { return storage_.ordering(rank) != 0; }
 | 
|---|
 | 1034 | 
 | 
|---|
 | 1035 |     _bz_bool                          isRankStoredAscending(int rank) const
 | 
|---|
 | 1036 |     { return storage_.isRankStoredAscending(rank); }
 | 
|---|
 | 1037 | 
 | 
|---|
 | 1038 |     _bz_bool                          isStorageContiguous() const
 | 
|---|
 | 1039 |     { return storageContiguous_; }
 | 
|---|
 | 1040 | 
 | 
|---|
 | 1041 |     int                               lbound(int rank) const
 | 
|---|
 | 1042 |     { return base(rank); }
 | 
|---|
 | 1043 | 
 | 
|---|
 | 1044 |     TinyVector<int,N_rank>            lbound() const
 | 
|---|
 | 1045 |     {
 | 
|---|
 | 1046 |         return base();
 | 
|---|
 | 1047 |     }
 | 
|---|
 | 1048 | 
 | 
|---|
 | 1049 |     int                               length(int rank) const
 | 
|---|
 | 1050 |     { return length_[rank]; }
 | 
|---|
 | 1051 | 
 | 
|---|
 | 1052 |     const TinyVector<int, N_rank>&    length() const
 | 
|---|
 | 1053 |     { return length_; }
 | 
|---|
 | 1054 | 
 | 
|---|
 | 1055 |     void                              makeUnique();
 | 
|---|
 | 1056 | 
 | 
|---|
 | 1057 |     int                               numElements() const
 | 
|---|
 | 1058 |     { return product(length_); }
 | 
|---|
 | 1059 | 
 | 
|---|
 | 1060 |     // NEEDS_WORK -- Expose the numReferences() method
 | 
|---|
 | 1061 |     // MemoryBlockReference<T_numtype>::numReferences;
 | 
|---|
 | 1062 | 
 | 
|---|
 | 1063 |     // The storage_.ordering_ array is a list of dimensions from
 | 
|---|
 | 1064 |     // the most minor (stride 1) to major dimension.  Generally,
 | 
|---|
 | 1065 |     // ordering(0) will return the dimension which has the smallest
 | 
|---|
 | 1066 |     // stride, and ordering(N_rank-1) will return the dimension with
 | 
|---|
 | 1067 |     // the largest stride.
 | 
|---|
 | 1068 |     int                               ordering(int storageRankIndex) const
 | 
|---|
 | 1069 |     { return storage_.ordering(storageRankIndex); }
 | 
|---|
 | 1070 | 
 | 
|---|
 | 1071 |     const TinyVector<int, N_rank>&    ordering() const
 | 
|---|
 | 1072 |     { return storage_.ordering(); }
 | 
|---|
 | 1073 | 
 | 
|---|
 | 1074 |     void                              transposeSelf(int r0, int r1, int r2=0, 
 | 
|---|
 | 1075 |         int r3=0, int r4=0, int r5=0, int r6=0, int r7=0, int r8=0, int 
 | 
|---|
 | 1076 |         r9=0, int r10=0);
 | 
|---|
 | 1077 |     T_array                           transpose(int r0, int r1, int r2=0,
 | 
|---|
 | 1078 |         int r3=0, int r4=0, int r5=0, int r6=0, int r7=0, int r8=0, int
 | 
|---|
 | 1079 |         r9=0, int r10=0);
 | 
|---|
 | 1080 | 
 | 
|---|
 | 1081 |     int                               rank() const
 | 
|---|
 | 1082 |     { return N_rank; }
 | 
|---|
 | 1083 | 
 | 
|---|
 | 1084 |     void                              reference(T_array&);
 | 
|---|
 | 1085 | 
 | 
|---|
 | 1086 |     void                              resize(int extent);
 | 
|---|
 | 1087 |     void                              resize(int extent1, int extent2);
 | 
|---|
 | 1088 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1089 |                                         int extent3);
 | 
|---|
 | 1090 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1091 |                                         int extent3, int extent4);
 | 
|---|
 | 1092 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1093 |                                         int extent3, int extent4, int extent5);
 | 
|---|
 | 1094 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1095 |                                         int extent3, int extent4, int extent5,
 | 
|---|
 | 1096 |                                         int extent6);
 | 
|---|
 | 1097 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1098 |                                         int extent3, int extent4, int extent5,
 | 
|---|
 | 1099 |                                         int extent6, int extent7);
 | 
|---|
 | 1100 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1101 |                                         int extent3, int extent4, int extent5,
 | 
|---|
 | 1102 |                                         int extent6, int extent7, int extent8);
 | 
|---|
 | 1103 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1104 |                                         int extent3, int extent4, int extent5,
 | 
|---|
 | 1105 |                                         int extent6, int extent7, int extent8,
 | 
|---|
 | 1106 |                                         int extent9);
 | 
|---|
 | 1107 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1108 |                                         int extent3, int extent4, int extent5,
 | 
|---|
 | 1109 |                                         int extent6, int extent7, int extent8,
 | 
|---|
 | 1110 |                                         int extent9, int extent10);
 | 
|---|
 | 1111 |     void                              resize(int extent1, int extent2,
 | 
|---|
 | 1112 |                                         int extent3, int extent4, int extent5,
 | 
|---|
 | 1113 |                                         int extent6, int extent7, int extent8,
 | 
|---|
 | 1114 |                                         int extent9, int extent10, 
 | 
|---|
 | 1115 |                                         int extent11);
 | 
|---|
 | 1116 | 
 | 
|---|
 | 1117 | 
 | 
|---|
 | 1118 |     void                              resize(Range r1);
 | 
|---|
 | 1119 |     void                              resize(Range r1, Range r2);
 | 
|---|
 | 1120 |     void                              resize(Range r1, Range r2, Range r3);
 | 
|---|
 | 1121 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1122 |                                         Range r4);
 | 
|---|
 | 1123 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1124 |                                         Range r4, Range r5);
 | 
|---|
 | 1125 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1126 |                                         Range r4, Range r5, Range r6);
 | 
|---|
 | 1127 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1128 |                                         Range r4, Range r5, Range r6,
 | 
|---|
 | 1129 |                                         Range r7);
 | 
|---|
 | 1130 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1131 |                                         Range r4, Range r5, Range r6,
 | 
|---|
 | 1132 |                                         Range r7, Range r8);
 | 
|---|
 | 1133 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1134 |                                         Range r4, Range r5, Range r6,
 | 
|---|
 | 1135 |                                         Range r7, Range r8, Range r9);
 | 
|---|
 | 1136 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1137 |                                         Range r4, Range r5, Range r6,
 | 
|---|
 | 1138 |                                         Range r7, Range r8, Range r9, 
 | 
|---|
 | 1139 |                                         Range r10);
 | 
|---|
 | 1140 |     void                              resize(Range r1, Range r2, Range r3,
 | 
|---|
 | 1141 |                                         Range r4, Range r5, Range r6,
 | 
|---|
 | 1142 |                                         Range r7, Range r8, Range r9, 
 | 
|---|
 | 1143 |                                         Range r10, Range r11);
 | 
|---|
 | 1144 | 
 | 
|---|
 | 1145 |     void                              resize(const TinyVector<int,N_rank>&);
 | 
|---|
 | 1146 |  
 | 
|---|
 | 1147 | 
 | 
|---|
 | 1148 |     void                              resizeAndPreserve(int extent);
 | 
|---|
 | 1149 |     void                              resizeAndPreserve(int extent1, 
 | 
|---|
 | 1150 |                                         int extent2);
 | 
|---|
 | 1151 |     void                              resizeAndPreserve(int extent1, 
 | 
|---|
 | 1152 |                                         int extent2, int extent3);
 | 
|---|
 | 1153 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1154 |                                         int extent2, int extent3, int extent4);
 | 
|---|
 | 1155 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1156 |                                         int extent2, int extent3, int extent4,
 | 
|---|
 | 1157 |                                         int extent5);
 | 
|---|
 | 1158 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1159 |                                         int extent2, int extent3, int extent4,
 | 
|---|
 | 1160 |                                         int extent5, int extent6);
 | 
|---|
 | 1161 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1162 |                                         int extent2, int extent3, int extent4,
 | 
|---|
 | 1163 |                                         int extent5, int extent6, int extent7);
 | 
|---|
 | 1164 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1165 |                                         int extent2, int extent3, int extent4,
 | 
|---|
 | 1166 |                                         int extent5, int extent6, int extent7,
 | 
|---|
 | 1167 |                                         int extent8);
 | 
|---|
 | 1168 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1169 |                                         int extent2, int extent3, int extent4,
 | 
|---|
 | 1170 |                                         int extent5, int extent6, int extent7,
 | 
|---|
 | 1171 |                                         int extent8, int extent9);
 | 
|---|
 | 1172 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1173 |                                         int extent2, int extent3, int extent4,
 | 
|---|
 | 1174 |                                         int extent5, int extent6, int extent7,
 | 
|---|
 | 1175 |                                         int extent8, int extent9, 
 | 
|---|
 | 1176 |                                         int extent10);
 | 
|---|
 | 1177 |     void                              resizeAndPreserve(int extent1,
 | 
|---|
 | 1178 |                                         int extent2, int extent3, int extent4,
 | 
|---|
 | 1179 |                                         int extent5, int extent6, int extent7,
 | 
|---|
 | 1180 |                                         int extent8, int extent9, int extent10,
 | 
|---|
 | 1181 |                                         int extent11);
 | 
|---|
 | 1182 | 
 | 
|---|
 | 1183 |     // NEEDS_WORK -- resizeAndPreserve(Range,...)
 | 
|---|
 | 1184 |     // NEEDS_WORK -- resizeAndPreserve(const TinyVector<int,N_rank>&);
 | 
|---|
 | 1185 |     // NEEDS_WORK -- resizeAndPreserve(const Domain<N_rank>&);
 | 
|---|
 | 1186 | 
 | 
|---|
 | 1187 |     T_array                           reverse(int rank);
 | 
|---|
 | 1188 |     void                              reverseSelf(int rank);
 | 
|---|
 | 1189 | 
 | 
|---|
 | 1190 |     int                               rows() const
 | 
|---|
 | 1191 |     { return length_[0]; }
 | 
|---|
 | 1192 | 
 | 
|---|
 | 1193 |     void                              slice(int rank, Range r);
 | 
|---|
 | 1194 | 
 | 
|---|
 | 1195 |     const TinyVector<int, N_rank>&    shape() const
 | 
|---|
 | 1196 |     { return length_; }
 | 
|---|
 | 1197 | 
 | 
|---|
 | 1198 |     int                               size() const
 | 
|---|
 | 1199 |     { return numElements(); }
 | 
|---|
 | 1200 | 
 | 
|---|
 | 1201 |     const TinyVector<int, N_rank>&    stride() const
 | 
|---|
 | 1202 |     { return stride_; }
 | 
|---|
 | 1203 | 
 | 
|---|
 | 1204 |     int                               stride(int rank) const
 | 
|---|
 | 1205 |     { return stride_[rank]; }
 | 
|---|
 | 1206 | 
 | 
|---|
 | 1207 |     int                               ubound(int rank) const
 | 
|---|
 | 1208 |     { return base(rank) + length_(rank) - 1; }
 | 
|---|
 | 1209 | 
 | 
|---|
 | 1210 |     TinyVector<int, N_rank>           ubound() const
 | 
|---|
 | 1211 |     { 
 | 
|---|
 | 1212 |         TinyVector<int, N_rank> ub;
 | 
|---|
 | 1213 |         ub = base() + extent() - 1;
 | 
|---|
 | 1214 |         return ub;
 | 
|---|
 | 1215 |     }
 | 
|---|
 | 1216 | 
 | 
|---|
 | 1217 |     int                               zeroOffset() const
 | 
|---|
 | 1218 |     { return zeroOffset_; }
 | 
|---|
 | 1219 | 
 | 
|---|
 | 1220 |     //////////////////////////////////////////////
 | 
|---|
 | 1221 |     // Debugging routines
 | 
|---|
 | 1222 |     //////////////////////////////////////////////
 | 
|---|
 | 1223 | 
 | 
|---|
 | 1224 |     _bz_bool isInRange(int i0) const
 | 
|---|
 | 1225 |     {
 | 
|---|
 | 1226 |         return unsigned(i0 - base(0)) < length_[0];
 | 
|---|
 | 1227 |     }
 | 
|---|
 | 1228 | 
 | 
|---|
 | 1229 |     _bz_bool isInRange(int i0, int i1) const
 | 
|---|
 | 1230 |     {
 | 
|---|
 | 1231 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1232 |             && unsigned(i1 - base(1)) < length_[1];
 | 
|---|
 | 1233 |     }
 | 
|---|
 | 1234 | 
 | 
|---|
 | 1235 |     _bz_bool isInRange(int i0, int i1, int i2) const
 | 
|---|
 | 1236 |     {
 | 
|---|
 | 1237 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1238 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1239 |             && unsigned(i2 - base(2)) < length_[2];
 | 
|---|
 | 1240 |     }
 | 
|---|
 | 1241 | 
 | 
|---|
 | 1242 |     _bz_bool isInRange(int i0, int i1, int i2, int i3) const
 | 
|---|
 | 1243 |     {
 | 
|---|
 | 1244 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1245 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1246 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1247 |             && unsigned(i3 - base(3)) < length_[3];
 | 
|---|
 | 1248 |     }
 | 
|---|
 | 1249 | 
 | 
|---|
 | 1250 |     _bz_bool isInRange(int i0, int i1, int i2, int i3, int i4) const
 | 
|---|
 | 1251 |     {
 | 
|---|
 | 1252 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1253 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1254 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1255 |             && unsigned(i3 - base(3)) < length_[3]
 | 
|---|
 | 1256 |             && unsigned(i4 - base(4)) < length_[4];
 | 
|---|
 | 1257 |     }
 | 
|---|
 | 1258 | 
 | 
|---|
 | 1259 |     _bz_bool isInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1260 |         int i5) const
 | 
|---|
 | 1261 |     {
 | 
|---|
 | 1262 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1263 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1264 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1265 |             && unsigned(i3 - base(3)) < length_[3]
 | 
|---|
 | 1266 |             && unsigned(i4 - base(4)) < length_[4]
 | 
|---|
 | 1267 |             && unsigned(i5 - base(5)) < length_[5];
 | 
|---|
 | 1268 |     }
 | 
|---|
 | 1269 | 
 | 
|---|
 | 1270 |     _bz_bool isInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1271 |         int i5, int i6) const
 | 
|---|
 | 1272 |     {
 | 
|---|
 | 1273 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1274 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1275 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1276 |             && unsigned(i3 - base(3)) < length_[3]
 | 
|---|
 | 1277 |             && unsigned(i4 - base(4)) < length_[4]
 | 
|---|
 | 1278 |             && unsigned(i5 - base(5)) < length_[5]
 | 
|---|
 | 1279 |             && unsigned(i6 - base(6)) < length_[6];
 | 
|---|
 | 1280 |     }
 | 
|---|
 | 1281 | 
 | 
|---|
 | 1282 |     _bz_bool isInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1283 |         int i5, int i6, int i7) const
 | 
|---|
 | 1284 |     {
 | 
|---|
 | 1285 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1286 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1287 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1288 |             && unsigned(i3 - base(3)) < length_[3]
 | 
|---|
 | 1289 |             && unsigned(i4 - base(4)) < length_[4]
 | 
|---|
 | 1290 |             && unsigned(i5 - base(5)) < length_[5]
 | 
|---|
 | 1291 |             && unsigned(i6 - base(6)) < length_[6]
 | 
|---|
 | 1292 |             && unsigned(i7 - base(7)) < length_[7];
 | 
|---|
 | 1293 |     }
 | 
|---|
 | 1294 | 
 | 
|---|
 | 1295 |     _bz_bool isInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1296 |         int i5, int i6, int i7, int i8) const
 | 
|---|
 | 1297 |     {
 | 
|---|
 | 1298 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1299 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1300 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1301 |             && unsigned(i3 - base(3)) < length_[3]
 | 
|---|
 | 1302 |             && unsigned(i4 - base(4)) < length_[4]
 | 
|---|
 | 1303 |             && unsigned(i5 - base(5)) < length_[5]
 | 
|---|
 | 1304 |             && unsigned(i6 - base(6)) < length_[6]
 | 
|---|
 | 1305 |             && unsigned(i7 - base(7)) < length_[7]
 | 
|---|
 | 1306 |             && unsigned(i8 - base(8)) < length_[8];
 | 
|---|
 | 1307 |     }
 | 
|---|
 | 1308 | 
 | 
|---|
 | 1309 |     _bz_bool isInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1310 |         int i5, int i6, int i7, int i8, int i9) const
 | 
|---|
 | 1311 |     {
 | 
|---|
 | 1312 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1313 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1314 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1315 |             && unsigned(i3 - base(3)) < length_[3]
 | 
|---|
 | 1316 |             && unsigned(i4 - base(4)) < length_[4]
 | 
|---|
 | 1317 |             && unsigned(i5 - base(5)) < length_[5]
 | 
|---|
 | 1318 |             && unsigned(i6 - base(6)) < length_[6]
 | 
|---|
 | 1319 |             && unsigned(i7 - base(7)) < length_[7]
 | 
|---|
 | 1320 |             && unsigned(i8 - base(8)) < length_[8]
 | 
|---|
 | 1321 |             && unsigned(i9 - base(9)) < length_[9];
 | 
|---|
 | 1322 |     }
 | 
|---|
 | 1323 | 
 | 
|---|
 | 1324 |     _bz_bool isInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1325 |         int i5, int i6, int i7, int i8, int i9, int i10) const
 | 
|---|
 | 1326 |     {
 | 
|---|
 | 1327 |         return unsigned(i0 - base(0)) < length_[0]
 | 
|---|
 | 1328 |             && unsigned(i1 - base(1)) < length_[1]
 | 
|---|
 | 1329 |             && unsigned(i2 - base(2)) < length_[2]
 | 
|---|
 | 1330 |             && unsigned(i3 - base(3)) < length_[3]
 | 
|---|
 | 1331 |             && unsigned(i4 - base(4)) < length_[4]
 | 
|---|
 | 1332 |             && unsigned(i5 - base(5)) < length_[5]
 | 
|---|
 | 1333 |             && unsigned(i6 - base(6)) < length_[6]
 | 
|---|
 | 1334 |             && unsigned(i7 - base(7)) < length_[7]
 | 
|---|
 | 1335 |             && unsigned(i8 - base(8)) < length_[8]
 | 
|---|
 | 1336 |             && unsigned(i9 - base(9)) < length_[9]
 | 
|---|
 | 1337 |             && unsigned(i10 - base(10)) < length_[10];
 | 
|---|
 | 1338 |     }
 | 
|---|
 | 1339 | 
 | 
|---|
 | 1340 |     _bz_bool isInRange(const T_index& index) const
 | 
|---|
 | 1341 |     {
 | 
|---|
 | 1342 |         for (int i=0; i < N_rank; ++i)
 | 
|---|
 | 1343 |             if (unsigned(index[i] - base(i)) >= length_[i])
 | 
|---|
 | 1344 |                 return _bz_false;
 | 
|---|
 | 1345 | 
 | 
|---|
 | 1346 |         return _bz_true;
 | 
|---|
 | 1347 |     }
 | 
|---|
 | 1348 | 
 | 
|---|
 | 1349 |     _bz_bool assertInRange(const T_index& index) const
 | 
|---|
 | 1350 |     {
 | 
|---|
 | 1351 |         BZPRECHECK(isInRange(index), "Array index out of range: " << index
 | 
|---|
 | 1352 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1353 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1354 |         return _bz_true;
 | 
|---|
 | 1355 |     }
 | 
|---|
 | 1356 | 
 | 
|---|
 | 1357 |     _bz_bool assertInRange(int i0) const
 | 
|---|
 | 1358 |     {
 | 
|---|
 | 1359 |         BZPRECHECK(isInRange(i0), "Array index out of range: " << i0
 | 
|---|
 | 1360 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1361 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1362 |         return _bz_true;
 | 
|---|
 | 1363 |     }
 | 
|---|
 | 1364 | 
 | 
|---|
 | 1365 |     _bz_bool assertInRange(int i0, int i1) const
 | 
|---|
 | 1366 |     {
 | 
|---|
 | 1367 |         BZPRECHECK(isInRange(i0,i1), "Array index out of range: (" 
 | 
|---|
 | 1368 |             << i0 << ", " << i1 << ")"
 | 
|---|
 | 1369 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1370 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1371 |         return _bz_true;
 | 
|---|
 | 1372 |     }
 | 
|---|
 | 1373 | 
 | 
|---|
 | 1374 |     _bz_bool assertInRange(int i0, int i1, int i2) const
 | 
|---|
 | 1375 |     {
 | 
|---|
 | 1376 |         BZPRECHECK(isInRange(i0,i1,i2), "Array index out of range: ("
 | 
|---|
 | 1377 |             << i0 << ", " << i1 << ", " << i2 << ")"
 | 
|---|
 | 1378 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1379 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1380 |         return _bz_true;
 | 
|---|
 | 1381 |     }
 | 
|---|
 | 1382 | 
 | 
|---|
 | 1383 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3) const
 | 
|---|
 | 1384 |     {
 | 
|---|
 | 1385 |         BZPRECHECK(isInRange(i0,i1,i2,i3), "Array index out of range: ("
 | 
|---|
 | 1386 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3 << ")"
 | 
|---|
 | 1387 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1388 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1389 |         return _bz_true;
 | 
|---|
 | 1390 |     }
 | 
|---|
 | 1391 | 
 | 
|---|
 | 1392 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3, int i4) const
 | 
|---|
 | 1393 |     {
 | 
|---|
 | 1394 |         BZPRECHECK(isInRange(i0,i1,i2,i3,i4), "Array index out of range: ("
 | 
|---|
 | 1395 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3 
 | 
|---|
 | 1396 |             << ", " << i4 << ")"
 | 
|---|
 | 1397 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1398 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1399 |         return _bz_true;
 | 
|---|
 | 1400 |     }
 | 
|---|
 | 1401 | 
 | 
|---|
 | 1402 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3, int i4, 
 | 
|---|
 | 1403 |         int i5) const
 | 
|---|
 | 1404 |     {
 | 
|---|
 | 1405 |         BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5), "Array index out of range: ("
 | 
|---|
 | 1406 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3
 | 
|---|
 | 1407 |             << ", " << i4 << ", " << i5 << ")"
 | 
|---|
 | 1408 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1409 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1410 |         return _bz_true;
 | 
|---|
 | 1411 |     }
 | 
|---|
 | 1412 | 
 | 
|---|
 | 1413 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1414 |         int i5, int i6) const
 | 
|---|
 | 1415 |     {
 | 
|---|
 | 1416 |         BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6), 
 | 
|---|
 | 1417 |             "Array index out of range: ("
 | 
|---|
 | 1418 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3
 | 
|---|
 | 1419 |             << ", " << i4 << ", " << i5 << ", " << i6 << ")"
 | 
|---|
 | 1420 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1421 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1422 |         return _bz_true;
 | 
|---|
 | 1423 |     }
 | 
|---|
 | 1424 | 
 | 
|---|
 | 1425 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1426 |         int i5, int i6, int i7) const
 | 
|---|
 | 1427 |     {
 | 
|---|
 | 1428 |         BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7),
 | 
|---|
 | 1429 |             "Array index out of range: ("
 | 
|---|
 | 1430 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3
 | 
|---|
 | 1431 |             << ", " << i4 << ", " << i5 << ", " << i6 << ", " << i7 << ")"
 | 
|---|
 | 1432 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1433 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1434 |         return _bz_true;
 | 
|---|
 | 1435 |     }
 | 
|---|
 | 1436 | 
 | 
|---|
 | 1437 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1438 |         int i5, int i6, int i7, int i8) const
 | 
|---|
 | 1439 |     {
 | 
|---|
 | 1440 |         BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7,i8),
 | 
|---|
 | 1441 |             "Array index out of range: ("
 | 
|---|
 | 1442 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3
 | 
|---|
 | 1443 |             << ", " << i4 << ", " << i5 << ", " << i6 << ", " << i7 
 | 
|---|
 | 1444 |             << ", " << i8 << ")"
 | 
|---|
 | 1445 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1446 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1447 |         return _bz_true;
 | 
|---|
 | 1448 |     }
 | 
|---|
 | 1449 | 
 | 
|---|
 | 1450 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1451 |         int i5, int i6, int i7, int i8, int i9) const
 | 
|---|
 | 1452 |     {
 | 
|---|
 | 1453 |         BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9),
 | 
|---|
 | 1454 |             "Array index out of range: ("
 | 
|---|
 | 1455 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3
 | 
|---|
 | 1456 |             << ", " << i4 << ", " << i5 << ", " << i6 << ", " << i7
 | 
|---|
 | 1457 |             << ", " << i8 << ", " << i9 << ")"
 | 
|---|
 | 1458 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1459 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1460 |         return _bz_true;
 | 
|---|
 | 1461 |     }
 | 
|---|
 | 1462 | 
 | 
|---|
 | 1463 |     _bz_bool assertInRange(int i0, int i1, int i2, int i3, int i4,
 | 
|---|
 | 1464 |         int i5, int i6, int i7, int i8, int i9, int i10) const
 | 
|---|
 | 1465 |     {
 | 
|---|
 | 1466 |         BZPRECHECK(isInRange(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10),
 | 
|---|
 | 1467 |             "Array index out of range: ("
 | 
|---|
 | 1468 |             << i0 << ", " << i1 << ", " << i2 << ", " << i3
 | 
|---|
 | 1469 |             << ", " << i4 << ", " << i5 << ", " << i6 << ", " << i7
 | 
|---|
 | 1470 |             << ", " << i8 << ", " << i9 << ", " << i10 << ")"
 | 
|---|
 | 1471 |             << endl << "Lower bounds: " << storage_.base() << endl
 | 
|---|
 | 1472 |             << "Upper bounds: " << (storage_.base() + length_ - 1) << endl);
 | 
|---|
 | 1473 |         return _bz_true;
 | 
|---|
 | 1474 |     }
 | 
|---|
 | 1475 | 
 | 
|---|
 | 1476 |     //////////////////////////////////////////////
 | 
|---|
 | 1477 |     // Subscripting operators
 | 
|---|
 | 1478 |     //////////////////////////////////////////////
 | 
|---|
 | 1479 | 
 | 
|---|
 | 1480 |     template<int N_rank2>
 | 
|---|
 | 1481 |     T_numtype operator()(const TinyVector<int,N_rank2>& index) const
 | 
|---|
 | 1482 |     {
 | 
|---|
 | 1483 |         assertInRange(index);
 | 
|---|
 | 1484 |         return data_[dot(index, stride_)];
 | 
|---|
 | 1485 |     }
 | 
|---|
 | 1486 | 
 | 
|---|
 | 1487 |     template<int N_rank2>
 | 
|---|
 | 1488 |     T_numtype& _bz_restrict operator()(const TinyVector<int,N_rank2>& index) 
 | 
|---|
 | 1489 |     {
 | 
|---|
 | 1490 |         assertInRange(index);
 | 
|---|
 | 1491 |         return data_[dot(index, stride_)];
 | 
|---|
 | 1492 |     }
 | 
|---|
 | 1493 | 
 | 
|---|
 | 1494 |     T_numtype operator()(TinyVector<int,1> index) const
 | 
|---|
 | 1495 |     {
 | 
|---|
 | 1496 |         assertInRange(index[0]);
 | 
|---|
 | 1497 |         return data_[index[0] * stride_[0]];
 | 
|---|
 | 1498 |     }
 | 
|---|
 | 1499 | 
 | 
|---|
 | 1500 |     T_numtype& operator()(TinyVector<int,1> index)
 | 
|---|
 | 1501 |     {
 | 
|---|
 | 1502 |         assertInRange(index[0]);
 | 
|---|
 | 1503 |         return data_[index[0] * stride_[0]];
 | 
|---|
 | 1504 |     }
 | 
|---|
 | 1505 | 
 | 
|---|
 | 1506 |     T_numtype operator()(TinyVector<int,2> index) const
 | 
|---|
 | 1507 |     {
 | 
|---|
 | 1508 |         assertInRange(index[0], index[1]);
 | 
|---|
 | 1509 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]];
 | 
|---|
 | 1510 |     }
 | 
|---|
 | 1511 | 
 | 
|---|
 | 1512 |     T_numtype& operator()(TinyVector<int,2> index)
 | 
|---|
 | 1513 |     {
 | 
|---|
 | 1514 |         assertInRange(index[0], index[1]);
 | 
|---|
 | 1515 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]];
 | 
|---|
 | 1516 |     }
 | 
|---|
 | 1517 | 
 | 
|---|
 | 1518 |     T_numtype operator()(TinyVector<int,3> index) const
 | 
|---|
 | 1519 |     {
 | 
|---|
 | 1520 |         assertInRange(index[0], index[1], index[2]);
 | 
|---|
 | 1521 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1522 |             + index[2] * stride_[2]];
 | 
|---|
 | 1523 |     }
 | 
|---|
 | 1524 | 
 | 
|---|
 | 1525 |     T_numtype& operator()(TinyVector<int,3> index)
 | 
|---|
 | 1526 |     {
 | 
|---|
 | 1527 |         assertInRange(index[0], index[1], index[2]);
 | 
|---|
 | 1528 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1529 |             + index[2] * stride_[2]];
 | 
|---|
 | 1530 |     }
 | 
|---|
 | 1531 | 
 | 
|---|
 | 1532 |     T_numtype operator()(const TinyVector<int,4>& index) const
 | 
|---|
 | 1533 |     {
 | 
|---|
 | 1534 |         assertInRange(index[0], index[1], index[2], index[3]);
 | 
|---|
 | 1535 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1536 |             + index[2] * stride_[2] + index[3] * stride_[3]];
 | 
|---|
 | 1537 |     }
 | 
|---|
 | 1538 | 
 | 
|---|
 | 1539 |     T_numtype& operator()(const TinyVector<int,4>& index)
 | 
|---|
 | 1540 |     {
 | 
|---|
 | 1541 |         assertInRange(index[0], index[1], index[2], index[3]);
 | 
|---|
 | 1542 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1543 |             + index[2] * stride_[2] + index[3] * stride_[3]];
 | 
|---|
 | 1544 |     }
 | 
|---|
 | 1545 | 
 | 
|---|
 | 1546 |     T_numtype operator()(const TinyVector<int,5>& index) const
 | 
|---|
 | 1547 |     {
 | 
|---|
 | 1548 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1549 |             index[4]);
 | 
|---|
 | 1550 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1551 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1552 |             + index[4] * stride_[4]];
 | 
|---|
 | 1553 |     }
 | 
|---|
 | 1554 | 
 | 
|---|
 | 1555 |     T_numtype& operator()(const TinyVector<int,5>& index)
 | 
|---|
 | 1556 |     {
 | 
|---|
 | 1557 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1558 |             index[4]);
 | 
|---|
 | 1559 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1560 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1561 |             + index[4] * stride_[4]];
 | 
|---|
 | 1562 |     }
 | 
|---|
 | 1563 | 
 | 
|---|
 | 1564 |     T_numtype operator()(const TinyVector<int,6>& index) const
 | 
|---|
 | 1565 |     {
 | 
|---|
 | 1566 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1567 |             index[4], index[5]);
 | 
|---|
 | 1568 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1569 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1570 |             + index[4] * stride_[4] + index[5] * stride_[5]];
 | 
|---|
 | 1571 |     }
 | 
|---|
 | 1572 | 
 | 
|---|
 | 1573 |     T_numtype& operator()(const TinyVector<int,6>& index)
 | 
|---|
 | 1574 |     {
 | 
|---|
 | 1575 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1576 |             index[4], index[5]);
 | 
|---|
 | 1577 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1578 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1579 |             + index[4] * stride_[4] + index[5] * stride_[5]];
 | 
|---|
 | 1580 |     }
 | 
|---|
 | 1581 | 
 | 
|---|
 | 1582 |     T_numtype operator()(const TinyVector<int,7>& index) const
 | 
|---|
 | 1583 |     {
 | 
|---|
 | 1584 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1585 |             index[4], index[5], index[6]);
 | 
|---|
 | 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]];
 | 
|---|
 | 1590 |     }
 | 
|---|
 | 1591 | 
 | 
|---|
 | 1592 |     T_numtype& operator()(const TinyVector<int,7>& index)
 | 
|---|
 | 1593 |     {
 | 
|---|
 | 1594 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1595 |             index[4], index[5], index[6]);
 | 
|---|
 | 1596 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1597 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1598 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1599 |             + index[6] * stride_[6]];
 | 
|---|
 | 1600 |     }
 | 
|---|
 | 1601 | 
 | 
|---|
 | 1602 |     T_numtype operator()(const TinyVector<int,8>& index) const
 | 
|---|
 | 1603 |     {
 | 
|---|
 | 1604 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1605 |             index[4], index[5], index[6], index[7]);
 | 
|---|
 | 1606 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1607 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1608 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1609 |             + index[6] * stride_[6] + index[7] * stride_[7]];
 | 
|---|
 | 1610 |     }
 | 
|---|
 | 1611 | 
 | 
|---|
 | 1612 |     T_numtype& operator()(const TinyVector<int,8>& index)
 | 
|---|
 | 1613 |     {
 | 
|---|
 | 1614 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1615 |             index[4], index[5], index[6], index[7]);
 | 
|---|
 | 1616 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1617 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1618 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1619 |             + index[6] * stride_[6] + index[7] * stride_[7]];
 | 
|---|
 | 1620 |     }
 | 
|---|
 | 1621 | 
 | 
|---|
 | 1622 |     T_numtype operator()(const TinyVector<int,9>& index) const
 | 
|---|
 | 1623 |     {
 | 
|---|
 | 1624 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1625 |             index[4], index[5], index[6], index[7], index[8]);
 | 
|---|
 | 1626 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1627 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1628 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1629 |             + index[6] * stride_[6] + index[7] * stride_[7]
 | 
|---|
 | 1630 |             + index[8] * stride_[8]];
 | 
|---|
 | 1631 |     }
 | 
|---|
 | 1632 | 
 | 
|---|
 | 1633 |     T_numtype& operator()(const TinyVector<int,9>& index)
 | 
|---|
 | 1634 |     {
 | 
|---|
 | 1635 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1636 |             index[4], index[5], index[6], index[7], index[8]);
 | 
|---|
 | 1637 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1638 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1639 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1640 |             + index[6] * stride_[6] + index[7] * stride_[7]
 | 
|---|
 | 1641 |             + index[8] * stride_[8]];
 | 
|---|
 | 1642 |     }
 | 
|---|
 | 1643 | 
 | 
|---|
 | 1644 |     T_numtype operator()(const TinyVector<int,10>& index) const
 | 
|---|
 | 1645 |     {
 | 
|---|
 | 1646 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1647 |             index[4], index[5], index[6], index[7], index[8], index[9]);
 | 
|---|
 | 1648 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1649 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1650 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1651 |             + index[6] * stride_[6] + index[7] * stride_[7]
 | 
|---|
 | 1652 |             + index[8] * stride_[8] + index[9] * stride_[9]];
 | 
|---|
 | 1653 |     }
 | 
|---|
 | 1654 | 
 | 
|---|
 | 1655 |     T_numtype& operator()(const TinyVector<int,10>& index)
 | 
|---|
 | 1656 |     {
 | 
|---|
 | 1657 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1658 |             index[4], index[5], index[6], index[7], index[8], index[9]);
 | 
|---|
 | 1659 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1660 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1661 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1662 |             + index[6] * stride_[6] + index[7] * stride_[7]
 | 
|---|
 | 1663 |             + index[8] * stride_[8] + index[9] * stride_[9]];
 | 
|---|
 | 1664 |     }
 | 
|---|
 | 1665 | 
 | 
|---|
 | 1666 |     T_numtype operator()(const TinyVector<int,11>& index) const
 | 
|---|
 | 1667 |     {
 | 
|---|
 | 1668 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1669 |             index[4], index[5], index[6], index[7], index[8], index[9],
 | 
|---|
 | 1670 |             index[10]);
 | 
|---|
 | 1671 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1672 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1673 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1674 |             + index[6] * stride_[6] + index[7] * stride_[7]
 | 
|---|
 | 1675 |             + index[8] * stride_[8] + index[9] * stride_[9]
 | 
|---|
 | 1676 |             + index[10] * stride_[10]];
 | 
|---|
 | 1677 |     }
 | 
|---|
 | 1678 | 
 | 
|---|
 | 1679 |     T_numtype& operator()(const TinyVector<int,11>& index)
 | 
|---|
 | 1680 |     {
 | 
|---|
 | 1681 |         assertInRange(index[0], index[1], index[2], index[3],
 | 
|---|
 | 1682 |             index[4], index[5], index[6], index[7], index[8], index[9],
 | 
|---|
 | 1683 |             index[10]);
 | 
|---|
 | 1684 |         return data_[index[0] * stride_[0] + index[1] * stride_[1]
 | 
|---|
 | 1685 |             + index[2] * stride_[2] + index[3] * stride_[3]
 | 
|---|
 | 1686 |             + index[4] * stride_[4] + index[5] * stride_[5]
 | 
|---|
 | 1687 |             + index[6] * stride_[6] + index[7] * stride_[7]
 | 
|---|
 | 1688 |             + index[8] * stride_[8] + index[9] * stride_[9]
 | 
|---|
 | 1689 |             + index[10] * stride_[10]];
 | 
|---|
 | 1690 |     }
 | 
|---|
 | 1691 | 
 | 
|---|
 | 1692 |     T_numtype operator()(int i0) const
 | 
|---|
 | 1693 |     { 
 | 
|---|
 | 1694 |         assertInRange(i0);
 | 
|---|
 | 1695 |         return data_[i0 * stride_[0]]; 
 | 
|---|
 | 1696 |     }
 | 
|---|
 | 1697 | 
 | 
|---|
 | 1698 |     T_numtype& _bz_restrict operator()(int i0) 
 | 
|---|
 | 1699 |     {
 | 
|---|
 | 1700 |         assertInRange(i0);
 | 
|---|
 | 1701 |         return data_[i0 * stride_[0]];
 | 
|---|
 | 1702 |     }
 | 
|---|
 | 1703 | 
 | 
|---|
 | 1704 |     T_numtype operator()(int i0, int i1) const
 | 
|---|
 | 1705 |     { 
 | 
|---|
 | 1706 |         assertInRange(i0, i1);
 | 
|---|
 | 1707 |         return data_[i0 * stride_[0] + i1 * stride_[1]];
 | 
|---|
 | 1708 |     }
 | 
|---|
 | 1709 | 
 | 
|---|
 | 1710 |     T_numtype& _bz_restrict operator()(int i0, int i1)
 | 
|---|
 | 1711 |     {
 | 
|---|
 | 1712 |         assertInRange(i0, i1);
 | 
|---|
 | 1713 |         return data_[i0 * stride_[0] + i1 * stride_[1]];
 | 
|---|
 | 1714 |     }
 | 
|---|
 | 1715 | 
 | 
|---|
 | 1716 |     T_numtype operator()(int i0, int i1, int i2) const
 | 
|---|
 | 1717 |     {
 | 
|---|
 | 1718 |         assertInRange(i0, i1, i2);
 | 
|---|
 | 1719 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1720 |             + i2 * stride_[2]];
 | 
|---|
 | 1721 |     }
 | 
|---|
 | 1722 | 
 | 
|---|
 | 1723 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2) 
 | 
|---|
 | 1724 |     {
 | 
|---|
 | 1725 |         assertInRange(i0, i1, i2);
 | 
|---|
 | 1726 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1727 |             + i2 * stride_[2]];
 | 
|---|
 | 1728 |     }
 | 
|---|
 | 1729 | 
 | 
|---|
 | 1730 |     T_numtype operator()(int i0, int i1, int i2, int i3) const
 | 
|---|
 | 1731 |     {
 | 
|---|
 | 1732 |         assertInRange(i0, i1, i2, i3);
 | 
|---|
 | 1733 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1734 |             + i2 * stride_[2] + i3 * stride_[3]];
 | 
|---|
 | 1735 |     }
 | 
|---|
 | 1736 | 
 | 
|---|
 | 1737 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3)
 | 
|---|
 | 1738 |     {
 | 
|---|
 | 1739 |         assertInRange(i0, i1, i2, i3);
 | 
|---|
 | 1740 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1741 |             + i2 * stride_[2] + i3 * stride_[3]];
 | 
|---|
 | 1742 |     }
 | 
|---|
 | 1743 | 
 | 
|---|
 | 1744 |     T_numtype operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1745 |         int i4) const
 | 
|---|
 | 1746 |     {
 | 
|---|
 | 1747 |         assertInRange(i0, i1, i2, i3, i4);
 | 
|---|
 | 1748 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1749 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]];
 | 
|---|
 | 1750 |     }
 | 
|---|
 | 1751 | 
 | 
|---|
 | 1752 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1753 |         int i4)
 | 
|---|
 | 1754 |     {
 | 
|---|
 | 1755 |         assertInRange(i0, i1, i2, i3, i4);
 | 
|---|
 | 1756 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1757 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]];
 | 
|---|
 | 1758 |     }
 | 
|---|
 | 1759 | 
 | 
|---|
 | 1760 |     T_numtype operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1761 |         int i4, int i5) const
 | 
|---|
 | 1762 |     {
 | 
|---|
 | 1763 |         assertInRange(i0, i1, i2, i3, i4, i5);
 | 
|---|
 | 1764 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1765 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1766 |             + i5 * stride_[5]];
 | 
|---|
 | 1767 |     }
 | 
|---|
 | 1768 | 
 | 
|---|
 | 1769 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1770 |         int i4, int i5)
 | 
|---|
 | 1771 |     {
 | 
|---|
 | 1772 |         assertInRange(i0, i1, i2, i3, i4, i5);
 | 
|---|
 | 1773 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1774 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1775 |             + i5 * stride_[5]];
 | 
|---|
 | 1776 |     }
 | 
|---|
 | 1777 | 
 | 
|---|
 | 1778 |     T_numtype operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1779 |         int i4, int i5, int i6) const
 | 
|---|
 | 1780 |     {
 | 
|---|
 | 1781 |         assertInRange(i0, i1, i2, i3, i4, i5, i6);
 | 
|---|
 | 1782 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1783 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1784 |             + i5 * stride_[5] + i6 * stride_[6]];
 | 
|---|
 | 1785 |     }
 | 
|---|
 | 1786 | 
 | 
|---|
 | 1787 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1788 |         int i4, int i5, int i6)
 | 
|---|
 | 1789 |     {
 | 
|---|
 | 1790 |         assertInRange(i0, i1, i2, i3, i4, i5, i6);
 | 
|---|
 | 1791 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1792 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1793 |             + i5 * stride_[5] + i6 * stride_[6]];
 | 
|---|
 | 1794 |     }
 | 
|---|
 | 1795 | 
 | 
|---|
 | 1796 |     T_numtype operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1797 |         int i4, int i5, int i6, int i7) const
 | 
|---|
 | 1798 |     {
 | 
|---|
 | 1799 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7);
 | 
|---|
 | 1800 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1801 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1802 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]];
 | 
|---|
 | 1803 |     }
 | 
|---|
 | 1804 | 
 | 
|---|
 | 1805 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1806 |         int i4, int i5, int i6, int i7)
 | 
|---|
 | 1807 |     {
 | 
|---|
 | 1808 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7);
 | 
|---|
 | 1809 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1810 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1811 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]];
 | 
|---|
 | 1812 |     }
 | 
|---|
 | 1813 | 
 | 
|---|
 | 1814 |     T_numtype operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1815 |         int i4, int i5, int i6, int i7, int i8) const
 | 
|---|
 | 1816 |     {
 | 
|---|
 | 1817 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8);
 | 
|---|
 | 1818 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1819 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1820 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
 | 
|---|
 | 1821 |             + i8 * stride_[8]];
 | 
|---|
 | 1822 |     }
 | 
|---|
 | 1823 | 
 | 
|---|
 | 1824 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1825 |         int i4, int i5, int i6, int i7, int i8)
 | 
|---|
 | 1826 |     {
 | 
|---|
 | 1827 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8);
 | 
|---|
 | 1828 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1829 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1830 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
 | 
|---|
 | 1831 |             + i8 * stride_[8]];
 | 
|---|
 | 1832 |     }
 | 
|---|
 | 1833 | 
 | 
|---|
 | 1834 |     T_numtype operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1835 |         int i4, int i5, int i6, int i7, int i8, int i9) const
 | 
|---|
 | 1836 |     {
 | 
|---|
 | 1837 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);
 | 
|---|
 | 1838 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1839 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1840 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
 | 
|---|
 | 1841 |             + i8 * stride_[8] + i9 * stride_[9]];
 | 
|---|
 | 1842 |     }
 | 
|---|
 | 1843 | 
 | 
|---|
 | 1844 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1845 |         int i4, int i5, int i6, int i7, int i8, int i9)
 | 
|---|
 | 1846 |     {
 | 
|---|
 | 1847 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);
 | 
|---|
 | 1848 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1849 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1850 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
 | 
|---|
 | 1851 |             + i8 * stride_[8] + i9 * stride_[9]];
 | 
|---|
 | 1852 |     }
 | 
|---|
 | 1853 | 
 | 
|---|
 | 1854 |     T_numtype operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1855 |         int i4, int i5, int i6, int i7, int i8, int i9, int i10) const
 | 
|---|
 | 1856 |     {
 | 
|---|
 | 1857 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8, 
 | 
|---|
 | 1858 |             i9, i10);
 | 
|---|
 | 1859 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1860 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1861 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
 | 
|---|
 | 1862 |             + i8 * stride_[8] + i9 * stride_[9] + i10 * stride_[10]];
 | 
|---|
 | 1863 |     }
 | 
|---|
 | 1864 | 
 | 
|---|
 | 1865 |     T_numtype& _bz_restrict operator()(int i0, int i1, int i2, int i3,
 | 
|---|
 | 1866 |         int i4, int i5, int i6, int i7, int i8, int i9, int i10)
 | 
|---|
 | 1867 |     {
 | 
|---|
 | 1868 |         assertInRange(i0, i1, i2, i3, i4, i5, i6, i7, i8, 
 | 
|---|
 | 1869 |             i9, i10);
 | 
|---|
 | 1870 |         return data_[i0 * stride_[0] + i1 * stride_[1]
 | 
|---|
 | 1871 |             + i2 * stride_[2] + i3 * stride_[3] + i4 * stride_[4]
 | 
|---|
 | 1872 |             + i5 * stride_[5] + i6 * stride_[6] + i7 * stride_[7]
 | 
|---|
 | 1873 |             + i8 * stride_[8] + i9 * stride_[9] + i10 * stride_[10]];
 | 
|---|
 | 1874 |     }
 | 
|---|
 | 1875 | 
 | 
|---|
 | 1876 |     /*
 | 
|---|
 | 1877 |      * Slicing to produce subarrays.  If the number of Range arguments is
 | 
|---|
 | 1878 |      * fewer than N_rank, then missing arguments are treated like Range::all().
 | 
|---|
 | 1879 |      */
 | 
|---|
 | 1880 | 
 | 
|---|
 | 1881 |     T_array operator()(const RectDomain<N_rank>& subdomain)
 | 
|---|
 | 1882 |     {
 | 
|---|
 | 1883 |         return T_array(*this, subdomain);
 | 
|---|
 | 1884 |     }
 | 
|---|
 | 1885 | 
 | 
|---|
 | 1886 |     T_array operator()(Range r0)
 | 
|---|
 | 1887 |     {
 | 
|---|
 | 1888 |         return T_array(*this, r0);
 | 
|---|
 | 1889 |     }
 | 
|---|
 | 1890 | 
 | 
|---|
 | 1891 |     T_array operator()(Range r0, Range r1)
 | 
|---|
 | 1892 |     {
 | 
|---|
 | 1893 |         return T_array(*this, r0, r1);
 | 
|---|
 | 1894 |     }
 | 
|---|
 | 1895 | 
 | 
|---|
 | 1896 |     T_array operator()(Range r0, Range r1, Range r2)
 | 
|---|
 | 1897 |     {
 | 
|---|
 | 1898 |         return T_array(*this, r0, r1, r2);
 | 
|---|
 | 1899 |     }
 | 
|---|
 | 1900 | 
 | 
|---|
 | 1901 |     T_array operator()(Range r0, Range r1, Range r2, Range r3)
 | 
|---|
 | 1902 |     {
 | 
|---|
 | 1903 |         return T_array(*this, r0, r1, r2, r3);
 | 
|---|
 | 1904 |     }
 | 
|---|
 | 1905 | 
 | 
|---|
 | 1906 |     T_array operator()(Range r0, Range r1, Range r2, Range r3, Range r4)
 | 
|---|
 | 1907 |     {
 | 
|---|
 | 1908 |         return T_array(*this, r0, r1, r2, r3, r4);
 | 
|---|
 | 1909 |     }
 | 
|---|
 | 1910 | 
 | 
|---|
 | 1911 |     T_array operator()(Range r0, Range r1, Range r2, Range r3, Range r4,
 | 
|---|
 | 1912 |         Range r5)
 | 
|---|
 | 1913 |     {
 | 
|---|
 | 1914 |         return T_array(*this, r0, r1, r2, r3, r4, r5);
 | 
|---|
 | 1915 |     }
 | 
|---|
 | 1916 | 
 | 
|---|
 | 1917 |     T_array operator()(Range r0, Range r1, Range r2, Range r3, Range r4,
 | 
|---|
 | 1918 |         Range r5, Range r6)
 | 
|---|
 | 1919 |     {
 | 
|---|
 | 1920 |         return T_array(*this, r0, r1, r2, r3, r4, r5, r6);
 | 
|---|
 | 1921 |     }
 | 
|---|
 | 1922 | 
 | 
|---|
 | 1923 |     T_array operator()(Range r0, Range r1, Range r2, Range r3, Range r4,
 | 
|---|
 | 1924 |         Range r5, Range r6, Range r7)
 | 
|---|
 | 1925 |     {
 | 
|---|
 | 1926 |         return T_array(*this, r0, r1, r2, r3, r4, r5, r6, r7);
 | 
|---|
 | 1927 |     }
 | 
|---|
 | 1928 | 
 | 
|---|
 | 1929 |     T_array operator()(Range r0, Range r1, Range r2, Range r3, Range r4,
 | 
|---|
 | 1930 |         Range r5, Range r6, Range r7, Range r8)
 | 
|---|
 | 1931 |     {
 | 
|---|
 | 1932 |         return T_array(*this, r0, r1, r2, r3, r4, r5, r6, r7, r8);
 | 
|---|
 | 1933 |     }
 | 
|---|
 | 1934 | 
 | 
|---|
 | 1935 |     T_array operator()(Range r0, Range r1, Range r2, Range r3, Range r4,
 | 
|---|
 | 1936 |         Range r5, Range r6, Range r7, Range r8, Range r9)
 | 
|---|
 | 1937 |     {
 | 
|---|
 | 1938 |         return T_array(*this, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9);
 | 
|---|
 | 1939 |     }
 | 
|---|
 | 1940 | 
 | 
|---|
 | 1941 |     T_array operator()(Range r0, Range r1, Range r2, Range r3, Range r4,
 | 
|---|
 | 1942 |         Range r5, Range r6, Range r7, Range r8, Range r9, Range r10)
 | 
|---|
 | 1943 |     {
 | 
|---|
 | 1944 |         return T_array(*this, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10);
 | 
|---|
 | 1945 |     }
 | 
|---|
 | 1946 | 
 | 
|---|
 | 1947 |     // Allow any mixture of Range, int and Vector<int> objects as
 | 
|---|
 | 1948 |     // operands for operator():   A(Range(3,7), 5, Range(2,4))
 | 
|---|
 | 1949 | 
 | 
|---|
 | 1950 |     /*
 | 
|---|
 | 1951 |      * These versions of operator() allow any combination of int
 | 
|---|
 | 1952 |      * and Range operands to be used.  Each int operand reduces
 | 
|---|
 | 1953 |      * the rank of the resulting array by one.  
 | 
|---|
 | 1954 |      *
 | 
|---|
 | 1955 |      * e.g.  Array<int,4> A(20,20,20,20);
 | 
|---|
 | 1956 |      *       Array<int,2> B = A(Range(5,15), 3, 5, Range(8,9));
 | 
|---|
 | 1957 |      *
 | 
|---|
 | 1958 |      * SliceInfo is a helper class defined in <blitz/arrayslice.h>.
 | 
|---|
 | 1959 |      * It counts the number of Range vs. int arguments and does some
 | 
|---|
 | 1960 |      * other helpful things.
 | 
|---|
 | 1961 |      *
 | 
|---|
 | 1962 |      * Once partial specialization becomes widely implemented, these
 | 
|---|
 | 1963 |      * operators may be expanded to accept Vector<int> arguments
 | 
|---|
 | 1964 |      * and produce ArrayPick<T,N> objects.
 | 
|---|
 | 1965 |      *
 | 
|---|
 | 1966 |      * This operator() is not provided with a single argument because
 | 
|---|
 | 1967 |      * the appropriate cases exist above.
 | 
|---|
 | 1968 |      */
 | 
|---|
 | 1969 | 
 | 
|---|
 | 1970 | #ifdef BZ_PARTIAL_ORDERING
 | 
|---|
 | 1971 | 
 | 
|---|
 | 1972 |     template<class T1, class T2>
 | 
|---|
 | 1973 |     _bz_typename SliceInfo<T_numtype,T1,T2>::T_slice
 | 
|---|
 | 1974 |     operator()(T1 r1, T2 r2)
 | 
|---|
 | 1975 |     {
 | 
|---|
 | 1976 |         return SliceInfo<T_numtype,T1,T2>::T_slice(*this, r1, r2,
 | 
|---|
 | 1977 |             nilArraySection(), nilArraySection(), nilArraySection(),
 | 
|---|
 | 1978 |             nilArraySection(), nilArraySection(), nilArraySection(),
 | 
|---|
 | 1979 |             nilArraySection(), nilArraySection(), nilArraySection());
 | 
|---|
 | 1980 |     }
 | 
|---|
 | 1981 | 
 | 
|---|
 | 1982 |     template<class T1, class T2, class T3>
 | 
|---|
 | 1983 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3>::T_slice 
 | 
|---|
 | 1984 |     operator()(T1 r1, T2 r2, T3 r3)
 | 
|---|
 | 1985 |     {
 | 
|---|
 | 1986 |         return SliceInfo<T_numtype,T1,T2,T3>::T_slice(*this, r1, r2, r3,
 | 
|---|
 | 1987 |             nilArraySection(), nilArraySection(), nilArraySection(),
 | 
|---|
 | 1988 |             nilArraySection(), nilArraySection(), nilArraySection(),
 | 
|---|
 | 1989 |             nilArraySection(), nilArraySection());
 | 
|---|
 | 1990 |     }
 | 
|---|
 | 1991 | 
 | 
|---|
 | 1992 |     template<class T1, class T2, class T3, class T4>
 | 
|---|
 | 1993 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4>::T_slice
 | 
|---|
 | 1994 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4)
 | 
|---|
 | 1995 |     {
 | 
|---|
 | 1996 |         return SliceInfo<T_numtype,T1,T2,T3,T4>::T_slice(*this, r1, r2, r3,
 | 
|---|
 | 1997 |             r4, nilArraySection(), nilArraySection(),
 | 
|---|
 | 1998 |             nilArraySection(), nilArraySection(), nilArraySection(),
 | 
|---|
 | 1999 |             nilArraySection(), nilArraySection());
 | 
|---|
 | 2000 |     }
 | 
|---|
 | 2001 | 
 | 
|---|
 | 2002 |     template<class T1, class T2, class T3, class T4, class T5>
 | 
|---|
 | 2003 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4,T5>::T_slice
 | 
|---|
 | 2004 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5)
 | 
|---|
 | 2005 |     {
 | 
|---|
 | 2006 |         return SliceInfo<T_numtype,T1,T2,T3,T4,T5>::T_slice(*this, r1, r2, r3,
 | 
|---|
 | 2007 |             r4, r5, nilArraySection(),
 | 
|---|
 | 2008 |             nilArraySection(), nilArraySection(), nilArraySection(),
 | 
|---|
 | 2009 |             nilArraySection(), nilArraySection());
 | 
|---|
 | 2010 |     }
 | 
|---|
 | 2011 | 
 | 
|---|
 | 2012 |     template<class T1, class T2, class T3, class T4, class T5, class T6>
 | 
|---|
 | 2013 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6>::T_slice
 | 
|---|
 | 2014 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6)
 | 
|---|
 | 2015 |     {
 | 
|---|
 | 2016 |         return SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6>::T_slice(*this, r1, r2, 
 | 
|---|
 | 2017 |             r3, r4, r5, r6, 
 | 
|---|
 | 2018 |             nilArraySection(), nilArraySection(), nilArraySection(),
 | 
|---|
 | 2019 |             nilArraySection(), nilArraySection());
 | 
|---|
 | 2020 |     }
 | 
|---|
 | 2021 | 
 | 
|---|
 | 2022 |     template<class T1, class T2, class T3, class T4, class T5, class T6,
 | 
|---|
 | 2023 |         class T7>
 | 
|---|
 | 2024 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7>::T_slice
 | 
|---|
 | 2025 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7)
 | 
|---|
 | 2026 |     {
 | 
|---|
 | 2027 |         return SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7>::T_slice(*this, r1, 
 | 
|---|
 | 2028 |             r2, r3, r4, r5, r6, r7,
 | 
|---|
 | 2029 |             nilArraySection(), nilArraySection(),
 | 
|---|
 | 2030 |             nilArraySection(), nilArraySection());
 | 
|---|
 | 2031 |     }
 | 
|---|
 | 2032 | 
 | 
|---|
 | 2033 |     template<class T1, class T2, class T3, class T4, class T5, class T6,
 | 
|---|
 | 2034 |         class T7, class T8>
 | 
|---|
 | 2035 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8>::T_slice
 | 
|---|
 | 2036 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8)
 | 
|---|
 | 2037 |     {
 | 
|---|
 | 2038 |         return SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8>::T_slice(*this, 
 | 
|---|
 | 2039 |             r1, r2, r3, r4, r5, r6, r7, r8,
 | 
|---|
 | 2040 |             nilArraySection(), nilArraySection(), nilArraySection());
 | 
|---|
 | 2041 |     }
 | 
|---|
 | 2042 | 
 | 
|---|
 | 2043 |     template<class T1, class T2, class T3, class T4, class T5, class T6,
 | 
|---|
 | 2044 |         class T7, class T8, class T9>
 | 
|---|
 | 2045 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9>::T_slice
 | 
|---|
 | 2046 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8, 
 | 
|---|
 | 2047 |         T9 r9)
 | 
|---|
 | 2048 |     {
 | 
|---|
 | 2049 |         return SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9>::T_slice(*this, 
 | 
|---|
 | 2050 |             r1, r2, r3, r4, r5, r6, r7, r8, r9, 
 | 
|---|
 | 2051 |             nilArraySection(), nilArraySection());
 | 
|---|
 | 2052 |     }
 | 
|---|
 | 2053 | 
 | 
|---|
 | 2054 |     template<class T1, class T2, class T3, class T4, class T5, class T6,
 | 
|---|
 | 2055 |         class T7, class T8, class T9, class T10>
 | 
|---|
 | 2056 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>::T_slice
 | 
|---|
 | 2057 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8,
 | 
|---|
 | 2058 |         T9 r9, T10 r10)
 | 
|---|
 | 2059 |     {
 | 
|---|
 | 2060 |         return SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,
 | 
|---|
 | 2061 |             T10>::T_slice(*this, r1, r2, r3, r4, r5, r6, r7, r8, 
 | 
|---|
 | 2062 |             r9, r10, nilArraySection());
 | 
|---|
 | 2063 |     }
 | 
|---|
 | 2064 | 
 | 
|---|
 | 2065 |     template<class T1, class T2, class T3, class T4, class T5, class T6,
 | 
|---|
 | 2066 |         class T7, class T8, class T9, class T10, class T11>
 | 
|---|
 | 2067 |     _bz_typename SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,
 | 
|---|
 | 2068 |         T11>::T_slice
 | 
|---|
 | 2069 |     operator()(T1 r1, T2 r2, T3 r3, T4 r4, T5 r5, T6 r6, T7 r7, T8 r8,
 | 
|---|
 | 2070 |         T9 r9, T10 r10, T11 r11)
 | 
|---|
 | 2071 |     {
 | 
|---|
 | 2072 |         return SliceInfo<T_numtype,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,
 | 
|---|
 | 2073 |             T11>::T_slice(*this, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11);
 | 
|---|
 | 2074 |     }
 | 
|---|
 | 2075 | 
 | 
|---|
 | 2076 | #endif // BZ_PARTIAL_ORDERING
 | 
|---|
 | 2077 | 
 | 
|---|
 | 2078 |     /*
 | 
|---|
 | 2079 |      * These versions of operator() are provided to support tensor-style
 | 
|---|
 | 2080 |      * array notation, e.g.
 | 
|---|
 | 2081 |      *
 | 
|---|
 | 2082 |      * Array<float, 2> A, B;
 | 
|---|
 | 2083 |      * firstIndex i;
 | 
|---|
 | 2084 |      * secondIndex j;
 | 
|---|
 | 2085 |      * thirdIndex k;
 | 
|---|
 | 2086 |      * Array<float, 3> C = A(i,j) * B(j,k);
 | 
|---|
 | 2087 |      */
 | 
|---|
 | 2088 | 
 | 
|---|
 | 2089 |     template<int N0>
 | 
|---|
 | 2090 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0> >
 | 
|---|
 | 2091 |     operator()(IndexPlaceholder<N0>)
 | 
|---|
 | 2092 |     { 
 | 
|---|
 | 2093 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0> >(*this);
 | 
|---|
 | 2094 |     }
 | 
|---|
 | 2095 | 
 | 
|---|
 | 2096 |     template<int N0, int N1>
 | 
|---|
 | 2097 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1> >
 | 
|---|
 | 2098 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>)
 | 
|---|
 | 2099 |     {
 | 
|---|
 | 2100 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2101 |             N1> >(*this);
 | 
|---|
 | 2102 |     } 
 | 
|---|
 | 2103 | 
 | 
|---|
 | 2104 |     template<int N0, int N1, int N2>
 | 
|---|
 | 2105 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2> >
 | 
|---|
 | 2106 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2107 |         IndexPlaceholder<N2>)
 | 
|---|
 | 2108 |     {
 | 
|---|
 | 2109 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2110 |             N1, N2> >(*this);
 | 
|---|
 | 2111 |     }
 | 
|---|
 | 2112 | 
 | 
|---|
 | 2113 |     template<int N0, int N1, int N2, int N3>
 | 
|---|
 | 2114 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3> >
 | 
|---|
 | 2115 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2116 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>)
 | 
|---|
 | 2117 |     {
 | 
|---|
 | 2118 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2119 |             N1, N2, N3> >(*this);
 | 
|---|
 | 2120 |     }
 | 
|---|
 | 2121 | 
 | 
|---|
 | 2122 |     template<int N0, int N1, int N2, int N3, int N4>
 | 
|---|
 | 2123 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3, N4> >
 | 
|---|
 | 2124 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2125 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>, IndexPlaceholder<N4>)
 | 
|---|
 | 2126 |     {
 | 
|---|
 | 2127 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2128 |             N1, N2, N3, N4> >(*this);
 | 
|---|
 | 2129 |     }
 | 
|---|
 | 2130 | 
 | 
|---|
 | 2131 |     template<int N0, int N1, int N2, int N3, int N4, int N5>
 | 
|---|
 | 2132 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3, 
 | 
|---|
 | 2133 |         N4, N5> >
 | 
|---|
 | 2134 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2135 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>, IndexPlaceholder<N4>,
 | 
|---|
 | 2136 |         IndexPlaceholder<N5>)
 | 
|---|
 | 2137 |     {
 | 
|---|
 | 2138 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2139 |             N1, N2, N3, N4, N5> >(*this);
 | 
|---|
 | 2140 |     }
 | 
|---|
 | 2141 | 
 | 
|---|
 | 2142 |     template<int N0, int N1, int N2, int N3, int N4, int N5, int N6>
 | 
|---|
 | 2143 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
 | 
|---|
 | 2144 |         N4, N5, N6> >
 | 
|---|
 | 2145 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2146 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>, IndexPlaceholder<N4>,
 | 
|---|
 | 2147 |         IndexPlaceholder<N5>, IndexPlaceholder<N6>)
 | 
|---|
 | 2148 |     {
 | 
|---|
 | 2149 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2150 |             N1, N2, N3, N4, N5, N6> >(*this);
 | 
|---|
 | 2151 |     }
 | 
|---|
 | 2152 | 
 | 
|---|
 | 2153 |     template<int N0, int N1, int N2, int N3, int N4, int N5, int N6,
 | 
|---|
 | 2154 |         int N7>
 | 
|---|
 | 2155 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
 | 
|---|
 | 2156 |         N4, N5, N6, N7> >
 | 
|---|
 | 2157 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2158 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>, IndexPlaceholder<N4>,
 | 
|---|
 | 2159 |         IndexPlaceholder<N5>, IndexPlaceholder<N6>, IndexPlaceholder<N7>)
 | 
|---|
 | 2160 |     {
 | 
|---|
 | 2161 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2162 |             N1, N2, N3, N4, N5, N6, N7> >(*this);
 | 
|---|
 | 2163 |     }
 | 
|---|
 | 2164 | 
 | 
|---|
 | 2165 |     template<int N0, int N1, int N2, int N3, int N4, int N5, int N6,
 | 
|---|
 | 2166 |         int N7, int N8>
 | 
|---|
 | 2167 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
 | 
|---|
 | 2168 |         N4, N5, N6, N7, N8> >
 | 
|---|
 | 2169 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2170 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>, IndexPlaceholder<N4>,
 | 
|---|
 | 2171 |         IndexPlaceholder<N5>, IndexPlaceholder<N6>, IndexPlaceholder<N7>,
 | 
|---|
 | 2172 |         IndexPlaceholder<N8>)
 | 
|---|
 | 2173 |     {
 | 
|---|
 | 2174 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2175 |             N1, N2, N3, N4, N5, N6, N7, N8> >(*this);
 | 
|---|
 | 2176 |     }
 | 
|---|
 | 2177 | 
 | 
|---|
 | 2178 |     template<int N0, int N1, int N2, int N3, int N4, int N5, int N6,
 | 
|---|
 | 2179 |         int N7, int N8, int N9>
 | 
|---|
 | 2180 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
 | 
|---|
 | 2181 |         N4, N5, N6, N7, N8, N9> >
 | 
|---|
 | 2182 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2183 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>, IndexPlaceholder<N4>,
 | 
|---|
 | 2184 |         IndexPlaceholder<N5>, IndexPlaceholder<N6>, IndexPlaceholder<N7>,
 | 
|---|
 | 2185 |         IndexPlaceholder<N8>, IndexPlaceholder<N9>)
 | 
|---|
 | 2186 |     {
 | 
|---|
 | 2187 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2188 |             N1, N2, N3, N4, N5, N6, N7, N8, N9> >(*this);
 | 
|---|
 | 2189 |     }
 | 
|---|
 | 2190 | 
 | 
|---|
 | 2191 |     template<int N0, int N1, int N2, int N3, int N4, int N5, int N6,
 | 
|---|
 | 2192 |         int N7, int N8, int N9, int N10>
 | 
|---|
 | 2193 |     _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0, N1, N2, N3,
 | 
|---|
 | 2194 |         N4, N5, N6, N7, N8, N9, N10> >
 | 
|---|
 | 2195 |     operator()(IndexPlaceholder<N0>, IndexPlaceholder<N1>,
 | 
|---|
 | 2196 |         IndexPlaceholder<N2>, IndexPlaceholder<N3>, IndexPlaceholder<N4>,
 | 
|---|
 | 2197 |         IndexPlaceholder<N5>, IndexPlaceholder<N6>, IndexPlaceholder<N7>,
 | 
|---|
 | 2198 |         IndexPlaceholder<N8>, IndexPlaceholder<N9>, IndexPlaceholder<N10>)
 | 
|---|
 | 2199 |     {
 | 
|---|
 | 2200 |         return _bz_ArrayExpr<ArrayIndexMapping<T_numtype, N_rank, N0,
 | 
|---|
 | 2201 |             N1, N2, N3, N4, N5, N6, N7, N8, N9, N10> >(*this);
 | 
|---|
 | 2202 |     }
 | 
|---|
 | 2203 | 
 | 
|---|
 | 2204 |     //////////////////////////////////////////////
 | 
|---|
 | 2205 |     // Support for multicomponent arrays
 | 
|---|
 | 2206 |     //////////////////////////////////////////////
 | 
|---|
 | 2207 | 
 | 
|---|
 | 2208 |     /*
 | 
|---|
 | 2209 |      * See <blitz/array/multi.h> for an explanation of the traits class
 | 
|---|
 | 2210 |      * multicomponent_traits.
 | 
|---|
 | 2211 |      */
 | 
|---|
 | 2212 |     Array<_bz_typename multicomponent_traits<T_numtype>::T_element,N_rank>
 | 
|---|
 | 2213 |     operator[](int component)
 | 
|---|
 | 2214 |     {
 | 
|---|
 | 2215 |         typedef _bz_typename multicomponent_traits<T_numtype>::T_element 
 | 
|---|
 | 2216 |             T_compType;
 | 
|---|
 | 2217 | 
 | 
|---|
 | 2218 |         return extractComponent(T_compType(), 
 | 
|---|
 | 2219 |             component, multicomponent_traits<T_numtype>::numComponents);
 | 
|---|
 | 2220 |     }
 | 
|---|
 | 2221 | 
 | 
|---|
 | 2222 |     //////////////////////////////////////////////
 | 
|---|
 | 2223 |     // Indirection
 | 
|---|
 | 2224 |     //////////////////////////////////////////////
 | 
|---|
 | 2225 |   
 | 
|---|
 | 2226 |     template<class T_indexContainer>
 | 
|---|
 | 2227 |     IndirectArray<T_array, T_indexContainer>
 | 
|---|
 | 2228 |     operator[](const T_indexContainer& index)
 | 
|---|
 | 2229 |     {
 | 
|---|
 | 2230 |         return IndirectArray<T_array, T_indexContainer>(*this,
 | 
|---|
 | 2231 |             const_cast<T_indexContainer&>(index));
 | 
|---|
 | 2232 |     }
 | 
|---|
 | 2233 |  
 | 
|---|
 | 2234 |     //////////////////////////////////////////////
 | 
|---|
 | 2235 |     // Assignment Operators
 | 
|---|
 | 2236 |     //////////////////////////////////////////////
 | 
|---|
 | 2237 | 
 | 
|---|
 | 2238 |     // Scalar operand
 | 
|---|
 | 2239 |     // NEEDS_WORK : need a precondition check on
 | 
|---|
 | 2240 |     // isStorageContiguous when operator, is used.
 | 
|---|
 | 2241 |     ListInitializationSwitch<T_array> operator=(T_numtype x)
 | 
|---|
 | 2242 |     {
 | 
|---|
 | 2243 |         return ListInitializationSwitch<T_array>(*this, x);
 | 
|---|
 | 2244 |     }
 | 
|---|
 | 2245 | 
 | 
|---|
 | 2246 |     T_array& initialize(T_numtype);
 | 
|---|
 | 2247 | 
 | 
|---|
 | 2248 |     // Was:
 | 
|---|
 | 2249 |     // T_array& operator=(T_numtype);
 | 
|---|
 | 2250 | 
 | 
|---|
 | 2251 |     T_array& operator+=(T_numtype);
 | 
|---|
 | 2252 |     T_array& operator-=(T_numtype);
 | 
|---|
 | 2253 |     T_array& operator*=(T_numtype);
 | 
|---|
 | 2254 |     T_array& operator/=(T_numtype);
 | 
|---|
 | 2255 |     T_array& operator%=(T_numtype);
 | 
|---|
 | 2256 |     T_array& operator^=(T_numtype);
 | 
|---|
 | 2257 |     T_array& operator&=(T_numtype);
 | 
|---|
 | 2258 |     T_array& operator|=(T_numtype);
 | 
|---|
 | 2259 |     T_array& operator>>=(T_numtype);
 | 
|---|
 | 2260 |     T_array& operator<<=(T_numtype);
 | 
|---|
 | 2261 | 
 | 
|---|
 | 2262 |     // Array operands
 | 
|---|
 | 2263 |     T_array& operator=(const Array<T_numtype,N_rank>&);
 | 
|---|
 | 2264 | 
 | 
|---|
 | 2265 |     template<class T_numtype2> 
 | 
|---|
 | 2266 |     T_array& operator=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2267 |     template<class T_numtype2>
 | 
|---|
 | 2268 |     T_array& operator+=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2269 |     template<class T_numtype2>
 | 
|---|
 | 2270 |     T_array& operator-=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2271 |     template<class T_numtype2>
 | 
|---|
 | 2272 |     T_array& operator*=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2273 |     template<class T_numtype2>
 | 
|---|
 | 2274 |     T_array& operator/=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2275 |     template<class T_numtype2>
 | 
|---|
 | 2276 |     T_array& operator%=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2277 |     template<class T_numtype2>
 | 
|---|
 | 2278 |     T_array& operator^=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2279 |     template<class T_numtype2>
 | 
|---|
 | 2280 |     T_array& operator&=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2281 |     template<class T_numtype2>
 | 
|---|
 | 2282 |     T_array& operator|=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2283 |     template<class T_numtype2>
 | 
|---|
 | 2284 |     T_array& operator>>=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2285 |     template<class T_numtype2>
 | 
|---|
 | 2286 |     T_array& operator<<=(const Array<T_numtype2,N_rank>&);
 | 
|---|
 | 2287 | 
 | 
|---|
 | 2288 |     // Array expression operands
 | 
|---|
 | 2289 |     template<class T_expr>
 | 
|---|
 | 2290 |     inline T_array& operator=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2291 |     template<class T_expr>
 | 
|---|
 | 2292 |     inline T_array& operator+=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2293 |     template<class T_expr>
 | 
|---|
 | 2294 |     inline T_array& operator-=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2295 |     template<class T_expr>
 | 
|---|
 | 2296 |     inline T_array& operator*=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2297 |     template<class T_expr>
 | 
|---|
 | 2298 |     inline T_array& operator/=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2299 |     template<class T_expr>
 | 
|---|
 | 2300 |     inline T_array& operator%=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2301 |     template<class T_expr>
 | 
|---|
 | 2302 |     inline T_array& operator^=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2303 |     template<class T_expr>
 | 
|---|
 | 2304 |     inline T_array& operator&=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2305 |     template<class T_expr>
 | 
|---|
 | 2306 |     inline T_array& operator|=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2307 |     template<class T_expr>
 | 
|---|
 | 2308 |     inline T_array& operator>>=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2309 |     template<class T_expr>
 | 
|---|
 | 2310 |     inline T_array& operator<<=(_bz_ArrayExpr<T_expr> expr);
 | 
|---|
 | 2311 | 
 | 
|---|
 | 2312 |     // NEEDS_WORK -- Index placeholder operand
 | 
|---|
 | 2313 | 
 | 
|---|
 | 2314 |     // NEEDS_WORK -- Random operand
 | 
|---|
 | 2315 | 
 | 
|---|
 | 2316 | 
 | 
|---|
 | 2317 | public:
 | 
|---|
 | 2318 |     // Undocumented implementation routines
 | 
|---|
 | 2319 | 
 | 
|---|
 | 2320 |     template<class T_expr, class T_update>
 | 
|---|
 | 2321 |     inline T_array& evaluate(_bz_ArrayExpr<T_expr> expr,
 | 
|---|
 | 2322 |         T_update);
 | 
|---|
 | 2323 | 
 | 
|---|
 | 2324 | #ifdef BZ_HAVE_STD
 | 
|---|
 | 2325 |     template<class T_expr, class T_update>
 | 
|---|
 | 2326 |     inline T_array& evaluateWithFastTraversal(
 | 
|---|
 | 2327 |         const TraversalOrder<N_rank - 1>& order, _bz_ArrayExpr<T_expr> expr,
 | 
|---|
 | 2328 |         T_update);
 | 
|---|
 | 2329 | #endif
 | 
|---|
 | 2330 | 
 | 
|---|
 | 2331 | #ifdef BZ_ARRAY_2D_STENCIL_TILING
 | 
|---|
 | 2332 |     template<class T_expr, class T_update>
 | 
|---|
 | 2333 |     inline T_array& evaluateWithTiled2DTraversal(_bz_ArrayExpr<T_expr> expr,
 | 
|---|
 | 2334 |         T_update);
 | 
|---|
 | 2335 | #endif
 | 
|---|
 | 2336 | 
 | 
|---|
 | 2337 |     template<class T_expr, class T_update>
 | 
|---|
 | 2338 |     inline T_array& evaluateWithIndexTraversal1(_bz_ArrayExpr<T_expr> expr,
 | 
|---|
 | 2339 |         T_update);
 | 
|---|
 | 2340 | 
 | 
|---|
 | 2341 |     template<class T_expr, class T_update>
 | 
|---|
 | 2342 |     inline T_array& evaluateWithIndexTraversalN(_bz_ArrayExpr<T_expr> expr,
 | 
|---|
 | 2343 |         T_update);
 | 
|---|
 | 2344 | 
 | 
|---|
 | 2345 |     template<class T_expr, class T_update>
 | 
|---|
 | 2346 |     inline T_array& evaluateWithStackTraversal1(_bz_ArrayExpr<T_expr> expr,
 | 
|---|
 | 2347 |         T_update);
 | 
|---|
 | 2348 | 
 | 
|---|
 | 2349 |     template<class T_expr, class T_update>
 | 
|---|
 | 2350 |     inline T_array& evaluateWithStackTraversalN(_bz_ArrayExpr<T_expr> expr,
 | 
|---|
 | 2351 |         T_update);
 | 
|---|
 | 2352 | 
 | 
|---|
 | 2353 |     T_numtype* _bz_restrict getInitializationIterator()
 | 
|---|
 | 2354 |     { return dataFirst(); }
 | 
|---|
 | 2355 | 
 | 
|---|
 | 2356 |     _bz_bool canCollapse(int outerRank, int innerRank) const
 | 
|---|
 | 2357 |     { 
 | 
|---|
 | 2358 | #ifdef BZ_DEBUG_TRAVERSE
 | 
|---|
 | 2359 |         BZ_DEBUG_MESSAGE("stride(" << innerRank << ")=" << stride(innerRank)
 | 
|---|
 | 2360 |           << ", extent()=" << extent(innerRank) << ", stride(outerRank)="
 | 
|---|
 | 2361 |           << stride(outerRank));
 | 
|---|
 | 2362 | #endif
 | 
|---|
 | 2363 |         return (stride(innerRank) * extent(innerRank) == stride(outerRank)); 
 | 
|---|
 | 2364 |     }
 | 
|---|
 | 2365 | 
 | 
|---|
 | 2366 | protected:
 | 
|---|
 | 2367 |     //////////////////////////////////////////////
 | 
|---|
 | 2368 |     // Implementation routines
 | 
|---|
 | 2369 |     //////////////////////////////////////////////
 | 
|---|
 | 2370 | 
 | 
|---|
 | 2371 |     _bz_inline2 void computeStrides();
 | 
|---|
 | 2372 |     _bz_inline2 void setupStorage(int rank);
 | 
|---|
 | 2373 |     void constructSubarray(Array<T_numtype, N_rank>& array, 
 | 
|---|
 | 2374 |         const RectDomain<N_rank>&);
 | 
|---|
 | 2375 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0);
 | 
|---|
 | 2376 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0, Range r1);
 | 
|---|
 | 2377 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2378 |         Range r1, Range r2);
 | 
|---|
 | 2379 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2380 |         Range r1, Range r2, Range r3);
 | 
|---|
 | 2381 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2382 |         Range r1, Range r2, Range r3, Range r4);
 | 
|---|
 | 2383 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2384 |         Range r1, Range r2, Range r3, Range r4, Range r5);
 | 
|---|
 | 2385 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2386 |         Range r1, Range r2, Range r3, Range r4, Range r5, Range r6);
 | 
|---|
 | 2387 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2388 |         Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
 | 
|---|
 | 2389 |         Range r7);
 | 
|---|
 | 2390 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2391 |         Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
 | 
|---|
 | 2392 |         Range r7, Range r8);
 | 
|---|
 | 2393 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2394 |         Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
 | 
|---|
 | 2395 |         Range r7, Range r8, Range r9);
 | 
|---|
 | 2396 |     void constructSubarray(Array<T_numtype, N_rank>& array, Range r0,
 | 
|---|
 | 2397 |         Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
 | 
|---|
 | 2398 |         Range r7, Range r8, Range r9, Range r10);
 | 
|---|
 | 2399 | 
 | 
|---|
 | 2400 |     void calculateZeroOffset();
 | 
|---|
 | 2401 | 
 | 
|---|
 | 2402 |     template<int N_rank2, class R0, class R1, class R2, class R3, class R4, 
 | 
|---|
 | 2403 |         class R5, class R6, class R7, class R8, class R9, class R10>
 | 
|---|
 | 2404 |     void constructSlice(Array<T_numtype, N_rank2>& array, R0 r0, R1 r1, R2 r2, 
 | 
|---|
 | 2405 |         R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10);
 | 
|---|
 | 2406 | 
 | 
|---|
 | 2407 |     template<int N_rank2>
 | 
|---|
 | 2408 |     void slice(int& setRank, Range r, Array<T_numtype,N_rank2>& array,
 | 
|---|
 | 2409 |         TinyVector<int,N_rank2>& rankMap, int sourceRank);
 | 
|---|
 | 2410 | 
 | 
|---|
 | 2411 |     template<int N_rank2>
 | 
|---|
 | 2412 |     void slice(int& setRank, int i, Array<T_numtype,N_rank2>& array,
 | 
|---|
 | 2413 |         TinyVector<int,N_rank2>& rankMap, int sourceRank);
 | 
|---|
 | 2414 | 
 | 
|---|
 | 2415 |     template<int N_rank2>
 | 
|---|
 | 2416 |     void slice(int& setRank, nilArraySection, Array<T_numtype,N_rank2>& array,
 | 
|---|
 | 2417 |         TinyVector<int,N_rank2>& rankMap, int sourceRank)
 | 
|---|
 | 2418 |     { }
 | 
|---|
 | 2419 | 
 | 
|---|
 | 2420 |     void doTranspose(int destRank, int sourceRank, T_array& array);
 | 
|---|
 | 2421 | 
 | 
|---|
 | 2422 | protected:
 | 
|---|
 | 2423 |     //////////////////////////////////////////////
 | 
|---|
 | 2424 |     // Data members
 | 
|---|
 | 2425 |     //////////////////////////////////////////////
 | 
|---|
 | 2426 | 
 | 
|---|
 | 2427 |     // NB: adding new data members may require changes to ctors, reference()
 | 
|---|
 | 2428 | 
 | 
|---|
 | 2429 |     /*
 | 
|---|
 | 2430 |      * For a description of the storage_ members, see the comments for class 
 | 
|---|
 | 2431 |      * GeneralArrayStorage<N_rank> above.
 | 
|---|
 | 2432 |      *
 | 
|---|
 | 2433 |      * length_[] contains the extent of each rank.  E.g. a 10x20x30 array
 | 
|---|
 | 2434 |      *           would have length_ = { 10, 20, 30}.
 | 
|---|
 | 2435 |      * stride_[] contains the stride to move to the next element along each
 | 
|---|
 | 2436 |      *           rank.
 | 
|---|
 | 2437 |      * zeroOffset_ is the distance from the first element in the array 
 | 
|---|
 | 2438 |      *           to the point (0,0,...,0).  If base_ is zero and all ranks are 
 | 
|---|
 | 2439 |      *           stored ascending, then zeroOffset_ is zero.  This value
 | 
|---|
 | 2440 |      *           is needed because to speed up indexing, the data_ member
 | 
|---|
 | 2441 |      *           (inherited from MemoryBlockReference) always refers to
 | 
|---|
 | 2442 |      *           (0,0,...,0).
 | 
|---|
 | 2443 |      * storageContiguous_ is true if all the elements in the array are
 | 
|---|
 | 2444 |      *           stored contiguously in memory.  If this is true, then
 | 
|---|
 | 2445 |      *           the array can be converted to a one-dimensional array.
 | 
|---|
 | 2446 |      *           If the array is sliced, then this becomes false.
 | 
|---|
 | 2447 |      */
 | 
|---|
 | 2448 |     GeneralArrayStorage<N_rank> storage_;
 | 
|---|
 | 2449 |     TinyVector<int, N_rank> length_;
 | 
|---|
 | 2450 |     TinyVector<int, N_rank> stride_;
 | 
|---|
 | 2451 |     int zeroOffset_;
 | 
|---|
 | 2452 |     _bz_bool storageContiguous_;
 | 
|---|
 | 2453 | };
 | 
|---|
 | 2454 | 
 | 
|---|
 | 2455 | /*
 | 
|---|
 | 2456 |  * Rank numbers start with zero, which may be confusing to users coming
 | 
|---|
 | 2457 |  * from Fortran.  To make code more readable, the following constants
 | 
|---|
 | 2458 |  * may help.  Example: instead of
 | 
|---|
 | 2459 |  * 
 | 
|---|
 | 2460 |  * int firstRankExtent = A.extent(0);
 | 
|---|
 | 2461 |  *
 | 
|---|
 | 2462 |  * One can write:
 | 
|---|
 | 2463 |  *
 | 
|---|
 | 2464 |  * int firstRankExtent = A.extent(firstRank);
 | 
|---|
 | 2465 |  */
 | 
|---|
 | 2466 | 
 | 
|---|
 | 2467 | const int firstRank    = 0;
 | 
|---|
 | 2468 | const int secondRank   = 1;
 | 
|---|
 | 2469 | const int thirdRank    = 2;
 | 
|---|
 | 2470 | const int fourthRank   = 3;
 | 
|---|
 | 2471 | const int fifthRank    = 4;
 | 
|---|
 | 2472 | const int sixthRank    = 5;
 | 
|---|
 | 2473 | const int seventhRank  = 6;
 | 
|---|
 | 2474 | const int eighthRank   = 7;
 | 
|---|
 | 2475 | const int ninthRank    = 8;
 | 
|---|
 | 2476 | const int tenthRank    = 9;
 | 
|---|
 | 2477 | const int eleventhRank = 10;
 | 
|---|
 | 2478 | 
 | 
|---|
 | 2479 | const int firstDim    = 0;
 | 
|---|
 | 2480 | const int secondDim   = 1;
 | 
|---|
 | 2481 | const int thirdDim    = 2;
 | 
|---|
 | 2482 | const int fourthDim   = 3;
 | 
|---|
 | 2483 | const int fifthDim    = 4;
 | 
|---|
 | 2484 | const int sixthDim    = 5;
 | 
|---|
 | 2485 | const int seventhDim  = 6;
 | 
|---|
 | 2486 | const int eighthDim   = 7;
 | 
|---|
 | 2487 | const int ninthDim    = 8;
 | 
|---|
 | 2488 | const int tenthDim    = 9;
 | 
|---|
 | 2489 | const int eleventhDim = 10;
 | 
|---|
 | 2490 | 
 | 
|---|
 | 2491 | /*
 | 
|---|
 | 2492 |  * Global Functions
 | 
|---|
 | 2493 |  */
 | 
|---|
 | 2494 | 
 | 
|---|
 | 2495 | template<class T_numtype>
 | 
|---|
 | 2496 | ostream& operator<<(ostream&, const Array<T_numtype,1>&);
 | 
|---|
 | 2497 | 
 | 
|---|
 | 2498 | template<class T_numtype>
 | 
|---|
 | 2499 | ostream& operator<<(ostream&, const Array<T_numtype,2>&);
 | 
|---|
 | 2500 | 
 | 
|---|
 | 2501 | // NEEDS_WORK -- output formatting for N > 2?
 | 
|---|
 | 2502 | 
 | 
|---|
 | 2503 | BZ_NAMESPACE_END
 | 
|---|
 | 2504 | 
 | 
|---|
 | 2505 | /*
 | 
|---|
 | 2506 |  * Include implementations of the member functions and some additional
 | 
|---|
 | 2507 |  * global functions.
 | 
|---|
 | 2508 |  */
 | 
|---|
 | 2509 | 
 | 
|---|
 | 2510 | #include <blitz/array/iter.h>       // Array iterators
 | 
|---|
 | 2511 | #include <blitz/array/expr.h>       // Array expression objects
 | 
|---|
 | 2512 | #include <blitz/array/methods.cc>   // Member functions
 | 
|---|
 | 2513 | #include <blitz/array/eval.cc>      // Array expression evaluation
 | 
|---|
 | 2514 | #include <blitz/array/ops.cc>       // Assignment operators
 | 
|---|
 | 2515 | #include <blitz/array/io.cc>        // Output formatting
 | 
|---|
 | 2516 | #include <blitz/array/bops.cc>      // Expression templates, two operands
 | 
|---|
 | 2517 | #include <blitz/array/uops.cc>      // Expression templates, math functions
 | 
|---|
 | 2518 | #include <blitz/array/misc.cc>      // Expression templates, miscellaneous
 | 
|---|
 | 2519 | #include <blitz/array/reduce.h>     // Array reduction expression templates
 | 
|---|
 | 2520 | #include <blitz/array/interlace.cc> // Allocation of interlaced arrays
 | 
|---|
 | 2521 | #include <blitz/array/resize.cc>    // Array resize, resizeAndPreserve
 | 
|---|
 | 2522 | #include <blitz/array/slicing.cc>   // Slicing and subarrays
 | 
|---|
 | 2523 | #include <blitz/array/cycle.cc>     // Cycling arrays
 | 
|---|
 | 2524 | #include <blitz/array/complex.cc>   // Special support for complex arrays
 | 
|---|
 | 2525 | #include <blitz/array/zip.h>        // Zipping multicomponent types
 | 
|---|
 | 2526 | #include <blitz/array/where.h>      // where(X,Y,Z)
 | 
|---|
 | 2527 | #include <blitz/array/stencil.h>    // Stencil objects
 | 
|---|
 | 2528 | #include <blitz/array/indirect.h>   // Indirection
 | 
|---|
 | 2529 | 
 | 
|---|
 | 2530 | #endif // BZ_ARRAY_H
 | 
|---|
 | 2531 | 
 | 
|---|