mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-29 00:06:44 -04:00
express: Support pickling PointerToArray objects
This commit is contained in:
parent
52b4df4aec
commit
b2462c1d8c
@ -117,6 +117,8 @@ PUBLISHED:
|
||||
INLINE size_t count(const Element &) const;
|
||||
|
||||
#ifdef HAVE_PYTHON
|
||||
EXTENSION(PyObject *__reduce__(PyObject *self) const);
|
||||
|
||||
EXTENSION(int __getbuffer__(PyObject *self, Py_buffer *view, int flags));
|
||||
EXTENSION(void __releasebuffer__(PyObject *self, Py_buffer *view) const);
|
||||
#endif
|
||||
@ -273,6 +275,8 @@ PUBLISHED:
|
||||
INLINE size_t count(const Element &) const;
|
||||
|
||||
#ifdef HAVE_PYTHON
|
||||
EXTENSION(PyObject *__reduce__(PyObject *self) const);
|
||||
|
||||
EXTENSION(int __getbuffer__(PyObject *self, Py_buffer *view, int flags) const);
|
||||
EXTENSION(void __releasebuffer__(PyObject *self, Py_buffer *view) const);
|
||||
#endif
|
||||
|
@ -259,6 +259,25 @@ get_subdata(size_t n, size_t count) const {
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements pickle support.
|
||||
*/
|
||||
template<class Element>
|
||||
INLINE PyObject *Extension<PointerToArray<Element> >::
|
||||
__reduce__(PyObject *self) const {
|
||||
// This preserves the distinction between a null vs. an empty PTA, though I'm
|
||||
// not sure that this distinction matters to anyone.
|
||||
if (this->_this->is_null()) {
|
||||
return Py_BuildValue("O()", Py_TYPE(self));
|
||||
}
|
||||
else if (this->_this->empty()) {
|
||||
return Py_BuildValue("O(())", Py_TYPE(self));
|
||||
}
|
||||
else {
|
||||
return Py_BuildValue("O(N)", Py_TYPE(self), get_data());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as get_element(), this returns the nth element of the array.
|
||||
*/
|
||||
@ -304,6 +323,15 @@ get_subdata(size_t n, size_t count) const {
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements pickle support.
|
||||
*/
|
||||
template<class Element>
|
||||
INLINE PyObject *Extension<ConstPointerToArray<Element> >::
|
||||
__reduce__(PyObject *self) const {
|
||||
return Py_BuildValue("O(N)", Py_TYPE(self), get_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used to implement the buffer protocol, in order to allow efficient
|
||||
* access to the array data through a Python multiview object.
|
||||
|
@ -40,6 +40,8 @@ public:
|
||||
INLINE void set_data(PyObject *data);
|
||||
INLINE PyObject *get_subdata(size_t n, size_t count) const;
|
||||
|
||||
INLINE PyObject *__reduce__(PyObject *self) const;
|
||||
|
||||
INLINE int __getbuffer__(PyObject *self, Py_buffer *view, int flags);
|
||||
INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const;
|
||||
};
|
||||
@ -75,6 +77,8 @@ public:
|
||||
INLINE PyObject *get_data() const;
|
||||
INLINE PyObject *get_subdata(size_t n, size_t count) const;
|
||||
|
||||
INLINE PyObject *__reduce__(PyObject *self) const;
|
||||
|
||||
INLINE int __getbuffer__(PyObject *self, Py_buffer *view, int flags) const;
|
||||
INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const;
|
||||
};
|
||||
|
23
tests/express/test_pointertoarray.py
Normal file
23
tests/express/test_pointertoarray.py
Normal file
@ -0,0 +1,23 @@
|
||||
def test_pta_float_pickle():
|
||||
from panda3d.core import PTA_float
|
||||
from direct.stdpy.pickle import dumps, loads, HIGHEST_PROTOCOL
|
||||
|
||||
null_pta = PTA_float()
|
||||
|
||||
empty_pta = PTA_float([])
|
||||
|
||||
data_pta = PTA_float([1.0, 2.0, 3.0])
|
||||
data = data_pta.get_data()
|
||||
|
||||
for proto in range(1, HIGHEST_PROTOCOL + 1):
|
||||
null_pta2 = loads(dumps(null_pta, proto))
|
||||
assert null_pta2.is_null()
|
||||
assert len(null_pta2) == 0
|
||||
|
||||
empty_pta2 = loads(dumps(empty_pta, proto))
|
||||
assert not empty_pta2.is_null()
|
||||
assert len(empty_pta2) == 0
|
||||
|
||||
data_pta2 = loads(dumps(data_pta, proto))
|
||||
assert tuple(data_pta2) == (1.0, 2.0, 3.0)
|
||||
assert data_pta2.get_data() == data_pta.get_data()
|
Loading…
x
Reference in New Issue
Block a user