/* File : equality.i */ /* Specific test for operator== overload. Partially overlaps with operator_overload.i */ %module equality %warnfilter(SWIGWARN_LANG_IDENTIFIER) operator==; %inline %{ /* Point has no equality operator */ typedef struct Point { double x; double y; } Point; static const Point s_zeroPoint = { 0.0, 0.0 }; /* stack version */ Point MakePoint(double x, double y) { Point new_point = {x, y}; return new_point; } const Point* GetZeroPointPtr() { return &s_zeroPoint; } Point GetZeroPointCopy() { return s_zeroPoint; } /* EqualOpDefined has correct equality operator */ class EqualOpDefined { public: EqualOpDefined(): x(5) {} EqualOpDefined(int val): x(val) {} int x; }; /* EqualOpWrong has logically incorrect equality operator */ class EqualOpWrong { public: inline static const EqualOpWrong* GetStaticObject(); }; static EqualOpWrong s_wrongEqOp; const EqualOpWrong* EqualOpWrong::GetStaticObject() { return &s_wrongEqOp; } inline bool operator==( const EqualOpDefined& first, const EqualOpDefined& second ) { return first.x == second.x; } inline bool operator==( const EqualOpWrong& first, const EqualOpWrong& second ) { return false; } %} /* in order to wrap this correctly we need to extend the class to make the friends & non members part of the class */ %extend EqualOpDefined { bool operator==(const EqualOpDefined& b){return (*$self) == b;} } %extend EqualOpWrong { bool operator==(const EqualOpWrong& b){return (*$self) == b;} }