|
|
@@ -357,5 +357,45 @@ __ceil__(PyObject *self) const {
|
|
|
return py_vec;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+INLINE_LINMATH int Extension<FLOATNAME(LVecBase2)>::
|
|
|
+__getbuffer__(PyObject *self, Py_buffer *view, int flags) const {
|
|
|
+ if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) {
|
|
|
+ PyErr_SetString(PyExc_BufferError,
|
|
|
+ "Object is not writable.");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ static const char format[2] = {FLOATTOKEN, 0};
|
|
|
+ static const Py_ssize_t shape = FLOATNAME(LVecBase2)::num_components;
|
|
|
+
|
|
|
+ Py_INCREF(self);
|
|
|
+
|
|
|
+ view->buf = (void *)_this->get_data();
|
|
|
+ view->obj = self;
|
|
|
+ view->len = 2 * sizeof(FLOATTYPE);
|
|
|
+ view->readonly = 1;
|
|
|
+ view->itemsize = sizeof(FLOATTYPE);
|
|
|
+ view->format = nullptr;
|
|
|
+ if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
|
|
|
+ view->format = (char *)format;
|
|
|
+ }
|
|
|
+ view->ndim = 1;
|
|
|
+ view->shape = nullptr;
|
|
|
+ if ((flags & PyBUF_ND) == PyBUF_ND) {
|
|
|
+ view->shape = (Py_ssize_t *)&shape;
|
|
|
+ }
|
|
|
+ view->strides = nullptr;
|
|
|
+ if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) {
|
|
|
+ view->strides = &view->itemsize;
|
|
|
+ }
|
|
|
+ view->suboffsets = nullptr;
|
|
|
+ view->internal = nullptr;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#undef PYNUMBER_FLOATTYPE
|
|
|
#undef PY_AS_FLOATTYPE
|