add complex matrix support

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2009-sploving@11330 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Baozeng Ding 2009-06-29 15:27:06 +00:00
commit 86a125e910
5 changed files with 118 additions and 59 deletions

View file

@ -23,6 +23,9 @@ char cvar = 0;
float fvar = 0; float fvar = 0;
double dvar = 0; double dvar = 0;
char *strvar=0; char *strvar=0;
double *Foo1;
double *Foo2;
/* A debugging function to print out their values */ /* A debugging function to print out their values */

View file

@ -17,6 +17,8 @@
extern float fvar; extern float fvar;
extern double dvar; extern double dvar;
extern char *strvar; extern char *strvar;
extern double *Foo1;
extern double *Foo2;
%} %}

View file

@ -18,6 +18,8 @@ cvar_set ("S");
fvar_set (3.14159); fvar_set (3.14159);
dvar_set (2.1828); dvar_set (2.1828);
strvar_set("Hello World"); strvar_set("Hello World");
Foo1_set([1,2,3;4,5,6]);
Foo2_set([1+2*%i,2+3*%i;3+4*%i,7+8*%i]);
// Now print out the values of the variables // Now print out the values of the variables
@ -35,6 +37,8 @@ printf("fvar = %f\n", fvar_get());
printf("dvar = %f\n", dvar_get()); printf("dvar = %f\n", dvar_get());
printf("cvar = %s\n", cvar_get()); printf("cvar = %s\n", cvar_get());
printf("strvar = %s\n", strvar_get()); printf("strvar = %s\n", strvar_get());
Foo1_get();
Foo2_get();
printf("\nVariables (values printed from C)\n"); printf("\nVariables (values printed from C)\n");

View file

