Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Python.h>
- typedef struct
- {
- PyObject_HEAD;
- double data[3];
- } vector3d;
- static PyObject* vector3d_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
- {
- vector3d* self;
- self = (vector3d*)type->tp_alloc(type, 0);
- self->data[0]=0;
- self->data[1]=0;
- self->data[2]=0;
- return (PyObject*) self;
- }
- static PyObject* vector3d_get_item(PyObject* self, Py_ssize_t i)
- {
- return (PyObject*) PyFloat_FromDouble(((vector3d*)self)->data[i]);
- }
- static int vector3d_set_item(PyObject* self, Py_ssize_t i, PyObject *v)
- {
- ((vector3d*) self)->data[i] = PyFloat_AsDouble(v);
- return 0;
- }
- static int vector3d_getbuffer(PyObject *exporter, Py_buffer *view, int flags)
- {
- static Py_ssize_t shape[1] = {3};
- static Py_ssize_t stride[1] = {sizeof(double)};
- vector3d* self = (vector3d*) exporter;
- view->buf = self->data;
- view->len = shape[0]*stride[0];
- view->itemsize = stride[0];
- view->readonly = 0;
- view->format="d\0";
- view->ndim = 1;
- view->shape = shape;
- view->strides = stride;
- view->suboffsets = NULL;
- view->internal = NULL;
- view->obj=(PyObject*) self;
- Py_INCREF(self);
- return 0;
- }
- static PySequenceMethods seq_methods = {
- 0, /* length */
- 0, /* concat */
- 0, /* repeat */
- vector3d_get_item, /* [i] */
- 0, /* slice */
- vector3d_set_item, /* [i] = v */
- 0, /* del */
- 0, /* set slice */
- 0, /* del slice */
- 0, /* count */
- };
- static PyBufferProcs buf_procs = {
- 0,
- 0,
- 0,
- 0,
- vector3d_getbuffer,
- 0,
- };
- static PyTypeObject vector3d_type = {
- PyObject_HEAD_INIT(NULL)
- 0, /*ob_size*/
- "spam.vector3d", /*tp_name*/
- sizeof(vector3d), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- &seq_methods, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- &buf_procs, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- "3 dimensional vectors", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- vector3d_new, /* tp_new */
- };
- static PyMethodDef spam_methods[] = { {NULL} /* Sentinel */ };
- #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
- #define PyMODINIT_FUNC void
- #endif
- PyMODINIT_FUNC initspam(void)
- {
- PyObject* m;
- vector3d_type.tp_new = PyType_GenericNew;
- if (PyType_Ready(&vector3d_type) < 0)
- return;
- m = Py_InitModule3("spam", spam_methods,
- "Example module that creates an extension type.");
- Py_INCREF(&vector3d_type);
- PyModule_AddObject(m, "vector3d", (PyObject *)&vector3d_type);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement