我正在使用SWIG生成的接口扩展用于从Java访问OpenCasCade C ++库的jCAE / occjava。
需要比较某些C ++端对象的相等性,即运算符==
。
类Handle_Standard_Type
的特定实例,其在库中使用以表示使用单例的动态类型信息,即或多或少类似于枚举。不要认为这是相关的,只需将其作为背景信息。
我可以使用以下SWIG定义
来完成这项工作%typemap(javacode) Handle_Standard_Type& %{
public boolean equals(Object obj) {
boolean equal = false;
if (obj instanceof $javaclassname)
equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
return equal;
}
%}
然而,这会产生一个丑陋的类名SWIGTYPE_p_Handle_Standard_Type
。
我尝试了所有我能找到的东西,例如:
Remove SWIGTYPE from Generated Class name
但如果我按照建议做并添加到我的SWIG defs:
class Handle_Standard_Type {}
我确实摆脱了丑陋的名称,但equals()
方法没有注入Java类。
更复杂的是OCC中的大多数类都是使用的
为每个C ++类Example
处理一个Handle_Example
类。
为了摆脱Java方面的丑陋,occjava项目SWIG定义有很多定义,如:
%rename(Example) Handle_Example;
所以我需要我的解决方案遵循这个命名约定,因此最终生成的Java类需要命名为Handle_Standard_Type
而不是Standard_Type
。
以下是一些更多细节,以防它们相关或可能影响所采取的路径。
以下是OCC中动态类型如何工作的示例,或者更准确地说是如何使用SWIG从Java访问它。
在SWIG中我们有这样的定义:
%{
#include <Geom_Geometry.hxx>
#include <Geom_Plane.hxx>
%}
%rename(Geom_Geometry) Handle_Geom_Geometry;
%rename(Geom_Plane) Handle_Geom_Plane;
%extend Handle_Geom_Geometry {
const Handle_Standard_Type& DynamicType()
{
return (*self)->DynamicType();
}
}
class Handle_Geom_Plane: public Handle_Geom_Geometry
{
Handle_Geom_Plane()=0;
};
%extend Handle_Geom_Plane {
static const Handle_Standard_Type& STANDARD_TYPE()
{
return STANDARD_TYPE(Geom_Plane);
}
}
在上面(*self)->DynamicType()
和STANDARD_TYPE(Geom_Plane)
返回一个表示相关类类型的单例。那里使用了很多宏魔法。
我正在展示这些细节,因为我不确定我的类型地图定义是否与Handle_Standard_Type&
相匹配是完全正确的方式,我打算如何最好地处理这个。
最重要的是,在C ++方面,我需要访问STANDARD_TYPE()
宏和函数DynamicType
返回的值,并将它们在Java端与equals()
进行比较,以获得语义等价物C ==
。
喜欢这个
Geom_Surface aSurface = ....
if (aSurface.DynamicType().equals(Geom_Plane.STANDARD_TYPE())) {
....
}