c++ - 从 C++ 结构到 PyLong 的 swig 类型映射

标签 c++ struct swig

我正在尝试创建从 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/

相关文章:

java - 是否可以一起使用 Java、SWIG 和 Rust?

c++ - 默认所有线程到一个核心?

c++ - 将函数作为类模板参数传递

swift - 使用带有 getter 和 setter 的类或结构来计算关系的属性

mongodb - 将动态结构传递给golang中的函数

python - 使用 Swig 将 numpy 字符串数组传递给 C

android - 使用 Android SDK+NDK 构建复杂的原生 + Java 库的最佳方式

c++如何将迭代器指针传递给需要引用对象的函数

c++ - 在没有 malloc 和 free 的情况下存储和回收堆分配的可变大小对象

c - "error: subscripted value is neither array nor pointer nor vector"