ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
variables.cpp
Go to the documentation of this file.
1/* @authors 11/2023 :: ICON Community Interface <comin@icon-model.org>
2
3 SPDX-License-Identifier: BSD-3-Clause
4
5 Please see the file LICENSE in the root of the source tree for this code.
6 Where software is supplied by third parties, it is indicated in the
7 headers of the routines. */
8
9#define PY_SSIZE_T_CLEAN
10#include <Python.h>
11
12#include <iostream>
13#include <limits>
14#include <stdexcept>
15#include <string>
16#include <vector>
17
18#include "comin.h"
19
20#include "exception.h"
21#include "util.h"
22#include "variables.h"
23
24namespace comin::python {
25using namespace std::string_literals;
26
35static PyObject* var_request_add(PyObject* /*self*/, PyObject* args,
36 PyObject* kwargs) {
37 t_comin_var_descriptor var_descr;
38 static char const* kwlist[] = {"var_descriptor", "lmodexclusive", NULL};
39 char* name;
40 Py_ssize_t len;
41 int lmodexclusive = 0;
42 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(s#i)|p", (char**)&kwlist,
43 &name, &len, &(var_descr.id),
44 &lmodexclusive))
45 return NULL;
46
47 if (len > COMIN_MAX_LEN_VAR_NAME)
48 return PyErr_Format(PyExc_ValueError, "Variable name to long!");
49
50 strncpy(var_descr.name, name, COMIN_MAX_LEN_VAR_NAME);
51
52 comin_var_request_add(var_descr, lmodexclusive);
53 check_error("var_descr: "s + std::string(name) + ", "s +
54 std::to_string(var_descr.id));
55 Py_RETURN_NONE;
56}
57
58static PyObject* metadata_set(PyObject* /*self*/, PyObject* args,
59 PyObject* kwargs) {
60 t_comin_var_descriptor var_descr;
61 char *key, *name;
62 Py_ssize_t len;
63 PyObject* val;
64 static char const* kwlist[] = {"var_descriptor", "key", "value", NULL};
65 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(s#i)sO", (char**)&kwlist,
66 &name, &len, &(var_descr.id), &key, &val))
67 return NULL;
68
69 if (len > COMIN_MAX_LEN_VAR_NAME)
70 return PyErr_Format(PyExc_ValueError, "Variable name to long!");
71
72 strncpy(var_descr.name, name, COMIN_MAX_LEN_VAR_NAME);
73
74 if (PyBool_Check(val)) {
75 comin_metadata_set_logical(var_descr, key, val == Py_True);
76 check_error("var_descr: "s + std::string(name) + ", "s +
77 std::to_string(var_descr.id) + " key: " + std::string(key));
78 Py_RETURN_NONE;
79 }
80 if (PyLong_Check(val)) {
81 int overflow = 0;
82 long val_l = PyLong_AsLongAndOverflow(val, &overflow);
83 if (val_l > std::numeric_limits<int>::max() ||
84 val_l < std::numeric_limits<int>::min() || overflow != 0) {
85 return PyErr_Format(PyExc_ValueError, "value is out of the range of int");
86 }
87 comin_metadata_set_integer(var_descr, key, val_l);
88 check_error("var_descr: "s + std::string(name) + ", "s +
89 std::to_string(var_descr.id) + " key: " + std::string(key));
90 Py_RETURN_NONE;
91 }
92 if (PyFloat_Check(val)) {
93 double val_d = PyFloat_AsDouble(val);
94 if (val_d == -1. && PyErr_Occurred())
95 return PyErr_Format(PyExc_ValueError, "value is not a float");
96 comin_metadata_set_real(var_descr, key, val_d);
97 check_error("var_descr: "s + std::string(name) + ", "s +
98 std::to_string(var_descr.id) + " key: " + std::string(key));
99 Py_RETURN_NONE;
100 }
101 if (PyUnicode_Check(val)) {
102 const char* val_str = PyUnicode_AsUTF8(val);
103 if (val_str == NULL)
104 return PyErr_Format(PyExc_ValueError,
105 "value cannot be converted to char* (UTF-8)");
106 comin_metadata_set_character(var_descr, key, val_str);
107 check_error("var_descr: "s + std::string(name) + ", "s +
108 std::to_string(var_descr.id) + " key: " + std::string(key));
109 Py_RETURN_NONE;
110 }
111 PyTypeObject* type = val->ob_type;
112 return PyErr_Format(PyExc_ValueError,
113 "comin_metadata_set is not implemented for the provided "
114 "object type (type=%s, name=%s, id=%d, key=%s)",
115 type->tp_name, var_descr.name, var_descr.id, key);
116}
117
126static PyObject* metadata_get(PyObject* /*self*/, PyObject* args,
127 PyObject* kwargs) {
128 t_comin_var_descriptor var_desc;
129 static char const* kwlist[] = {"var_descriptor", "key", NULL};
130 char* name;
131 Py_ssize_t len;
132 char* key;
133 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(s#i)s", (char**)&kwlist,
134 &name, &len, &(var_desc.id), &key))
135 return NULL;
136 strncpy(var_desc.name, name, len + 1);
137 int type = comin_metadata_get_typeid(var_desc, key);
138 check_error("var_descr: "s + std::string(name) + ", "s +
139 std::to_string(var_desc.id) + " key: " + std::string(key));
140 if (type == COMIN_METADATA_TYPEID_BOOL) {
141 bool val = comin_metadata_get_bool(var_desc, key);
142 check_error("var_descr: "s + std::string(name) + ", "s +
143 std::to_string(var_desc.id) + " key: " + std::string(key));
144 if (val)
145 Py_RETURN_TRUE;
146 else
147 Py_RETURN_FALSE;
148 }
149 if (type == COMIN_METADATA_TYPEID_INT) {
150 int val = comin_metadata_get_int(var_desc, key);
151 check_error("var_descr: "s + std::string(name) + ", "s +
152 std::to_string(var_desc.id) + " key: " + std::string(key));
153 return PyLong_FromLong(val);
154 }
155 if (type == COMIN_METADATA_TYPEID_DOUBLE) {
156 double val = comin_metadata_get_double(var_desc, key);
157 check_error("var_descr: "s + std::string(name) + ", "s +
158 std::to_string(var_desc.id) + " key: " + std::string(key));
159 return PyFloat_FromDouble(val);
160 }
161 if (type == COMIN_METADATA_TYPEID_STRING) {
162 const char* val = comin_metadata_get_string(var_desc, key);
163 check_error("var_descr: "s + std::string(name) + ", "s +
164 std::to_string(var_desc.id) + " key: " + std::string(key));
165 return PyUnicode_FromString(val);
166 }
167 return PyErr_Format(PyExc_KeyError, "Key not found: %s", key);
168}
169
170static PyObject* var_get(PyObject* /*self*/, PyObject* args, PyObject* kwargs) {
171 PyObject* context;
172 t_comin_var_descriptor var_desc;
173 int flag = -1;
174
175 static char const* kwlist[] = {"context", "var_descriptor", "flag", NULL};
176 char* name;
177 Py_ssize_t len;
178 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O(s#i)|i", (char**)&kwlist,
179 &context, &name, &len, &(var_desc.id),
180 &flag))
181 return NULL;
182 strncpy(var_desc.name, name, len + 1);
183
184 if (!PyList_Check(context))
185 return PyErr_Format(PyExc_ValueError,
186 "PyCominVar requires list of integers as contexts");
187 std::vector<int> icontext(PyList_Size(context));
188 for (size_t i = 0; i < icontext.size(); ++i)
189 icontext[i] = (int)PyLong_AsLong(PyList_GetItem(context, i));
190
191 t_comin_var_handle* var = comin_var_get(
192 icontext.size(), (t_comin_entry_point*)icontext.data(), var_desc, flag);
193 check_error("var_descr: "s + std::string(name) + ", "s +
194 std::to_string(var_desc.id));
195 return PyCapsule_New(var, "var", NULL);
196}
197
198static PyObject* var_get_buffer(PyObject* self, PyObject* args,
199 PyObject* kwargs) {
200 PyObject* handle_cap;
201 static char const* kwlist[] = {"handle", NULL};
202 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
203 &handle_cap))
204 return NULL;
205 t_comin_var_handle* handle =
206 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap, "var");
208 comin_var_get_descriptor(handle, &descr);
209
210 void* ptr = comin_var_get_ptr(handle);
211 check_error();
212 if (ptr == NULL)
213 return PyErr_Format(PyExc_ValueError, "comin_var_get_ptr failed");
214 int shape[5];
215 comin_var_get_shape(handle, shape);
216 check_error();
217 Py_buffer buffer;
218 int type = comin_metadata_get_int(descr, "datatype");
219 check_error("'datatype' not set for "s + std::string(descr.name) + ", id="s +
220 std::to_string(descr.id));
221 switch (type) {
223 fill_buffer<double>(&buffer, ptr, shape, 5, 0);
224 break;
226 fill_buffer<float>(&buffer, ptr, shape, 5, 0);
227 break;
229 fill_buffer<int>(&buffer, ptr, shape, 5, 0);
230 break;
231 default:
232 throw std::runtime_error("Unknown datatype for "s +
233 std::string(descr.name) + ", id="s +
234 std::to_string(descr.id));
235 };
236 buffer.obj = self;
237 return PyMemoryView_FromBuffer(&buffer);
238}
239
240static PyObject* var_get_device_ptr(PyObject* /*self*/, PyObject* args,
241 PyObject* kwargs) {
242 PyObject* handle_cap;
243 static char const* kwlist[] = {"handle", NULL};
244 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
245 &handle_cap))
246 return NULL;
247 t_comin_var_handle* handle =
248 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap, "var");
249
250 void* ptr = comin_var_get_device_ptr(handle);
251 check_error();
252 return PyLong_FromVoidPtr(ptr);
253}
254
255static PyObject* var_get_dim_semantics(PyObject* /*self*/, PyObject* args,
256 PyObject* kwargs) {
257 PyObject* handle_cap;
258 static char const* kwlist[] = {"handle", NULL};
259 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
260 &handle_cap))
261 return NULL;
262 t_comin_var_handle* handle =
263 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap, "var");
264 int dim_semantics[5];
265 comin_var_get_dim_semantics(handle, dim_semantics);
266 check_error();
267 return Py_BuildValue("iiiii", dim_semantics[0], dim_semantics[1],
268 dim_semantics[2], dim_semantics[3], dim_semantics[4]);
269}
270
271static PyObject* var_get_ncontained(PyObject* /*self*/, PyObject* args,
272 PyObject* kwargs) {
273 PyObject* handle_cap;
274 static char const* kwlist[] = {"handle", NULL};
275 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
276 &handle_cap))
277 return NULL;
278 t_comin_var_handle* handle =
279 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap, "var");
280 int ncontained;
281 comin_var_get_ncontained(handle, &ncontained);
282 check_error();
283 return PyLong_FromLong(ncontained);
284}
285
286static PyObject* var_get_descriptor(PyObject* /*self*/, PyObject* args,
287 PyObject* kwargs) {
288 PyObject* handle_cap;
289 static char const* kwlist[] = {"handle", NULL};
290 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
291 &handle_cap))
292 return NULL;
293 t_comin_var_handle* handle =
294 (t_comin_var_handle*)PyCapsule_GetPointer(handle_cap, "var");
296 comin_var_get_descriptor(handle, &descr);
297 check_error();
298 return Py_BuildValue("si", descr.name, descr.id);
299}
300
301static PyObject* var_get_descr_list_head(PyObject* /*self*/,
302 PyObject* /*args*/) {
303 void* head = comin_var_get_descr_list_head();
304 check_error();
305 return PyCapsule_New(head, "var_descr_list", NULL);
306}
307
308static PyObject* var_get_descr_list_next(PyObject* /*self*/, PyObject* args,
309 PyObject* kwargs) {
310 PyObject* py_current;
311 static char const* kwlist[] = {"current", NULL};
312 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
313 &py_current))
314 return NULL;
315 t_comin_var_descr_list_iterator* it =
316 (t_comin_var_descr_list_iterator*)PyCapsule_GetPointer(py_current,
317 "var_descr_list");
318 void* next = comin_var_get_descr_list_next(it);
319 check_error();
320 if (next == NULL)
321 Py_RETURN_NONE;
322 else
323 return PyCapsule_New(next, "var_descr_list", NULL);
324}
325
326static PyObject* var_get_descr_list_var_desc(PyObject* /*self*/, PyObject* args,
327 PyObject* kwargs) {
328 PyObject* py_current;
329 static char const* kwlist[] = {"current", NULL};
330 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
331 &py_current))
332 return NULL;
333 t_comin_var_descr_list_iterator* current =
334 (t_comin_var_descr_list_iterator*)PyCapsule_GetPointer(py_current,
335 "var_descr_list");
336 t_comin_var_descriptor var_desc;
337 comin_var_get_descr_list_var_desc(current, &var_desc);
338 check_error();
339 return Py_BuildValue("si", var_desc.name, var_desc.id);
340}
341
342static PyObject* var_descr_list_iterator_delete(PyObject* /*self*/,
343 PyObject* args,
344 PyObject* kwargs) {
345 PyObject* py_current;
346 static char const* kwlist[] = {"current", NULL};
347 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist,
348 &py_current))
349 return NULL;
350 t_comin_var_descr_list_iterator* it =
351 (t_comin_var_descr_list_iterator*)PyCapsule_GetPointer(py_current,
352 "var_descr_list");
354 check_error();
355 Py_RETURN_NONE;
356}
357
358static PyObject* metadata_get_iterator_begin(PyObject* /*self*/, PyObject* args,
359 PyObject* kwargs) {
360 t_comin_var_descriptor var_desc;
361 char* name;
362 Py_ssize_t len;
363 static char const* kwlist[] = {"var_descriptor", NULL};
364 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(s#i)", (char**)&kwlist,
365 &name, &len, &(var_desc.id)))
366 return NULL;
367 strncpy(var_desc.name, name, COMIN_MAX_LEN_VAR_NAME);
368 void* it = comin_metadata_get_iterator_begin(var_desc);
369 check_error("var_descr: "s + std::string(var_desc.name) + ", "s +
370 std::to_string(var_desc.id));
371 return PyCapsule_New(it, "metadata_iterator", NULL);
372}
373
374static PyObject* metadata_get_iterator_end(PyObject* /*self*/, PyObject* args,
375 PyObject* kwargs) {
376 t_comin_var_descriptor var_desc;
377 char* name;
378 Py_ssize_t len;
379 static char const* kwlist[] = {"var_descriptor", NULL};
380 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(s#i)", (char**)&kwlist,
381 &name, &len, &(var_desc.id)))
382 return NULL;
383 strncpy(var_desc.name, name, COMIN_MAX_LEN_VAR_NAME);
384 void* it = comin_metadata_get_iterator_end(var_desc);
385 check_error("var_descr: "s + std::string(var_desc.name) + ", "s +
386 std::to_string(var_desc.id));
387 return PyCapsule_New(it, "metadata_iterator", NULL);
388}
389
390static PyObject* metadata_iterator_get_key(PyObject* /*self*/, PyObject* args,
391 PyObject* kwargs) {
392 PyObject* py_it;
393 static char const* kwlist[] = {"it", NULL};
394 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist, &py_it))
395 return NULL;
397 (t_comin_metadata_iterator*)PyCapsule_GetPointer(py_it,
398 "metadata_iterator");
399 const char* key = comin_metadata_iterator_get_key(it);
400 check_error();
401 return Py_BuildValue("s", key);
402}
403
404static PyObject* metadata_iterator_compare(PyObject* /*self*/, PyObject* args,
405 PyObject* kwargs) {
406 PyObject *py_it1, *py_it2;
407 static char const* kwlist[] = {"it1", "it2", NULL};
408 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)&kwlist, &py_it1,
409 &py_it2))
410 return NULL;
412 (t_comin_metadata_iterator*)PyCapsule_GetPointer(py_it1,
413 "metadata_iterator");
415 (t_comin_metadata_iterator*)PyCapsule_GetPointer(py_it2,
416 "metadata_iterator");
417 bool result = comin_metadata_iterator_compare(it1, it2);
418 check_error();
419 if (result)
420 Py_RETURN_TRUE;
421 else
422 Py_RETURN_FALSE;
423}
424
425static PyObject* metadata_iterator_next(PyObject* /*self*/, PyObject* args,
426 PyObject* kwargs) {
427 PyObject* py_it;
428 static char const* kwlist[] = {"it", NULL};
429 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist, &py_it))
430 return NULL;
432 (t_comin_metadata_iterator*)PyCapsule_GetPointer(py_it,
433 "metadata_iterator");
435 check_error();
436 Py_RETURN_NONE;
437}
438
439static PyObject* metadata_iterator_delete(PyObject* /*self*/, PyObject* args,
440 PyObject* kwargs) {
441 PyObject* py_it;
442 static char const* kwlist[] = {"it", NULL};
443 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist, &py_it))
444 return NULL;
446 (t_comin_metadata_iterator*)PyCapsule_GetPointer(py_it,
447 "metadata_iterator");
449 check_error();
450 Py_RETURN_NONE;
451}
452
453std::vector<PyMethodDef> variables_methods() {
454 return {
455 {"var_request_add", (PyCFunction)func_wrapper<var_request_add>,
456 METH_VARARGS | METH_KEYWORDS,
457 "Request the host model to add a variable, arguments:"
458 " (name string, domain id), lmodexclusive"},
459 {"metadata_get", (PyCFunction)func_wrapper<metadata_get>,
460 METH_VARARGS | METH_KEYWORDS,
461 "retrieve metadata, arguments: (name string, domain id) , metadata key"},
462 {"_metadata_set", (PyCFunction)func_wrapper<metadata_set>,
463 METH_VARARGS | METH_KEYWORDS, ""},
464 {"_var_get", (PyCFunction)func_wrapper<var_get>,
465 METH_VARARGS | METH_KEYWORDS, ""},
466 {"_var_get_device_ptr", (PyCFunction)func_wrapper<var_get_device_ptr>,
467 METH_VARARGS | METH_KEYWORDS, ""},
468 {"_var_get_buffer", (PyCFunction)func_wrapper<var_get_buffer>,
469 METH_VARARGS | METH_KEYWORDS, ""},
470 {"_var_get_dim_semantics",
472 METH_VARARGS | METH_KEYWORDS, ""},
473 {"_var_get_ncontained", (PyCFunction)func_wrapper<var_get_ncontained>,
474 METH_VARARGS | METH_KEYWORDS, ""},
475 {"_var_get_descriptor", (PyCFunction)func_wrapper<var_get_descriptor>,
476 METH_VARARGS | METH_KEYWORDS, ""},
477 {"_var_get_descr_list_head", func_wrapper<var_get_descr_list_head>,
478 METH_NOARGS, ""},
479 {"_var_get_descr_list_next",
481 METH_VARARGS | METH_KEYWORDS, ""},
482 {"_var_get_descr_list_var_desc",
484 METH_VARARGS | METH_KEYWORDS, ""},
485 {"_var_descr_list_iterator_delete",
487 METH_VARARGS | METH_KEYWORDS, ""},
488 {"_metadata_get_iterator_begin",
490 METH_VARARGS | METH_KEYWORDS, ""},
491 {"_metadata_get_iterator_end",
493 METH_VARARGS | METH_KEYWORDS, ""},
494 {"_metadata_iterator_get_key",
496 METH_VARARGS | METH_KEYWORDS, ""},
497 {"_metadata_iterator_compare",
499 METH_VARARGS | METH_KEYWORDS, ""},
500 {"_metadata_iterator_next",
502 METH_VARARGS | METH_KEYWORDS, ""},
503 {"_metadata_iterator_delete",
505 METH_VARARGS | METH_KEYWORDS, ""},
506 };
507}
508} // namespace comin::python
C interface for the ICON Community Interface.
bool comin_metadata_get_bool(t_comin_var_descriptor descriptor, const char *key)
int comin_metadata_get_int(t_comin_var_descriptor descriptor, const char *key)
t_comin_metadata_iterator * comin_metadata_get_iterator_end(t_comin_var_descriptor var_descriptor)
void comin_metadata_iterator_next(t_comin_metadata_iterator *it)
t_comin_metadata_typeid comin_metadata_get_typeid(t_comin_var_descriptor var_descriptor, const char *key)
const char * comin_metadata_get_string(t_comin_var_descriptor descriptor, const char *key)
double comin_metadata_get_double(t_comin_var_descriptor descriptor, const char *key)
const char * comin_metadata_iterator_get_key(t_comin_metadata_iterator *it)
void comin_metadata_iterator_delete(t_comin_metadata_iterator *it)
t_comin_metadata_iterator * comin_metadata_get_iterator_begin(t_comin_var_descriptor var_descriptor)
bool comin_metadata_iterator_compare(t_comin_metadata_iterator *it1, t_comin_metadata_iterator *it2)
void comin_var_request_add(t_comin_var_descriptor var_desc, bool lmodexclusive)
void comin_var_descr_list_iterator_delete(t_comin_var_descr_list_iterator **it)
void comin_var_get_descr_list_var_desc(t_comin_var_descr_list_iterator *current, t_comin_var_descriptor *var_desc)
t_comin_var_descr_list_iterator * comin_var_get_descr_list_head()
t_comin_var_descr_list_iterator * comin_var_get_descr_list_next(t_comin_var_descr_list_iterator *current)
char name[COMIN_MAX_LEN_VAR_NAME+1]
Definition comin.h:37
static PyObject * var_request_add(PyObject *, PyObject *args, PyObject *kwargs)
Request the host model to add a variable.
Definition variables.cpp:35
int COMIN_VAR_DATATYPE_FLOAT
Definition comin.py:289
static PyObject * metadata_get(PyObject *, PyObject *args, PyObject *kwargs)
Retrieve metadata for a variable.
int COMIN_VAR_DATATYPE_DOUBLE
Definition comin.py:288
int COMIN_VAR_DATATYPE_INT
Definition comin.py:290
static PyObject * var_get_device_ptr(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_buffer(PyObject *self, PyObject *args, PyObject *kwargs)
void check_error(std::string add_info)
Definition exception.cpp:7
static PyObject * metadata_get_iterator_end(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descr_list_head(PyObject *, PyObject *)
static PyObject * metadata_iterator_compare(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * metadata_iterator_next(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * metadata_set(PyObject *, PyObject *args, PyObject *kwargs)
Definition variables.cpp:58
static PyObject * var_get_dim_semantics(PyObject *, PyObject *args, PyObject *kwargs)
void fill_buffer(Py_buffer *buffer, void *mem, int *shape, int ndims, int readonly=1)
Definition util.h:28
static PyObject * var_get_ncontained(PyObject *, PyObject *args, PyObject *kwargs)
std::vector< PyMethodDef > variables_methods()
static PyObject * metadata_get_iterator_begin(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descriptor(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * metadata_iterator_get_key(PyObject *, PyObject *args, PyObject *kwargs)
PyObject * func_wrapper(PyObject *self, PyObject *args)
Definition exception.h:33
static PyObject * metadata_iterator_delete(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_descr_list_iterator_delete(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descr_list_var_desc(PyObject *, PyObject *args, PyObject *kwargs)
static PyObject * var_get_descr_list_next(PyObject *, PyObject *args, PyObject *kwargs)
t_comin_var_descriptor descr
double * buffer