我正在尝试创建从 C++ 结构到 PyLong 的类型映射。
例如,我有以下表示 128 位数字的结构,我想在 Python 接口(interface)中将其作为简单的 Python unsigned long 进行访问。
struct my_128 {
u_int64_t raw[2];
};
如何创建这样的类型映射?
最佳答案
没有完整的错误检查,这些类型映射可以工作:
%typemap(in) struct my_128 {
PyObject* temp;
PyObject* shift;
if(!PyLong_Check($input) && !PyInt_Check($input))
{
PyErr_SetString(PyExc_TypeError,"Must be int or long type");
return NULL;
}
$1.raw[0] = PyInt_AsUnsignedLongLongMask($input); // low 64-bits
shift = PyInt_FromLong(64);
temp = PyNumber_Rshift($input,shift);
$1.raw[1] = PyInt_AsUnsignedLongLongMask(temp); // high 64-bits
Py_DECREF(temp);
Py_DECREF(shift);
}
%typemap(out) struct my_128 {
PyObject* low;
PyObject* high;
PyObject* shift;
PyObject* intermediate;
low = PyLong_FromUnsignedLongLong($1.raw[0]);
high = PyLong_FromUnsignedLongLong($1.raw[1]);
shift = PyInt_FromLong(64);
intermediate = PyNumber_Lshift(high,shift);
$result = PyNumber_Add(low,intermediate);
Py_DECREF(low);
Py_DECREF(high);
Py_DECREF(intermediate);
Py_DECREF(shift);
}
关于c++ - 从 C++ 结构到 PyLong 的 swig 类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347783/