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:
parent
5d23e5310a
commit
86a125e910
5 changed files with 118 additions and 59 deletions
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
* ------------------------------------------------------------ */
|
* ------------------------------------------------------------ */
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue