Skip to content

Instantly share code, notes, and snippets.

@tforgione
Created June 20, 2017 13:06
Show Gist options
  • Save tforgione/20e8a12a6aa8292bdc4611d0550ad8c9 to your computer and use it in GitHub Desktop.
Save tforgione/20e8a12a6aa8292bdc4611d0550ad8c9 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
template<typename T>
class MultidimArray {
public:
MultidimArray(std::initializer_list<std::size_t> sizes) : sizes{sizes}, data(
std::accumulate(std::begin(sizes), std::end(sizes), static_cast<std::size_t>(1), [](std::size_t i, std::size_t j) { return i * j; })
) {
}
template<typename... Types>
T& operator()(Types... indices) {
return(*this)({static_cast<std::size_t>(indices)...});
}
T& operator()(std::initializer_list<std::size_t> params) {
auto begin = std::begin(params);
std::size_t ret = *begin;
++begin;
std::size_t current_index = 0;
for (auto it = begin; it != std::end(params); ++it) {
ret = ret * sizes[++current_index] + *it;
}
return data[ret];
}
std::vector<std::size_t> sizes;
std::vector<T> data;
};
int main(int argc, char *argv[])
{
// A simple 2x2 matrix
MultidimArray<double> array{4,3,2};
for (std::size_t i = 0; i < 4*3*2; i++) {
array.data[i] = static_cast<double>(i);
}
std::cout
<< array(0,0,0) << " "
<< array(0,0,1) << " "
<< array(0,1,0) << " "
<< array(0,1,1) << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment