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