#pragma once #include "Sequence.hip.hpp" #include "functional.hip.hpp" template struct Array { using Type = Array; static constexpr index_t nSize = NSize; index_t mData[nSize]; template __host__ __device__ Array(Xs... xs) : mData{static_cast(xs)...} { } __host__ __device__ const TData& operator[](index_t i) const { return mData[i]; } __host__ __device__ TData& operator[](index_t i) { return mData[i]; } }; template __host__ __device__ auto reorder_array_given_new2old(const Array& old_array, Sequence new2old) { Array new_array; static_assert(NSize == sizeof...(IRs), "NSize not consistent"); static_for<0, NSize, 1>{}([&](auto IDim) { constexpr index_t idim = IDim.Get(); new_array[idim] = old_array[new2old.Get(IDim)]; }); return new_array; } template __host__ __device__ auto reorder_array_given_old2new(const Array& old_array, Sequence old2new) { Array new_array; static_assert(NSize == sizeof...(IRs), "NSize not consistent"); static_for<0, NSize, 1>{}([&](auto IDim) { constexpr index_t idim = IDim.Get(); new_array[old2new.Get(IDim)] = old_array[idim]; }); return new_array; }