/* ------------------------------------------------------------------------- * Special user directives * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* Implicit Conversion using the C++ constructor mechanism */ #define %implicitconv %feature("implicitconv") #define %noimplicitconv %feature("implicitconv", "0") #define %clearimplicitconv %feature("implicitconv", "") /* ------------------------------------------------------------------------- */ /* %extend_smart_pointer extend the smart pointer support. For example, if you have a smart pointer as: template <class Type> class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr<A>); %template(RCPtr_A) RCPtr<A>; then, if you have something like: RCPtr<A> make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr<A> object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr<A>); %template(RCPtr_A) RCPtr<A>; %template(vector_A) std::vector<RCPtr<A> >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr<A> object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. */ %define %extend_smart_pointer(Type...) %implicitconv Type; %apply const SWIGTYPE& SMARTPOINTER { const Type& }; %apply SWIGTYPE SMARTPOINTER { Type }; %enddef