PyLucene 3.4.0-1 import
[pylucene.git] / jcc / jcc / sources / JObject.cpp
1 /*
2  *   Licensed under the Apache License, Version 2.0 (the "License");
3  *   you may not use this file except in compliance with the License.
4  *   You may obtain a copy of the License at
5  *
6  *       http://www.apache.org/licenses/LICENSE-2.0
7  *
8  *   Unless required by applicable law or agreed to in writing, software
9  *   distributed under the License is distributed on an "AS IS" BASIS,
10  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  *   See the License for the specific language governing permissions and
12  *   limitations under the License.
13  */
14
15 #include <jni.h>
16 #include "JCCEnv.h"
17
18 #ifdef PYTHON
19
20 #include <Python.h>
21 #include "structmember.h"
22
23 #include "JObject.h"
24 #include "macros.h"
25
26
27 /* JObject */
28
29 static void t_JObject_dealloc(t_JObject *self);
30 static PyObject *t_JObject_new(PyTypeObject *type,
31                                PyObject *args, PyObject *kwds);
32
33 static PyObject *t_JObject_richcmp(t_JObject *, PyObject *o2, int op);
34 static PyObject *t_JObject_str(t_JObject *self);
35 static PyObject *t_JObject_repr(t_JObject *self);
36 static int t_JObject_hash(t_JObject *self);
37 static PyObject *t_JObject__getJObject(t_JObject *self, void *data);
38
39 static PyMemberDef t_JObject_members[] = {
40     { NULL, 0, 0, 0, NULL }
41 };
42
43 static PyMethodDef t_JObject_methods[] = {
44     { NULL, NULL, 0, NULL }
45 };
46
47 static PyGetSetDef t_JObject_properties[] = {
48     { "_jobject", (getter) t_JObject__getJObject, NULL, NULL, NULL },
49     { NULL, NULL, NULL, NULL, NULL }
50 };
51
52 PyTypeObject PY_TYPE(JObject) = {
53     PyObject_HEAD_INIT(NULL)
54     0,                                   /* ob_size */
55     "jcc.JObject",                       /* tp_name */
56     sizeof(t_JObject),                   /* tp_basicsize */
57     0,                                   /* tp_itemsize */
58     (destructor)t_JObject_dealloc,       /* tp_dealloc */
59     0,                                   /* tp_print */
60     0,                                   /* tp_getattr */
61     0,                                   /* tp_setattr */
62     0,                                   /* tp_compare */
63     (reprfunc)t_JObject_repr,            /* tp_repr */
64     0,                                   /* tp_as_number */
65     0,                                   /* tp_as_sequence */
66     0,                                   /* tp_as_mapping */
67     (hashfunc)t_JObject_hash,            /* tp_hash  */
68     0,                                   /* tp_call */
69     (reprfunc)t_JObject_str,             /* tp_str */
70     0,                                   /* tp_getattro */
71     0,                                   /* tp_setattro */
72     0,                                   /* tp_as_buffer */
73     (Py_TPFLAGS_DEFAULT |
74      Py_TPFLAGS_BASETYPE),               /* tp_flags */
75     "t_JObject objects",                 /* tp_doc */
76     0,                                   /* tp_traverse */
77     0,                                   /* tp_clear */
78     (richcmpfunc)t_JObject_richcmp,      /* tp_richcompare */
79     0,                                   /* tp_weaklistoffset */
80     0,                                   /* tp_iter */
81     0,                                   /* tp_iternext */
82     t_JObject_methods,                   /* tp_methods */
83     t_JObject_members,                   /* tp_members */
84     t_JObject_properties,                /* tp_getset */
85     0,                                   /* tp_base */
86     0,                                   /* tp_dict */
87     0,                                   /* tp_descr_get */
88     0,                                   /* tp_descr_set */
89     0,                                   /* tp_dictoffset */
90     0,                                   /* tp_init */
91     0,                                   /* tp_alloc */
92     (newfunc)t_JObject_new,              /* tp_new */
93 };
94
95
96 static void t_JObject_dealloc(t_JObject *self)
97 {
98     self->object = JObject(NULL);
99     self->ob_type->tp_free((PyObject *) self);
100 }
101
102 static PyObject *t_JObject_new(PyTypeObject *type,
103                                PyObject *args, PyObject *kwds)
104 {
105     t_JObject *self = (t_JObject *) type->tp_alloc(type, 0);
106
107     self->object = JObject(NULL);
108
109     return (PyObject *) self;
110 }
111
112 static PyObject *t_JObject_richcmp(t_JObject *self, PyObject *arg, int op)
113 {
114     int b = 0;
115
116     switch (op) {
117       case Py_EQ:
118       case Py_NE:
119         if (PyObject_TypeCheck(arg, &PY_TYPE(JObject)))
120             b = self->object == ((t_JObject *) arg)->object;
121         if (op == Py_EQ)
122             Py_RETURN_BOOL(b);
123         Py_RETURN_BOOL(!b);
124       case Py_LT:
125         PyErr_SetString(PyExc_NotImplementedError, "<");
126         return NULL;
127       case Py_LE:
128         PyErr_SetString(PyExc_NotImplementedError, "<=");
129         return NULL;
130       case Py_GT:
131         PyErr_SetString(PyExc_NotImplementedError, ">");
132         return NULL;
133       case Py_GE:
134         PyErr_SetString(PyExc_NotImplementedError, ">=");
135         return NULL;
136     }
137
138     return NULL;
139 }
140
141 static PyObject *t_JObject_str(t_JObject *self)
142 {
143     if (self->object.this$)
144     {
145         char *utf = env->toString(self->object.this$);
146
147         if (utf == NULL)
148             utf = env->getClassName(self->object.this$);
149
150         if (utf != NULL)
151         {
152             PyObject *unicode =
153                 PyUnicode_DecodeUTF8(utf, strlen(utf), "strict");
154
155             delete utf;
156             return unicode;
157         }
158     }
159
160     return PyString_FromString("<null>");
161 }
162
163 static PyObject *t_JObject_repr(t_JObject *self)
164 {
165     PyObject *name = PyObject_GetAttrString((PyObject *) self->ob_type,
166                                             "__name__");
167     PyObject *str = self->ob_type->tp_str((PyObject *) self);
168 #if PY_VERSION_HEX < 0x02040000
169     PyObject *args = Py_BuildValue("(OO)", name, str);
170 #else
171     PyObject *args = PyTuple_Pack(2, name, str);
172 #endif
173     PyObject *format = PyString_FromString("<%s: %s>");
174     PyObject *repr = PyString_Format(format, args);
175
176     Py_DECREF(name);
177     Py_DECREF(str);
178     Py_DECREF(args);
179     Py_DECREF(format);
180
181     return repr;
182 }
183
184 static int t_JObject_hash(t_JObject *self)
185 {
186     return env->hash(self->object.this$);
187 }
188
189 static PyObject *t_JObject__getJObject(t_JObject *self, void *data)
190 {
191     return PyCObject_FromVoidPtr((void *) self->object.this$, NULL);
192 }
193
194 #endif /* PYTHON */