Skip to content

Commit

Permalink
implement meta code Put function calls for remaining types
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Voigt authored and Alexander Voigt committed Jun 24, 2016
1 parent 44d40e1 commit 05870a6
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 23 deletions.
37 changes: 29 additions & 8 deletions meta/FSMathLink.m
Expand Up @@ -8,22 +8,43 @@
GetNumberOfInputParameterRules[inputPars_List] :=
Length[inputPars];

PutInputParameter[{par_, _, CConversion`ScalarType[CConversion`complexScalarCType]}, linkName_String] :=
ScalarTypeName[st_] :=
Switch[st,
CConversion`complexScalarCType, "Complex",
CConversion`realScalarCType, "Real",
CConversion`integerScalarCType, "Integer"
];

PutInputParameter[{par_, _, CConversion`ScalarType[st_]}, linkName_String] :=
Module[{parStr = CConversion`ToValidCSymbolString[par]},
"MLPutRuleToComplex(" <> linkName <> ", " <>
"MLPutRuleTo" <> ScalarTypeName[st] <> "(" <> linkName <> ", " <>
"INPUTPARAMETER(" <> parStr <> "), \"" <> parStr <> "\");\n"
];

PutInputParameter[{par_, _, CConversion`ScalarType[CConversion`integerScalarCType]}, linkName_String] :=
PutInputParameter[{par_, _, CConversion`ArrayType[st_,dim_]}, linkName_String] :=
Module[{parStr = CConversion`ToValidCSymbolString[par]},
"MLPutRuleToInteger(" <> linkName <> ", " <>
"INPUTPARAMETER(" <> parStr <> "), \"" <> parStr <> "\");\n"
"MLPutRuleTo" <> ScalarTypeName[st] <> "EigenArray(" <> linkName <> ", " <>
"INPUTPARAMETER(" <> parStr <> "), \"" <> parStr <> "\", " <> ToString[dim] <> ");\n"
];

PutInputParameter[{par_, _, CConversion`ScalarType[CConversion`realScalarCType]}, linkName_String] :=
PutInputParameter[{par_, _, CConversion`VectorType[st_,dim_]}, linkName_String] :=
Module[{parStr = CConversion`ToValidCSymbolString[par]},
"MLPutRuleToReal(" <> linkName <> ", " <>
"INPUTPARAMETER(" <> parStr <> "), \"" <> parStr <> "\");\n"
"MLPutRuleTo" <> ScalarTypeName[st] <> "EigenVector(" <> linkName <> ", " <>
"INPUTPARAMETER(" <> parStr <> "), \"" <> parStr <> "\", " <> ToString[dim] <> ");\n"
];

PutInputParameter[{par_, _, CConversion`MatrixType[st_,dim1_,dim2_]}, linkName_String] :=
Module[{parStr = CConversion`ToValidCSymbolString[par]},
"MLPutRuleTo" <> ScalarTypeName[st] <> "EigenMatrix(" <> linkName <> ", " <>
"INPUTPARAMETER(" <> parStr <> "), \"" <> parStr <> "\", " <>
ToString[dim1] <> ", " <> ToString[dim2] <> ");\n"
];

PutInputParameter[{par_, _, CConversion`TensorType[st_,dims__]}, linkName_String] :=
Module[{parStr = CConversion`ToValidCSymbolString[par]},
"MLPutRuleTo" <> ScalarTypeName[st] <> "EigenTensor(" <> linkName <> ", " <>
"INPUTPARAMETER(" <> parStr <> "), \"" <> parStr <> "\", " <>
Utils`StringJoinWithSeparator[ToString /@ {dims}, ", "] <> ");\n"
];

PutInputParameters[inputPars_List, linkName_String] :=
Expand Down
72 changes: 57 additions & 15 deletions src/mathlink_macros.hpp
Expand Up @@ -18,6 +18,17 @@

#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))

void MLPutComplex(MLINK link, double re, double im)
{
if (im == 0.) {
MLPutReal(link, re);
} else {
MLPutFunction(link, "Complex", 2);
MLPutReal(link, re);
MLPutReal(link, im);
}
}

#define MLPutRule(link,name) \
MLPutFunction(link, "Rule", 2); \
MLPutSymbol(link, (name))
Expand All @@ -37,23 +48,26 @@
} while (0)

#define MLPutRuleToRealList(link,v,name,dim) \
MLPutFunction(link, "Rule", 2); \
MLPutSymbol(link, name); \
MLPutRule(link, name); \
MLPutRealList(link, v, dim)

#define MLPutRuleToRealMatrix(link,v,name,dim1, dim2) \
MLPutFunction(link, "Rule", 2); \
MLPutSymbol(link, name); \
MLPutRule(link, name); \
MLPutRealMatrix(link,v,dim1,dim2);

/* put real eigen types */

#define MLPutRealEigenArray(link,v,dim) \
do { \
double v_[dim]; \
for (unsigned i = 0; i < dim; i++) \
v_[i] = v(i); \
vLPutRealList(link, v_, dim); \
MLPutRealList(link, v_, dim); \
} while (0)

#define MLPutRealEigenVector(link,v,dim) \
MLPutRealEigenArray(link,v,dim)

#define MLPutRealEigenMatrix(link,M,dim1,dim2) \
do { \
double M_[dim1][dim2]; \
Expand All @@ -63,6 +77,19 @@
MLPutRealMatrix(link, (double*)M_, dim1, dim2); \
} while (0)

/* put complex eigen types */

#define MLPutComplexEigenArray(link,v,dim) \
do { \
double v_[dim]; \
for (unsigned i = 0; i < dim; i++) \
v_[i] = v(i); \
MLPutComplexList(link, v_, dim); \
} while (0)

#define MLPutComplexEigenVector(link,v,dim) \
MLPutComplexEigenArray(link,v,dim)

#define MLPutComplexEigenMatrix(link,M,dim1,dim2) \
do { \
MLPutFunction(link, "List", dim1); \
Expand All @@ -73,13 +100,28 @@
} \
} while (0)

void MLPutComplex(MLINK link, double re, double im)
{
if (im == 0.) {
MLPutReal(link, re);
} else {
MLPutFunction(link, "Complex", 2);
MLPutReal(link, re);
MLPutReal(link, im);
}
}
/* rules to Eigent types */

#define MLPutRuleToRealEigenArray(link,v,name,dim) \
MLPutRule(link, name); \
MLPutRealEigenArray(link,v,dim)

#define MLPutRuleToRealEigenVector(link,v,name,dim) \
MLPutRule(link, name); \
MLPutRealEigenVector(link,v,dim)

#define MLPutRuleToRealEigenMatrix(link,v,name,dim1,dim2) \
MLPutRule(link, name); \
MLPutRealEigenMatrix(link,v,dim1,dim2)

#define MLPutRuleToComplexEigenArray(link,v,name,dim) \
MLPutRule(link, name); \
MLPutComplexEigenArray(link,v,dim)

#define MLPutRuleToComplexEigenVector(link,v,name,dim) \
MLPutRule(link, name); \
MLPutComplexEigenVector(link,v,dim)

#define MLPutRuleToComplexEigenMatrix(link,v,name,dim1,dim2) \
MLPutRule(link, name); \
MLPutComplexEigenMatrix(link,v,dim1,dim2)

0 comments on commit 05870a6

Please sign in to comment.