如何跨swig类型映射重用代码?
How can I reuse code across swig typemaps?
我有两个swig typemaps,其中有一堆重复的代码。我想将代码合并如下:
%{
#include "structure_defs.h"
%}
%ignore Cartesian2PyList(const schrodinger::Cartesian&);
PyObject* Cartesian2PyList(const schrodinger::Cartesian& cartesian)
{
PyObject *o;
o = PyList_New(3);
PyObject* item = PyFloat_FromDouble(cartesian.x);
PyList_SetItem(o, 0, item);
item = PyFloat_FromDouble(cartesian.y);
PyList_SetItem(o, 1, item);
item = PyFloat_FromDouble(cartesian.z);
PyList_SetItem(o, 2, item);
return o;
}
%typemap(out) schrodinger::Cartesian
{
$result = Cartesian2PyList($1);
}
%typemap(out) std::vector<schrodinger::Cartesian>
{
PyObject *o;
o = PyList_New($1.size());
for (uint i=0; i<$1.size(); i++) {
PyObject *elem = Cartesian2PyList($1.at(i));
PyList_SetItem(o, i, elem);
}
$result = o;
}
%include "cartesian.h"
然而,这无法编译,因为在编译时无法找到Cartesian2PyList的定义。在多个类型映射中重用代码的最佳方法是什么?
您可以使用%{ %}
直接将代码传递到生成的.c文件。因此,在包装器中重用代码的最简单方法是将其放入其中,可能是作为静态函数,这样它就不会与同一模块中的其他任何内容冲突。在您的示例中,这将起作用:
%{
#include "structure_defs.h"
%}
%{
static PyObject* Cartesian2PyList(const schrodinger::Cartesian& cartesian)
{
PyObject *o;
o = PyList_New(3);
PyObject* item = PyFloat_FromDouble(cartesian.x);
PyList_SetItem(o, 0, item);
item = PyFloat_FromDouble(cartesian.y);
PyList_SetItem(o, 1, item);
item = PyFloat_FromDouble(cartesian.z);
PyList_SetItem(o, 2, item);
return o;
}
%}
%typemap(out) schrodinger::Cartesian
{
$result = Cartesian2PyList($1);
}
%typemap(out) std::vector<schrodinger::Cartesian>
{
PyObject *o;
o = PyList_New($1.size());
for (uint i=0; i<$1.size(); i++) {
PyObject *elem = Cartesian2PyList($1.at(i));
PyList_SetItem(o, i, elem);
}
$result = o;
}
%include "cartesian.h"
如果你愿意,你可以在这里将两个%{ %}
块合并为一个块。
我还删除了%ignore
指令,因为%{ %}
内部的代码只是输出到生成的模块,而不是包装,所以是多余的。另一方面,如果你真的想在生成的代码中包装和定义它,你可以使用%inline %{ ... %}
,例如:
%inline %{
static PyObject* Cartesian2PyList(const schrodinger::Cartesian& cartesian)
{
//...
}
%}
如果你正在编写更通用的SWIG代码,而不仅仅是一个模块,你可以使用更聪明的东西,参见fragments, %define
和$typemap
。在简单的情况下,只编写上面所示的模块内部使用的代码就足够了。
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 在映射中插入一对时,C++是否需要额外的代码
- 虚幻引擎 - 如何通过C++代码获取轴映射
- 为什么此代码在此 Trie 实现中使用映射 c++ 中的指针崩溃?
- 为什么当代码尝试在 STL 映射中查找键时出现分段错误
- 将外部错误代码映射到std :: error_condition
- stl映射同时写入示例代码
- 映射两个矢量元素并得到EXC_BAD_ACCESS(代码= 1,地址= 0x0)错误
- C# 代码到 C++(内存映射文件)
- 映射迭代器问题.包括代码
- 研究一个简单的代码反汇编输出和内存映射
- 我正在尝试通过引用函数传递C++映射并迭代它,但我无法编译代码
- HTTP状态代码到HRESULT的映射
- Winsock -> WinRT Windows.Networking.Sockets -- 映射错误代码
- 我如何消除这个枚举到字符串映射代码的样板文件?
- 这个java映射代码的c ++版本是什么
- 优化C++代码(使用无序映射和矢量)
- c++ stl映射编译问题与GCC/代码块
- c++代码模拟Windows下的虚拟映射网络驱动器
- 在c++中将错误代码映射为字符串