123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #################### FromPyStructUtility ####################
- cdef extern from *:
- ctypedef struct PyTypeObject:
- char* tp_name
- PyTypeObject *Py_TYPE(obj)
- bint PyMapping_Check(obj)
- object PyErr_Format(exc, const char *format, ...)
- @cname("{{funcname}}")
- cdef {{struct_type}} {{funcname}}(obj) except *:
- cdef {{struct_type}} result
- if not PyMapping_Check(obj):
- PyErr_Format(TypeError, b"Expected %.16s, got %.200s", b"a mapping", Py_TYPE(obj).tp_name)
- {{for member in var_entries:}}
- try:
- value = obj['{{member.name}}']
- except KeyError:
- raise ValueError("No value specified for struct attribute '{{member.name}}'")
- result.{{member.cname}} = value
- {{endfor}}
- return result
- #################### FromPyUnionUtility ####################
- cdef extern from *:
- ctypedef struct PyTypeObject:
- char* tp_name
- PyTypeObject *Py_TYPE(obj)
- bint PyMapping_Check(obj)
- object PyErr_Format(exc, const char *format, ...)
- @cname("{{funcname}}")
- cdef {{struct_type}} {{funcname}}(obj) except *:
- cdef {{struct_type}} result
- cdef Py_ssize_t length
- if not PyMapping_Check(obj):
- PyErr_Format(TypeError, b"Expected %.16s, got %.200s", b"a mapping", Py_TYPE(obj).tp_name)
- last_found = None
- length = len(obj)
- if length:
- {{for member in var_entries:}}
- if '{{member.name}}' in obj:
- if last_found is not None:
- raise ValueError("More than one union attribute passed: '%s' and '%s'" % (last_found, '{{member.name}}'))
- last_found = '{{member.name}}'
- result.{{member.cname}} = obj['{{member.name}}']
- length -= 1
- if not length:
- return result
- {{endfor}}
- if last_found is None:
- raise ValueError("No value specified for any of the union attributes (%s)" %
- '{{", ".join(member.name for member in var_entries)}}')
- return result
- #################### cfunc.to_py ####################
- @cname("{{cname}}")
- cdef object {{cname}}({{return_type.ctype}} (*f)({{ ', '.join(arg.type_cname for arg in args) }}) {{except_clause}}):
- def wrap({{ ', '.join('{arg.ctype} {arg.name}'.format(arg=arg) for arg in args) }}):
- """wrap({{', '.join(('{arg.name}: {arg.type_displayname}'.format(arg=arg) if arg.type_displayname else arg.name) for arg in args)}}){{if return_type.type_displayname}} -> {{return_type.type_displayname}}{{endif}}"""
- {{'' if return_type.type.is_void else 'return '}}f({{ ', '.join(arg.name for arg in args) }})
- return wrap
- #################### carray.from_py ####################
- cdef extern from *:
- object PyErr_Format(exc, const char *format, ...)
- @cname("{{cname}}")
- cdef int {{cname}}(object o, {{base_type}} *v, Py_ssize_t length) except -1:
- cdef Py_ssize_t i = length
- try:
- i = len(o)
- except (TypeError, OverflowError):
- pass
- if i == length:
- for i, item in enumerate(o):
- if i >= length:
- break
- v[i] = item
- else:
- i += 1 # convert index to length
- if i == length:
- return 0
- PyErr_Format(
- IndexError,
- ("too many values found during array assignment, expected %zd"
- if i >= length else
- "not enough values found during array assignment, expected %zd, got %zd"),
- length, i)
- #################### carray.to_py ####################
- cdef extern from *:
- void Py_INCREF(object o)
- tuple PyTuple_New(Py_ssize_t size)
- list PyList_New(Py_ssize_t size)
- void PyTuple_SET_ITEM(object p, Py_ssize_t pos, object o)
- void PyList_SET_ITEM(object p, Py_ssize_t pos, object o)
- @cname("{{cname}}")
- cdef inline list {{cname}}({{base_type}} *v, Py_ssize_t length):
- cdef size_t i
- cdef object value
- l = PyList_New(length)
- for i in range(<size_t>length):
- value = v[i]
- Py_INCREF(value)
- PyList_SET_ITEM(l, i, value)
- return l
- @cname("{{to_tuple_cname}}")
- cdef inline tuple {{to_tuple_cname}}({{base_type}} *v, Py_ssize_t length):
- cdef size_t i
- cdef object value
- t = PyTuple_New(length)
- for i in range(<size_t>length):
- value = v[i]
- Py_INCREF(value)
- PyTuple_SET_ITEM(t, i, value)
- return t
|