@ -73,8 +73,8 @@
%typemap(in) short *(int *piAddrVar, int iRows, int iCols), %typemap(in) short *(int *piAddrVar, int iRows, int iCols),
unsigned char *(int *piAddrVar, int iRows, int iCols), unsigned char *(int *piAddrVar, int iRows, int iCols),
short [](int *piAddrVar, int iRows, int iCols), short [ANY](int *piAddrVar, int iRows, int iCols),
unsigned char [](int *piAddrVar, int iRows, int iCols) { unsigned char [ANY](int *piAddrVar, int iRows, int iCols) {
short* _piData; short* _piData;
int index; int index;
getVarAddressFromPosition($argnum, &piAddrVar); getVarAddressFromPosition($argnum, &piAddrVar);
@ -98,11 +98,11 @@
unsigned int *(int *piAddrVar, int iRows, int iCols), unsigned int *(int *piAddrVar, int iRows, int iCols),
long *(int *piAddrVar, int iRows, int iCols), long *(int *piAddrVar, int iRows, int iCols),
unsigned long *(int *piAddrVar, int iRows, int iCols), unsigned long *(int *piAddrVar, int iRows, int iCols),
unsigned short [](int *piAddrVar, int iRows, int iCols), unsigned short [ANY](int *piAddrVar, int iRows, int iCols),
int [](int *piAddrVar, int iRows, int iCols), int [ANY](int *piAddrVar, int iRows, int iCols),
unsigned int [](int *piAddrVar, int iRows, int iCols), unsigned int [ANY](int *piAddrVar, int iRows, int iCols),
long [](int *piAddrVar, int iRows, int iCols), long [ANY](int *piAddrVar, int iRows, int iCols),
unsigned long [](int *piAddrVar, int iRows, int iCols) { unsigned long [ANY](int *piAddrVar, int iRows, int iCols) {
int* _piData; int* _piData;
int index; int index;
getVarAddressFromPosition($argnum, &piAddrVar); getVarAddressFromPosition($argnum, &piAddrVar);
@ -123,16 +123,16 @@
%typemap(in) double *(int *piAddrVar, int iRows, int iCols), %typemap(in) double *(int *piAddrVar, int iRows, int iCols),
float *(int *piAddrVar, int iRows, int iCols), float *(int *piAddrVar, int iRows, int iCols),
double [](int *piAddrVar, int iRows, int iCols), double [ANY](int *piAddrVar, int iRows, int iCols),
float [](int *piAddrVar, int iRows, int iCols){ float [ANY](int *piAddrVar, int iRows, int iCols){
double* _piData; double* _piData;
int index; int index;
getVarAddressFromPosition($argnum, &piAddrVar); getVarAddressFromPosition($argnum, &piAddrVar);
getVarDimension(piAddrVar, &iRows, &iCols); getVarDimension(piAddrVar, &iRows, &iCols);
if (getVarType(piAddrVar) != sci_matrix || isVarComplex(piAddrVar)) { if (getVarType(piAddrVar) == sci_matrix ){
Scierror(999, _("%s: Wrong type for input argument #%d: Real scalar expected.\n"), fname, $argnum); if(!isVarComplex(piAddrVar)) {
} isComplex=0;
getMatrixOfDouble(piAddrVar, &iRows, &iCols, &_piData); getMatrixOfDouble(piAddrVar, &iRows, &iCols, &_piData);
if($1!=NULL) { if($1!=NULL) {
free($1); free($1);
@ -141,10 +141,30 @@
for(index=0;index<iRows*iCols;index++){ for(index=0;index<iRows*iCols;index++){
$1[index]=($*1_ltype)_piData[index]; $1[index]=($*1_ltype)_piData[index];
} }
}
else {
isComplex=1;
double *_pdblImg;
getComplexMatrixOfDouble(piAddrVar, &iRows, &iCols, &_piData, &_pdblImg);
if($1!=NULL) {
free($1);
}
$1=($1_ltype)malloc(2*iRows*iCols*sizeof($*1_ltype));
for(index=0;index<iRows*iCols;index++){
$1[index]=($*1_ltype)_piData[index];
$1[index+iRows*iCols]=(double)_pdblImg[index];
}
}
}
else {
Scierror(999, _("%s: Wrong type for input argument #%d: double matrix expected.\n"), fname, $argnum);
}
} }
%typemap(in) char *(int *piAddrVar, int iRows, int iCols), %typemap(in) char *(int *piAddrVar, int iRows, int iCols),
char [](int *piAddrVar, int iRows, int iCols){ char [ANY](int *piAddrVar, int iRows, int iCols){
char* _pstStrings; char* _pstStrings;
int _piLength; int _piLength;
getVarAddressFromPosition($argnum, &piAddrVar); getVarAddressFromPosition($argnum, &piAddrVar);
@ -170,12 +190,13 @@
if($1!=NULL) { if($1!=NULL) {
free($1); free($1);
} }
$1=($1_ltype)malloc($1_dim0*$1_dim1*sizeof($1_basetype)); $1=($1_ltype)malloc(iRows*sizeof($*1_ltype));
size_t jj;
for(jj=0;jj<$1_dim1;jj++){
size_t ii; size_t ii;
for(ii=0;ii<$1_dim0;ii++) for(ii=0;ii<iRows;ii++){
$1[ii][jj]=($1_basetype)_piData[jj*$1_dim0+ii]; $1[ii]=($*1_ltype)malloc(iCols*sizeof($1_basetype));
size_t jj;
for(jj=0;jj<iCols;jj++)
$1[ii][jj]=($1_basetype)_piData[jj*iRows+ii];
} }
} }
@ -192,12 +213,13 @@
if($1!=NULL) { if($1!=NULL) {
free($1); free($1);
} }
$1=($1_ltype)malloc($1_dim0*$1_dim1*sizeof($1_basetype)); $1=($1_ltype)malloc(iRows*sizeof($*1_ltype));
size_t jj;
for(jj=0;jj<$1_dim1;jj++){
size_t ii; size_t ii;
for(ii=0;ii<$1_dim0;ii++) for(ii=0;ii<iRows;ii++){
$1[ii][jj]=($1_basetype)_piData[jj*$1_dim0+ii]; $1[ii]=($*1_ltype)malloc(iCols*sizeof($1_basetype));
size_t jj;
for(jj=0;jj<iCols;jj++)
$1[ii][jj]=($1_basetype)_piData[jj*iRows+ii];
} }
} }
@ -217,12 +239,13 @@
if($1!=NULL) { if($1!=NULL) {
free($1); free($1);
} }
$1=($1_ltype)malloc($1_dim0*$1_dim1*sizeof($1_basetype)); $1=($1_ltype)malloc(iRows*sizeof($*1_ltype));
size_t jj;
for(jj=0;jj<$1_dim1;jj++){
size_t ii; size_t ii;
for(ii=0;ii<$1_dim0;ii++) for(ii=0;ii<iRows;ii++){
$1[ii][jj]=($1_basetype)_piData[jj*$1_dim0+ii]; $1[ii]=($*1_ltype)malloc(iCols*sizeof($1_basetype));
size_t jj;
for(jj=0;jj<iCols;jj++)
$1[ii][jj]=($1_basetype)_piData[jj*iRows+ii];
} }
} }
@ -240,12 +263,13 @@
if($1!=NULL) { if($1!=NULL) {
free($1); free($1);
} }
$1=($1_ltype)malloc($1_dim0*$1_dim1*sizeof($1_basetype)); $1=($1_ltype)malloc(iRows*sizeof($*1_ltype));
size_t jj;
for(jj=0;jj<$1_dim1;jj++){
size_t ii; size_t ii;
for(ii=0;ii<$1_dim0;ii++) for(ii=0;ii<iRows;ii++){
$1[ii][jj]=($1_basetype)_piData[jj*$1_dim0+ii]; $1[ii]=($*1_ltype)malloc(iCols*sizeof($1_basetype));
size_t jj;
for(jj=0;jj<iCols;jj++)
$1[ii][jj]=($1_basetype)_piData[jj*iRows+ii];
} }
} }
@ -372,16 +396,20 @@
iVarOut++; iVarOut++;
} }
%typemap(out) double *(int iRowsOut,int iColsOut), %typemap(out) double *,
float *(int iRowsOut,int iColsOut) { float * {
double *temp; if(isComplex) {
temp=(double *)($result); createComplexMatrixOfDouble(iVarOut, iRowsOut, iColsOut, $result,&$result[iRowsOut*iColsOut]);
iRowsOut=1;
iColsOut=1;
createMatrixOfDouble(iVarOut, iRowsOut, iColsOut, temp);
LhsVar(iOutNum)=iVarOut; LhsVar(iOutNum)=iVarOut;
iOutNum++; iOutNum++;
iVarOut++; iVarOut++;
}
else {
createMatrixOfDouble(iVarOut, iRowsOut, iColsOut, $result);
LhsVar(iOutNum)=iVarOut;
iOutNum++;
iVarOut++;
}
} }
%typemap(out) char *(int iRowsOut,int iColsOut){ %typemap(out) char *(int iRowsOut,int iColsOut){
@ -402,6 +430,7 @@
iVarOut++; iVarOut++;
} }
/* ------------------------------------------------------------ /* ------------------------------------------------------------
* Enums mapped as integer values * Enums mapped as integer values
* ------------------------------------------------------------ */ * ------------------------------------------------------------ */

