19 m_data =
new float[(
size_t) (rows*cols)];
20 memset(m_data, 0,
sizeof(
float) * (
size_t) (rows * cols));
23 Matrix(
const Matrix &s) : m_rows(s.m_rows), m_cols(s.m_cols) {
25 m_data =
new float[(
size_t) (m_rows * m_cols)];
26 memcpy(m_data, s.m_data,
sizeof(
float) * (
size_t) (m_rows * m_cols));
29 Matrix(Matrix &&s) : m_rows(s.m_rows), m_cols(s.m_cols), m_data(s.m_data) {
41 Matrix &operator=(
const Matrix &s) {
46 m_data =
new float[(
size_t) (m_rows * m_cols)];
47 memcpy(m_data, s.m_data,
sizeof(
float) * (
size_t) (m_rows * m_cols));
51 Matrix &operator=(Matrix &&s) {
55 m_rows = s.m_rows; m_cols = s.m_cols; m_data = s.m_data;
56 s.m_rows = 0; s.m_cols = 0; s.m_data =
nullptr;
62 return m_data[(
size_t) (i*m_cols + j)];
66 return m_data[(
size_t) (i*m_cols + j)];
69 float *
data() {
return m_data; }
71 ssize_t rows()
const {
return m_rows; }
72 ssize_t cols()
const {
return m_cols; }
79 .def(py::init<ssize_t, ssize_t>())
84 throw std::runtime_error(
"Incompatible buffer format!");
86 auto v =
new Matrix(info.
shape[0], info.
shape[1]);
87 memcpy(v->data(), info.
ptr,
sizeof(float) * (
size_t) (v->rows() * v->cols()));
91 .
def(
"rows", &Matrix::rows)
92 .
def(
"cols", &Matrix::cols)
95 .
def(
"__getitem__", [](
const Matrix &m, std::pair<ssize_t, ssize_t>
i) {
96 if (i.first >= m.rows() || i.second >= m.cols())
98 return m(i.first, i.second);
100 .def(
"__setitem__", [](Matrix &m, std::pair<ssize_t, ssize_t> i,
float v) {
101 if (i.first >= m.rows() || i.second >= m.cols())
103 m(i.first, i.second) = v;
109 { m.rows(), m.cols() },
110 {
sizeof(float) *
size_t(m.cols()),
118 class SquareMatrix :
public Matrix {
120 SquareMatrix(
ssize_t n) : Matrix(n, n) { }
124 .def(py::init<ssize_t>());
145 std::unique_ptr<int32_t>
value;
148 int32_t get_value()
const {
return *
value; }
149 void set_value(int32_t v) { *value = v; }
156 ConstBuffer() :
value(
new int32_t{0}) { };
160 .def_property(
"value", &ConstBuffer::get_value, &ConstBuffer::set_value)
163 struct DerivedBuffer :
public Buffer { };
167 .def_buffer(&DerivedBuffer::get_buffer_info);
void print_destroyed(T *inst, Values &&...values)
class_ & def_buffer(Func &&func)
void print_copy_assigned(T *inst, Values &&...values)
void print_copy_created(T *inst, Values &&...values)
auto format(const std::locale &loc, const CharT *fmt, const Streamable &tp) -> decltype(to_stream(std::declval< std::basic_ostream< CharT > &>(), fmt, tp), std::basic_string< CharT >
arr data(const arr &a, Ix... index)
Information record describing a Python buffer object.
std::vector< ssize_t > shape
detail::initimpl::constructor< Args... > init()
Binds an existing constructor taking arguments Args...
void print_move_assigned(T *inst, Values &&...values)
Annotation which enables the buffer protocol for a type.
test_initializer buffers("buffers", test_submodule_buffers)
void print_created(T *inst, Values &&...values)
void print_move_created(T *inst, Values &&...values)
#define TEST_SUBMODULE(name, variable)
bool typename Extra class_ & def(const char *name_, Func &&f, const Extra &... extra)
auto to_string(T &&value) -> decltype(std::forward< T >(value))
Convert an object to a string (directly forward if this can become a string)