5#include "slideio/base/exceptions.hpp"
14 template <std::
size_t N = 3>
18 typedef std::array<int, N> Coordinates;
19 typedef std::array<int, N> Sizes;
20 typedef std::array<int, N> Increments;
21 typedef std::array<std::string, N> Labels;
22 Dimensions() =
default;
23 Dimensions(
const Labels& labels,
const Sizes& dimensionSizes,
const Increments& increments) {
24 init(labels, dimensionSizes, increments);
26 void init(
const Labels& labels,
const Sizes& dimensionSizes,
const Increments& increments) {
28 m_sizes = dimensionSizes;
29 m_increments = increments;
30 m_dimensionMap.clear();
31 for (std::size_t i = 0; i < N; ++i) {
32 m_dimensionMap[m_order[i]] =
static_cast<int>(i);
34 for (
int i = 0; i < N; ++i) {
35 if (m_sizes[i] <= 0) {
36 RAISE_RUNTIME_ERROR <<
"Dimensions::init: dimension size must be greater than zero";
40 bool incrementCoordinates(Coordinates& coordinates)
const {
41 for (std::size_t i = 0; i < N; ++i) {
42 int coord = coordinates[i] + m_increments[i];
43 if (coord < m_sizes[i]) {
44 coordinates[i] = coord;
51 Coordinates createCoordinates(
const std::list<std::pair<std::string, int>>& coordList)
const {
52 Coordinates coordinates = {0};
53 for (
const auto& dim : coordList) {
54 auto it = m_dimensionMap.find(dim.first);
55 if (it == m_dimensionMap.end()) {
56 RAISE_RUNTIME_ERROR <<
"Dimensions::createCoordinates: dimension: " << dim.first
57 <<
" not found in dimension map";
59 coordinates[it->second] = dim.second;
64 const Labels& getOrder()
const {
return m_order; }
65 const Sizes& getSizes()
const {
return m_sizes; }
66 const Increments& getIncrements()
const {
return m_increments; }
68 int getDimensionSize(
const std::string& label)
const {
69 auto it = m_dimensionMap.find(label);
70 if (it == m_dimensionMap.end()) {
71 RAISE_RUNTIME_ERROR <<
"Dimensions::getDimensionSize: dimension: " << label
72 <<
" not found in dimension map";
74 return m_sizes[it->second];
77 int getDimensionIndex(
const std::string& label)
const {
78 auto it = m_dimensionMap.find(label);
79 if (it == m_dimensionMap.end()) {
80 RAISE_RUNTIME_ERROR <<
"Dimensions::getDimensionIndex: dimension: " << label
81 <<
" not found in dimension map";
86 int getNumDimensions()
const {
return N; }
88 static bool areCoordsEqual(
const Coordinates& lhs,
const Coordinates& rhs) {
89 for (std::size_t i = 0; i < N; ++i) {
90 if (lhs[i] != rhs[i]) {
97 static bool areCoordsLess(
const Coordinates& lhs,
const Coordinates& rhs) {
98 for (std::size_t i = N; i-- > 0;) {
99 if (lhs[i] < rhs[i]) {
101 }
else if (lhs[i] > rhs[i]) {
108 static bool areCoordsGreater(
const Coordinates& lhs,
const Coordinates& rhs) {
109 return areCoordsLess(rhs, lhs);
115 Increments m_increments;
116 std::map<std::string, int> m_dimensionMap;
Definition: exceptions.hpp:15