是否可以将“文本”添加到 swig 中的现有类型映射中?

2024-04-27

我发现了这个问题,但一个答案基本上是,你不想这样做:使用 Swig 为 C++ 代码构建 C# 包装器时,是否可以向现有方法添加代码? https://stackoverflow.com/questions/11286913

我实际上同意所描述的情况,OP 试图以可能脆弱的方式插入代码。就我而言,我正在按照答案的建议进行操作:重命名该方法并使用 %typemap(javacode) 来实现包装方法。

但我把它写成一个宏,并且我想重写几个方法,所以我最终多次调用 %typecode(javacode) ,并且只有最后一个包装方法 javacode typemap 处于活动状态。

宏的细节很复杂,因为它使用变量 args 来表达签名。

但证明了这个问题:

%define WRAP(CLASS,METHOD)
%rename(method ## _internal,fullname=1) CLASS::METHOD;
%typemap(javamethodmodifiers) CLASS::METHOD "private";
%typemap(javacode) {
    public void METHOD() {
       METHOD ## _internal();  // delegate to original
       // extra code here
    }
}   // (note: dont use %{ %} -- need macro evaluation)
%enddef

WRAP(Foo,bar)
WRAP(Foo,baz)

class Foo {
   void bar();
   void baz();
}

只有 public void baz() { baz_internal(); ... } 生成。 这里的问题是 %rename 和 %typemap(javamethodmodifiers) 是唯一的,因为范围为 CLASS::METHOD,但 %typemap(javacode) 适用于整个类。如果语法类似于

 %typemap(javacode,append=true) {   // code   }

得到支持,那么问题就解决了。有什么技术可以实现这一点吗?这对于像 javacode 或 javaimports 这样的类型映射来说是有意义的,它们的默认值是空的。


我可以制作一个 SWIG 宏来生成您正在寻找的代码。虽然有点麻烦,但确实有效。诀窍是滥用 javaout (noblock=1)类型映射而不是 javacode,以便每个函数应用一次而不是每个类应用一次:

%module test

%define WRAP(CLASS,METHOD)
%rename(METHOD ## _internal,fullname=1) CLASS::METHOD;
%javamethodmodifiers CLASS::METHOD "private";
%typemap(javaout,noblock=1) void CLASS::METHOD {
  {
    $jnicall;
  }

  public void METHOD() {
    METHOD ## _internal();
    // some other bits
  }
}
%enddef

WRAP(Foo,bar)
WRAP(Foo,baz)

class Foo {
public:
   void bar();
   void baz();
};

这会生成您正在寻找的代码,但我怀疑您可以跳过%rename完全从 javaout 类型映射中完成这一切。此方法适用于 SWIG 1.3 及更高版本。

我确实尝试了另一种方法$typemap并复制类型映射,但这最终没有成功。

如果您想支持也返回内容的方法,您需要添加第三个宏参数:

%define WRAP(CLASS,METHOD,RETURN)
%rename(METHOD ## _internal,fullname=1) CLASS::METHOD;
%javamethodmodifiers CLASS::METHOD "private";
%typemap(javaout,noblock=1) RETURN CLASS::METHOD {
    $typemap(javaout,RETURN)

  public $typemap(jstype,RETURN) METHOD() {
    RETURN result = METHOD ## _internal();
    // some other bits
    return result;
  }
}
%enddef

$typemapThere 用于引用默认的、不太专业的类型映射,以避免为非原始/特殊情况返回重复大量代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将“文本”添加到 swig 中的现有类型映射中? 的相关文章

随机推荐