triple_obj.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #ifndef _PY_TRIPLE_OBJ_H
  2. #define _PY_TRIPLE_OBJ_H
  3. #define PY_SSIZE_T_CLEAN
  4. #include <Python.h>
  5. #include <structmember.h>
  6. #include "triple.h"
  7. #include "term_obj.h"
  8. typedef struct {
  9. PyObject_HEAD
  10. LSUP_Triple * ob_struct;
  11. TermObject *s;
  12. TermObject *p;
  13. TermObject *o;
  14. } TripleObject;
  15. static int
  16. Triple_init (TripleObject *self, PyObject *args)
  17. {
  18. TermObject *s = NULL, *p = NULL, *o = NULL, *tmp;
  19. if (! PyArg_ParseTuple (
  20. /*
  21. args, "O!O!O!", &s, &TermType,
  22. &p, &TermType, &o, &TermType))
  23. */
  24. args, "OOO", &s, &p, &o))
  25. return -1;
  26. // TODO check for null s, p, o
  27. if (
  28. PyObject_TypeCheck (s, &TermType) ||
  29. PyObject_TypeCheck (p, &TermType) ||
  30. PyObject_TypeCheck (o, &TermType)
  31. ) return -1;
  32. tmp = self->s;
  33. Py_INCREF(s);
  34. self->s = s;
  35. Py_XDECREF(tmp);
  36. tmp = self->p;
  37. Py_INCREF(p);
  38. self->p = p;
  39. Py_XDECREF(tmp);
  40. tmp = self->o;
  41. Py_INCREF(o);
  42. self->o = o;
  43. Py_XDECREF(tmp);
  44. self->ob_struct = LSUP_triple_new (
  45. s->ob_struct, p->ob_struct, o->ob_struct);
  46. if (!self->ob_struct) {
  47. PyErr_SetString (PyExc_ValueError, "Could not create triple.");
  48. return -1;
  49. }
  50. return 0;
  51. }
  52. static void
  53. Triple_dealloc (TripleObject *self)
  54. {
  55. Py_XDECREF(self->s);
  56. Py_XDECREF(self->p);
  57. Py_XDECREF(self->o);
  58. free (self->ob_struct); // Term pointers were allocated independently.
  59. Py_TYPE (self)->tp_free ((PyObject *) self);
  60. }
  61. static PyMemberDef Triple_members[] = {
  62. {"s", T_OBJECT_EX, offsetof(TripleObject, s), 0, "Triple subject,"},
  63. {"p", T_OBJECT_EX, offsetof(TripleObject, p), 0, "Triple predicate."},
  64. {"o", T_OBJECT_EX, offsetof(TripleObject, o), 0, "Triple object."},
  65. {NULL}
  66. };
  67. static PyObject *
  68. Triple_richcmp (PyObject *obj1, PyObject *obj2, int op);
  69. PyTypeObject TripleType = {
  70. PyVarObject_HEAD_INIT(NULL, 0)
  71. .tp_name = "triple.Triple",
  72. .tp_doc = "RDF triple",
  73. .tp_basicsize = sizeof(TripleObject),
  74. .tp_itemsize = 0,
  75. .tp_flags = Py_TPFLAGS_DEFAULT,
  76. .tp_new = PyType_GenericNew,
  77. .tp_init = (initproc) Triple_init,
  78. .tp_dealloc = (destructor) Triple_dealloc,
  79. .tp_members = Triple_members,
  80. .tp_richcompare = Triple_richcmp,
  81. };
  82. static PyObject *
  83. Triple_richcmp (PyObject *obj1, PyObject *obj2, int op)
  84. {
  85. PyObject *result = NULL;
  86. if (
  87. ! PyObject_TypeCheck (obj1, &TripleType) ||
  88. ! PyObject_TypeCheck (obj2, &TripleType)
  89. ) return NULL;
  90. int c = 0;
  91. LSUP_Triple *t1 = ((TripleObject *) obj1)->ob_struct;
  92. LSUP_Triple *t2 = ((TripleObject *) obj2)->ob_struct;
  93. switch (op) {
  94. case Py_LT: result = Py_NotImplemented; break;
  95. case Py_LE: result = Py_NotImplemented; break;
  96. case Py_EQ: c = (
  97. LSUP_term_equals (t1->s, t2->s) &&
  98. LSUP_term_equals (t1->p, t2->p) &&
  99. LSUP_term_equals (t1->o, t2->o)); break;
  100. case Py_NE: c = (!
  101. LSUP_term_equals (t1->s, t2->s) &&
  102. LSUP_term_equals (t1->p, t2->p) &&
  103. LSUP_term_equals (t1->o, t2->o)); break;
  104. case Py_GT: result = Py_NotImplemented; break;
  105. case Py_GE: result = Py_NotImplemented; break;
  106. }
  107. if (!result) result = c ? Py_True : Py_False;
  108. Py_INCREF(result);
  109. return result;
  110. }
  111. #endif