13    template<
unsigned int N>
 
   17template<
unsigned int N>
 
   18class idol::Dim : 
public std::array<unsigned int, N> {
 
   19    friend class Dim<N+1>;
 
   21    explicit Dim(std::array<unsigned int, N> t_dims) : std::array<unsigned int, N>(std::move(t_dims)) {}
 
   22    template<
class ...ArgsT> 
explicit Dim(ArgsT&& ...t_args) : std::array<unsigned int, N>({ (
unsigned int) t_args... }) {
 
   23        static_assert(
sizeof...(ArgsT) == N);
 
 
   29    template<
class T, 
unsigned int N>
 
   31        using type = std::vector<
typename Vector<T, N - 1>::type>;
 
   42    template<
class T, 
unsigned int N = 1> 
using Vector = 
typename impl::Vector<T, N>::type;
 
   45    template<
class T, 
unsigned int Size>
 
   46    unsigned int n_entries(
const Vector<T, Size> &t_vector) {
 
   48        if constexpr (Size == 1) {
 
   50            return t_vector.size();
 
   54            unsigned int result = 0;
 
   55            for (
const auto &vec: t_vector) {
 
   56                result += n_entries<T, Size - 1>(vec);
 
   64    template<
class T, 
unsigned int Size>
 
   65    void append(std::vector<T> &t_dest, 
const Vector<T, Size> &t_vector) {
 
   66        if constexpr (Size == 1) {
 
   68            for (
const T &elem: t_vector) {
 
   69                t_dest.emplace_back(elem);
 
   74            for (
const auto &vec: t_vector) {
 
   81    template<
class T, 
unsigned int Size>
 
   82    std::vector<T> flatten(
const Vector<T, Size> &t_vector) {
 
   84        if constexpr (Size == 1) {
 
   90            std::vector<T> result;
 
   91            result.reserve(n_entries<T, Size>(t_vector));
 
   93            for (
const auto &vec: t_vector) {
 
   94                append<T, Size - 1>(result, vec);
 
  101    template<
class T, 
unsigned int Size>
 
  102    void apply(Vector<T, Size> &t_vec, 
const std::function<
void(T &)> &t_function) {
 
  104        if constexpr (Size == 1) {
 
  106            for (
auto &elem: t_vec) {
 
  112            for (
auto &elem: t_vec) {
 
  113                apply<T, Size - 1>(elem, t_function);
 
  121    template<
class T, 
unsigned int Size>
 
  122    void apply(
const Vector<T, Size> &t_vec, 
const std::function<
void(
const T &)> &t_function) {
 
  124        if constexpr (Size == 1) {
 
  126            for (
const auto &elem: t_vec) {
 
  132            for (
const auto &elem: t_vec) {
 
  133                apply<T, Size - 1>(elem, t_function);
 
  140    template<
class T, 
class U, 
unsigned int Size>
 
  141    Vector<U, Size> transform(
const Vector<T, Size> &t_vec, 
const std::function<U(
const T &)> &t_function) {
 
  143        Vector<U, Size> result;
 
  144        result.reserve(t_vec.size());
 
  146        if constexpr (Size == 1) {
 
  148            for (
const auto &elem: t_vec) {
 
  149                result.emplace_back(t_function(elem));
 
  154            for (
const auto &elem: t_vec) {
 
  155                result.emplace_back(transform<T, U, Size - 1>(elem, t_function));