Example #1
0
void inplace_partial_permute(UntypedArray& x, RawArray<const int> perm, Array<char>& work, const int block) {
  const int m = perm.size();
  const int b_size = block*x.t_size();
  GEODE_ASSERT(x.size()==block*m);
  const int space = m ? (perm.max()+1)*b_size : 0;
  work.resize(space);
  for (int i=0;i<m;i++) {
    const int pi = perm[i];
    if (pi >= 0)
      memcpy(work.data()+pi*b_size,x.data()+i*b_size,b_size);
  }
  x.resize(space/x.t_size());
  memcpy(x.data(),work.data(),space);
}