12template <s
size_t Ndim>
using Shape = std::array<ssize_t, Ndim>;
16 if (shape.size() != Ndim)
17 throw std::runtime_error(
"Shape size mismatch");
19 std::copy_n(shape.begin(), Ndim, arr.begin());
23template <s
size_t Dim = 0,
typename Str
ides> ssize_t
element_offset(
const Strides &) {
return 0; }
25template <ssize_t Dim = 0,
typename Strides,
typename... Ix>
27 return i * strides[Dim] + element_offset<Dim + 1>(strides, index...);
30template <s
size_t Ndim> std::array<ssize_t, Ndim>
c_strides(
const std::array<ssize_t, Ndim> &shape) {
31 std::array<ssize_t, Ndim> strides;
32 std::fill(strides.begin(), strides.end(), 1);
33 for (ssize_t i = Ndim - 1; i > 0; --i) {
34 strides[i - 1] = strides[i] * shape[i];
39template <s
size_t Ndim> std::array<ssize_t, Ndim>
make_array(
const std::vector<ssize_t> &vec) {
40 assert(vec.size() == Ndim);
41 std::array<ssize_t, Ndim> arr;
42 std::copy_n(vec.begin(), Ndim, arr.begin());
46template <
typename T, s
size_t Ndim = 2>
class NDView {
54 size_ = std::accumulate(std::begin(
shape), std::end(
shape), 1, std::multiplies<ssize_t>());
61 size_ = std::accumulate(std::begin(
shape), std::end(
shape), 1, std::multiplies<ssize_t>());
64 template <
typename... Ix>
typename std::enable_if<
sizeof...(Ix) == Ndim, T &>::type
operator()(Ix... index) {
68 template <
typename... Ix>
typename std::enable_if<
sizeof...(Ix) == Ndim, T &>::type
operator()(Ix... index)
const {
85 for (ssize_t i = 0; i !=
size_; ++i) {
100 for (
auto it =
begin(); it !=
end(); ++it)
124 for (ssize_t i = 0; i !=
size_; ++i) {
130 for (ssize_t i = 0; i !=
size_; ++i) {
137template class NDView<uint16_t, 2>;
T & operator()(ssize_t i)
Definition NDView.hpp:79
ssize_t size() const
Definition NDView.hpp:72
NDView & operator+=(const T val)
Definition NDView.hpp:92
NDView(const NDView &)=default
NDView & operator-=(const T val)
Definition NDView.hpp:93
NDView & operator=(const NDView &other)
Definition NDView.hpp:105
std::array< ssize_t, Ndim > shape_
Definition NDView.hpp:120
T * data()
Definition NDView.hpp:115
auto & shape()
Definition NDView.hpp:112
NDView(T *buffer, std::array< ssize_t, Ndim > shape)
Definition NDView.hpp:50
std::array< ssize_t, Ndim > strides_
Definition NDView.hpp:119
NDView()
Definition NDView.hpp:48
bool operator==(const NDView &other) const
Definition NDView.hpp:82
NDView & operator/=(const T val)
Definition NDView.hpp:95
NDView(T *buffer, const std::vector< ssize_t > &shape)
Definition NDView.hpp:57
NDView & operator*=(const T val)
Definition NDView.hpp:94
ssize_t size_
Definition NDView.hpp:121
NDView & operator/=(const NDView &other)
Definition NDView.hpp:97
NDView & operator=(const T val)
Definition NDView.hpp:99
T * end()
Definition NDView.hpp:78
NDView & elemenwise(T val, BinaryOperation op)
Definition NDView.hpp:123
T * buffer_
Definition NDView.hpp:118
NDView(NDView &&)=default
T & operator[](ssize_t i)
Definition NDView.hpp:80
NDView & elemenwise(const NDView &other, BinaryOperation op)
Definition NDView.hpp:129
auto shape(ssize_t i) const
Definition NDView.hpp:113
T * begin()
Definition NDView.hpp:77
Frame class to represent a single frame of data model class should be able to work with streams comin...
Definition CircularFifo.hpp:11
std::array< ssize_t, Ndim > make_array(const std::vector< ssize_t > &vec)
Definition NDView.hpp:39
std::array< ssize_t, Ndim > Shape
Definition NDView.hpp:12
Shape< Ndim > make_shape(const std::vector< size_t > &shape)
Definition NDView.hpp:15
ssize_t element_offset(const Strides &)
Definition NDView.hpp:23
std::array< ssize_t, Ndim > c_strides(const std::array< ssize_t, Ndim > &shape)
Definition NDView.hpp:30