Advertisement
Guest User

Untitled

a guest
Jul 5th, 2012
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.85 KB | None | 0 0
  1. #include <Python.h>
  2.  
  3. typedef struct
  4. {
  5.     PyObject_HEAD;
  6.     double data[3];
  7. } vector3d;
  8.  
  9. static PyObject* vector3d_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
  10. {
  11.     vector3d* self;
  12.     self = (vector3d*)type->tp_alloc(type, 0);
  13.  
  14.     self->data[0]=0;
  15.     self->data[1]=0;
  16.     self->data[2]=0;
  17.  
  18.     return (PyObject*) self;
  19. }
  20.  
  21. static PyObject* vector3d_get_item(PyObject* self, Py_ssize_t i)
  22. {
  23.     return (PyObject*) PyFloat_FromDouble(((vector3d*)self)->data[i]);
  24. }
  25.  
  26. static int vector3d_set_item(PyObject* self, Py_ssize_t i, PyObject *v)
  27. {
  28.     ((vector3d*) self)->data[i] = PyFloat_AsDouble(v);
  29.  
  30.     return 0;
  31. }
  32.  
  33. static int vector3d_getbuffer(PyObject *exporter, Py_buffer *view, int flags)
  34. {
  35.     static Py_ssize_t shape[1] = {3};
  36.     static Py_ssize_t stride[1] = {sizeof(double)};
  37.  
  38.     vector3d* self = (vector3d*) exporter;
  39.  
  40.     view->buf = self->data;
  41.     view->len = shape[0]*stride[0];
  42.     view->itemsize = stride[0];
  43.     view->readonly = 0;
  44.     view->format="d\0";
  45.     view->ndim = 1;
  46.     view->shape = shape;
  47.     view->strides = stride;
  48.     view->suboffsets = NULL;
  49.     view->internal = NULL;
  50.  
  51.     view->obj=(PyObject*) self;
  52.     Py_INCREF(self);
  53.     return 0;
  54. }
  55.  
  56. static PySequenceMethods seq_methods = {
  57.     0,          /* length */
  58.     0,          /* concat */
  59.     0,          /* repeat */
  60.     vector3d_get_item,      /* [i] */
  61.     0,          /* slice */
  62.     vector3d_set_item,      /* [i] = v */
  63.     0,          /* del */
  64.     0,          /* set slice */
  65.     0,          /* del slice */
  66.     0,          /* count */
  67. };
  68.  
  69. static PyBufferProcs buf_procs = {
  70.     0,
  71.     0,
  72.     0,
  73.     0,
  74.     vector3d_getbuffer,
  75.     0,
  76. };
  77.  
  78. static PyTypeObject vector3d_type = {
  79.     PyObject_HEAD_INIT(NULL)
  80.     0,                         /*ob_size*/
  81.     "spam.vector3d",           /*tp_name*/
  82.     sizeof(vector3d),          /*tp_basicsize*/
  83.     0,                         /*tp_itemsize*/
  84.     0,                 /*tp_dealloc*/
  85.     0,                         /*tp_print*/
  86.     0,                         /*tp_getattr*/
  87.     0,                         /*tp_setattr*/
  88.     0,                         /*tp_compare*/
  89.     0,                         /*tp_repr*/
  90.     0,                         /*tp_as_number*/
  91.     &seq_methods,              /*tp_as_sequence*/
  92.     0,                         /*tp_as_mapping*/
  93.     0,                         /*tp_hash */
  94.     0,                         /*tp_call*/
  95.     0,                         /*tp_str*/
  96.     0,                         /*tp_getattro*/
  97.     0,                         /*tp_setattro*/
  98.     &buf_procs,                /*tp_as_buffer*/
  99.     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /*tp_flags*/
  100.     "3 dimensional vectors",   /* tp_doc */
  101.     0,                     /* tp_traverse */
  102.     0,                     /* tp_clear */
  103.     0,                     /* tp_richcompare */
  104.     0,                     /* tp_weaklistoffset */
  105.     0,                     /* tp_iter */
  106.     0,                     /* tp_iternext */
  107.     0,                     /* tp_methods */
  108.     0,                     /* tp_members */
  109.     0,                         /* tp_getset */
  110.     0,                         /* tp_base */
  111.     0,                         /* tp_dict */
  112.     0,                         /* tp_descr_get */
  113.     0,                         /* tp_descr_set */
  114.     0,                         /* tp_dictoffset */
  115.     0,                 /* tp_init */
  116.     0,                         /* tp_alloc */
  117.     vector3d_new,              /* tp_new */
  118. };
  119.  
  120. static PyMethodDef spam_methods[] = { {NULL} /* Sentinel */ };
  121.  
  122. #ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
  123. #define PyMODINIT_FUNC void
  124. #endif
  125. PyMODINIT_FUNC initspam(void)
  126. {
  127.     PyObject* m;
  128.  
  129.     vector3d_type.tp_new = PyType_GenericNew;
  130.     if (PyType_Ready(&vector3d_type) < 0)
  131.         return;
  132.  
  133.     m = Py_InitModule3("spam", spam_methods,
  134.                        "Example module that creates an extension type.");
  135.  
  136.     Py_INCREF(&vector3d_type);
  137.     PyModule_AddObject(m, "vector3d", (PyObject *)&vector3d_type);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement