Home | History | Annotate | Download | only in octave
      1 /* -------------------------------------------------------------------------
      2  *  Special user directives
      3  * ------------------------------------------------------------------------- */
      4 
      5 /* ------------------------------------------------------------------------- */
      6 /*
      7   Implicit Conversion using the C++ constructor mechanism
      8 */
      9 
     10 #define %implicitconv      %feature("implicitconv")
     11 #define %noimplicitconv    %feature("implicitconv", "0")
     12 #define %clearimplicitconv %feature("implicitconv", "")
     13 
     14 
     15 /* ------------------------------------------------------------------------- */
     16 /*
     17    %extend_smart_pointer extend the smart pointer support.
     18 
     19    For example, if you have a smart pointer as:
     20 
     21      template <class Type> class RCPtr {
     22      public:
     23        ...
     24        RCPtr(Type *p);
     25    	Type * operator->() const;
     26    	...
     27      };
     28 
     29    you use the %extend_smart_pointer directive as:
     30 
     31      %extend_smart_pointer(RCPtr<A>);
     32      %template(RCPtr_A)  RCPtr<A>;
     33 
     34    then, if you have something like:
     35 
     36      RCPtr<A> make_ptr();
     37      int foo(A *);
     38 
     39    you can do the following:
     40 
     41      a = make_ptr();
     42      b = foo(a);
     43 
     44    ie, swig will accept a RCPtr<A> object where a 'A *' is
     45    expected.
     46 
     47    Also, when using vectors
     48 
     49      %extend_smart_pointer(RCPtr<A>);
     50      %template(RCPtr_A) RCPtr<A>;
     51      %template(vector_A) std::vector<RCPtr<A> >;
     52 
     53    you can type
     54 
     55      a = A();
     56      v = vector_A(2)
     57      v[0] = a
     58 
     59    ie, an 'A *' object is accepted, via implicit conversion,
     60    where a RCPtr<A> object is expected. Additionally
     61 
     62      x = v[0]
     63 
     64    returns (and sets 'x' as) a copy of v[0], making reference
     65    counting possible and consistent.
     66 */
     67 
     68 %define %extend_smart_pointer(Type...)
     69 %implicitconv Type;
     70 %apply const SWIGTYPE& SMARTPOINTER { const Type& };
     71 %apply SWIGTYPE SMARTPOINTER { Type };
     72 %enddef
     73