View file

@ -319,14 +319,28 @@ public:
if (!addSymbol(iname, n)) if (!addSymbol(iname, n))
return SWIG_ERROR; return SWIG_ERROR;
String *rowname=NewString("");
String *colname=NewString("");
String *iscomplexname=NewString("");
Printf(rowname,"iRows_%s",iname);
Printf(colname,"iCols_%s",iname);
Printf(iscomplexname,"isComplex_%s",iname);
/* two wrapper function to get and set the variable */ /* two wrapper function to get and set the variable */
String *tm; String *tm;
String *globalVar=NewString("");
Wrapper *getf = NewWrapper(); Wrapper *getf = NewWrapper();
Wrapper *setf = NewWrapper(); Wrapper *setf = NewWrapper();
String *getname = Swig_name_get(iname); String *getname = Swig_name_get(iname);
String *setname = Swig_name_set(iname); String *setname = Swig_name_set(iname);
Printf(globalVar, "int %s=0;\n",rowname);
Printf(globalVar, "int %s=0;\n",colname);
if(!Strcmp(t,"p.double"))
Printf(globalVar, "int %s=0;\n\n",iscomplexname);
else
Printf(globalVar,"\n");
Printv(setf->def, "int ", setname, " (char *fname,unsigned long fname_len) {\n", NIL); Printv(setf->def, "int ", setname, " (char *fname,unsigned long fname_len) {\n", NIL);
/* Check the number of input and output */ /* Check the number of input and output */
@ -338,14 +352,17 @@ public:
/* add the local variable */ /* add the local variable */
Wrapper_add_local(setf, "piAddrVar", "int *piAddrVar"); Wrapper_add_local(setf, "piAddrVar", "int *piAddrVar");
Wrapper_add_local(setf, "iRows", "int iRows"); //Wrapper_add_local(setf, "iRows", "int iRows");
Wrapper_add_local(setf, "iCols", "int iCols"); //Wrapper_add_local(setf, "iCols", "int iCols");
/* deal with the set function */ /* deal with the set function */
if (is_assignable(n)) { if (is_assignable(n)) {
Setattr(n, "wrap:name", setname); Setattr(n, "wrap:name", setname);
if ((tm = Swig_typemap_lookup("in", n, name, 0))) { if ((tm = Swig_typemap_lookup("in", n, name, 0))) {
Replaceall(tm, "$argnum", "1"); Replaceall(tm, "$argnum", "1");
Replaceall(tm,"iRows",rowname);
Replaceall(tm,"iCols",colname);
Replaceall(tm,"isComplex",iscomplexname);
emit_action_code(n, setf->code, tm); emit_action_code(n, setf->code, tm);
Delete(tm); Delete(tm);
} else { } else {
@ -372,11 +389,14 @@ public:
/* add local variabe */ /* add local variabe */
Wrapper_add_local(getf, "piAddrOut", "int* _piAddress"); Wrapper_add_local(getf, "piAddrOut", "int* _piAddress");
Wrapper_add_local(getf, "iRows", "int iRowsOut"); //Wrapper_add_local(getf, "iRows", "int iRowsOut");
Wrapper_add_local(getf, "iColsOut", "int iColsOut "); //Wrapper_add_local(getf, "iColsOut", "int iColsOut ");
if ((tm = Swig_typemap_lookup("out", n, name, 0))) { if ((tm = Swig_typemap_lookup("out", n, name, 0))) {
Replaceall(tm, "$result", name); Replaceall(tm, "$result", name);
Replaceall(tm,"iRowsOut",rowname);
Replaceall(tm,"iColsOut",colname);
Replaceall(tm,"isComplex",iscomplexname);
addfail = emit_action_code(n, getf->code, tm); addfail = emit_action_code(n, getf->code, tm);
Delete(tm); Delete(tm);
} else { } else {
@ -386,6 +406,7 @@ public:
/*Dump the wrapper function */ /*Dump the wrapper function */
Append(getf->code, "}\n"); Append(getf->code, "}\n");
Wrapper_print(getf, f_wrappers); Wrapper_print(getf, f_wrappers);
Printf(f_header,"%s",globalVar);
Printf(f_builder_code, "\"%s\",\"%s\";",getname,getname); Printf(f_builder_code, "\"%s\",\"%s\";",getname,getname);
return SWIG_OK; return SWIG_OK;