Next: Indirection Cartesian product, Up: Indirection [Contents][Index]
The simplest kind of indirection uses a list of points. For one-dimensional arrays, you can just use an STL container of integers. Example:
Array<int,1> A(5), B(5); A = 0; B = 1, 2, 3, 4, 5; vector<int> I; I.push_back(2); I.push_back(4); I.push_back(1); A[I] = B;
After this code, the array A contains [ 0 2 3 0 5 ]
.
Note that arrays on the right-hand-side of the assignment must have the same
shape as the array on the left-hand-side (before indirection). In the
statement A[I] = B
, A and B must have the same shape, not I and B.
For multidimensional arrays, you can use an STL container of
TinyVector<int,N_rank>
objects. Example:
Array<int,2> A(4,4), B(4,4); A = 0; B = 10*tensor::i + tensor::j; typedef TinyVector<int,2> coord; list<coord> I; I.push_back(coord(1,1)); I.push_back(coord(2,2)); A[I] = B;
After this code, the array A contains:
0 0 0 0 0 11 0 0 0 0 22 0 0 0 0 0
(The tensor::i
notation is explained in the section on index
placeholders Index placeholders).