writetypemaps

Joris Gillis edited this page Jun 11, 2011 · 6 revisions

Outline

A typical input typemap consists of three basic parts: typemap(in): contains the actual conversion typemap(typecheck): necessary when you have a method with multiple signatures typemap(freearg): free memory that was allocated in typemap(in) , if any.

The general pattern is:

%typemap(in) singleargumentpattern  (localvariables)? {
  $1 = f($input);
}

or even more general:

%typemap(in) (singleargumentpattern+)  (localvariables)? {
  $1 = f($input);
  $2 = g($input);
  ...
}

Defining argumentpattern = singleargumentpattern | (singleargumentpattern+), we have the following typical typemaps:

%typemap(typecheck,precedence=...) argumentpattern {
if (my_check($input)) {
	$1=1;
    } else {
	$1=0;
    }
}
%typemap(freearg) argumentpattern {
if ($1) 
	delete $1;
}

Details

Passing data between typemaps

A typemap(in) can allocate variables that are available for all typemaps with the same argumentpattern. Typically, localvariables would contain PyObject *temp and the typemap(freearg) would contain the code delete temp$argnum

Throwing Exceptions

Use the macro SWIG_exception_fail, not SWIG_Error, inside typemaps. Example: SWIG_exception_fail(SWIG_TypeError, "Wrong type of argument");

Accessing called objects

When writing a typemap for a member function, you can access the object with arg1.

Alternatives

A typemap is not always the best solution. You can also add code in the target language verbatim:

%extend Matrix<double> {
%pythoncode %{
def toMatrix(self):
import numpy as n
return n.matrix(self.getArray())
%}
};

See: typemaps_development for more in-depth information of how we structure typemaps.

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.