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).