Tatooine
non_owning_multidim_array.h
Go to the documentation of this file.
1#ifndef TATOOINE_NON_OWNING_MULTIDIM_ARRAY_H
2#define TATOOINE_NON_OWNING_MULTIDIM_ARRAY_H
3//==============================================================================
4#include <tatooine/concepts.h>
5//==============================================================================
6namespace tatooine {
7//==============================================================================
8template <typename T, typename IndexOrder = x_fastest>
10 //============================================================================
11 // typedefs
12 //============================================================================
13 public:
14 using value_type = T;
23 //============================================================================
24 // members
25 //============================================================================
26 T const* m_data;
27 //============================================================================
28 // ctors
29 //============================================================================
30 public:
32 //----------------------------------------------------------------------------
34 -> non_owning_multidim_array& = default;
35 //----------------------------------------------------------------------------
37 //----------------------------------------------------------------------------
38 template <typename OtherIndexing>
41 if (parent_type::operator!=(other)) {
42 parent_type::resize(other.size());
43 }
45 return *this;
46 }
47 //============================================================================
48 explicit non_owning_multidim_array(T const* data, integral auto const... size)
49 : parent_type{size...}, m_data(std::move(data)) {
50 }
51 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
52 template <unsigned_integral UInt>
53 non_owning_multidim_array(T const* data, std::vector<UInt> const& size)
54 : parent_type{size}, m_data(std::move(data)) {
55 }
56 //============================================================================
57 // methods
58 //============================================================================
59 auto at(integral auto const... is) const -> auto const& {
60 assert(sizeof...(is) == num_dimensions());
61 assert(in_range(is...));
62 return m_data[plain_index(is...)];
63 }
64 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65 auto at(range auto const& indices) const -> auto const& {
66 using Indices = std::decay_t<decltype(indices)>;
67 static_assert(is_integral<typename Indices::value_type>,
68 "index range must hold integral type");
69 assert(indices.size() == num_dimensions());
70 assert(in_range(indices));
71 return m_data[plain_index(indices)];
72 }
73 //------------------------------------------------------------------------------
74 auto operator()(integral auto const... is) const -> auto const& {
75 assert(sizeof...(is) == num_dimensions());
76#ifndef NDEBUG
77 if (!in_range(is...)) {
78 std::cerr << "will now crash because indices [ ";
79 ((std::cerr << is << ' '), ...);
80 std::cerr << "] are not in range\n";
81 }
82#endif
83 assert(in_range(is...));
84 return at(is...);
85 }
86 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
87 auto operator()(range auto const& indices) const -> auto const& {
88 using Indices = std::decay_t<decltype(indices)>;
89 static_assert(is_integral<typename Indices::value_type>,
90 "index range must hold integral type");
91 assert(indices.size() == num_dimensions());
92 assert(in_range(indices));
93 return at(indices);
94 }
95 //----------------------------------------------------------------------------
96 auto operator[](size_t i) const -> auto const& { return m_data[i]; }
97 auto operator[](size_t i) -> auto& { return m_data[i]; }
98 //----------------------------------------------------------------------------
99 constexpr auto data() const -> auto { return m_data; }
100 //----------------------------------------------------------------------------
101 auto change_data(T const* new_data) { m_data = new_data; }
102};
103//==============================================================================
104} // namespace tatooine
105//==============================================================================
106#endif
Definition: dynamic_multidim_size.h:16
auto constexpr in_range(integral auto const ... indices) const
Definition: dynamic_multidim_size.h:130
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
auto resize(integral auto const ... size) -> void
Definition: dynamic_multidim_size.h:116
auto num_components() const
Definition: dynamic_multidim_size.h:111
auto operator=(dynamic_multidim_size const &other) -> dynamic_multidim_size &=default
Definition: netcdf.h:348
Definition: non_owning_multidim_array.h:9
auto operator[](size_t i) const -> auto const &
Definition: non_owning_multidim_array.h:96
non_owning_multidim_array(non_owning_multidim_array const &other)=default
auto operator=(non_owning_multidim_array const &other) -> non_owning_multidim_array &=default
auto operator[](size_t i) -> auto &
Definition: non_owning_multidim_array.h:97
auto operator()(integral auto const ... is) const -> auto const &
Definition: non_owning_multidim_array.h:74
auto operator=(non_owning_multidim_array< T, OtherIndexing > const &other) -> non_owning_multidim_array &
Definition: non_owning_multidim_array.h:39
auto constexpr plain_index(integral auto const ... indices) const
Definition: dynamic_multidim_size.h:149
auto constexpr in_range(integral auto const ... indices) const
Definition: dynamic_multidim_size.h:130
non_owning_multidim_array(T const *data, integral auto const ... size)
Definition: non_owning_multidim_array.h:48
auto at(integral auto const ... is) const -> auto const &
Definition: non_owning_multidim_array.h:59
T value_type
Definition: non_owning_multidim_array.h:14
T const * m_data
Definition: non_owning_multidim_array.h:26
auto indices() const
Definition: dynamic_multidim_size.h:236
constexpr auto data() const -> auto
Definition: non_owning_multidim_array.h:99
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
auto at(range auto const &indices) const -> auto const &
Definition: non_owning_multidim_array.h:65
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
non_owning_multidim_array(T const *data, std::vector< UInt > const &size)
Definition: non_owning_multidim_array.h:53
auto change_data(T const *new_data)
Definition: non_owning_multidim_array.h:101
auto operator()(range auto const &indices) const -> auto const &
Definition: non_owning_multidim_array.h:87
Definition: concepts.h:21
Definition: concepts.h:84
Definition: algorithm.h:6
constexpr auto plain_index() const -> auto const &
Definition: vertex_handle.h:37
An empty struct that holds types.
Definition: type_list.h:248