51 template<
typename... Args>
NDArray(
const size_t idx, Args... args) :
NDArray({idx,
static_cast<size_t>(args)...}) {}
52 template<
typename... Args>
NDArray(
const int& idx, Args... args) :
NDArray({idx,
static_cast<int>(args)...}) {}
84 data_ = std::move(other.data_);
85 shape_ = std::move(other.shape_);
116 template<
typename... Args>
T&
at(
const size_t idx, Args... args) {
return data_[
index(idx, args...)]; }
117 template<
typename... Args>
const T&
at(
const size_t idx, Args... args)
const {
return data_[
index(idx, args...)]; }
126 template<
typename... Args>
const T&
operator()(
const size_t idx, Args... args)
const {
return data_[
index(idx, args...)]; }
148 size_t size(
const size_t& dim)
const {
return shape_.at(dim); }
155 template<
typename... Args>
161 std::vector<int64_t> dims = {args...};
164 size_t count = std::count_if(dims.begin(), dims.end(), [](
size_t i) { return i == -1; });
170 for (
size_t i = 0; i < dims.size(); ++i)
177 size_t idx = std::find(dims.begin(), dims.end(), -1) - dims.begin();
181 size_t size = std::accumulate(dims.begin(), dims.end(), 1, std::multiplies<size_t>());
185 std::copy(dims.begin(), dims.end(),
shape_.begin());
207 template<
typename... Args>
208 size_t index(
const size_t idx, Args... args)
const
210 assert(
sizeof...(args) ==
shape_.size() - 1);
211 size_t indices[] = {idx,
static_cast<size_t>(args)...};
213 for (
size_t i = 0; i <
shape_.size(); ++i)
215 index += indices[i] * std::accumulate(
shape_.begin() + i + 1,
shape_.end(), 1, std::multiplies<size_t>());
under the restriction of C++11, a simple alternative to std::vector<T> + std::mdspan....
Definition ndarray.h:31
const T & front() const
Definition ndarray.h:129
const T & operator()(const size_t idx, Args... args) const
Definition ndarray.h:126
NDArray(const NDArray &other)
Definition ndarray.h:54
NDArray(const int &idx, Args... args)
Definition ndarray.h:52
NDArray()=delete
Construct a new NDArray object.
T & front()
Definition ndarray.h:128
T * data()
Definition ndarray.h:134
std::vector< T > data_
Definition ndarray.h:223
T * end()
Definition ndarray.h:140
NDArray(std::initializer_list< size_t > il)
Definition ndarray.h:48
NDArray(std::initializer_list< int > il)
Definition ndarray.h:49
std::vector< size_t > shape_
Definition ndarray.h:221
T & operator()(const size_t idx, Args... args)
[] operator
Definition ndarray.h:125
bool operator!=(const NDArray &other) const
!= operator
Definition ndarray.h:105
const T & back() const
Definition ndarray.h:132
NDArray & operator=(NDArray &&other)
= operator, move assignment
Definition ndarray.h:80
size_t index(const size_t idx, Args... args) const
SFINAE (Substitution Failure Is Not An Error) to_tensor function, only if T is int,...
Definition ndarray.h:208
T & back()
Definition ndarray.h:131
const T * cend() const
Definition ndarray.h:142
T * begin()
Definition ndarray.h:139
bool empty() const
Definition ndarray.h:150
const T & at(const size_t idx, Args... args) const
Definition ndarray.h:117
void reshape(Args... args)
Definition ndarray.h:156
const std::vector< size_t > & shape() const
Definition ndarray.h:153
NDArray(const size_t idx, Args... args)
Definition ndarray.h:51
size_t size() const
Definition ndarray.h:147
NDArray & operator=(const NDArray &other)
= operator, copy assignment
Definition ndarray.h:68
NDArray(NDArray &&other)
Definition ndarray.h:56
const T * cbegin() const
Definition ndarray.h:141
const T * data() const
Definition ndarray.h:135
bool operator==(const NDArray &other) const
== operator
Definition ndarray.h:97
~NDArray()
Definition ndarray.h:59
T & at(const size_t idx, Args... args)
at function
Definition ndarray.h:116
size_t size(const size_t &dim) const
Definition ndarray.h:148
#define T
Definition exp.cpp:237