#include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <typeinfo>
#include "mex.h"
#include "class_handle.hpp"
#include "mextrsolver.h"
using namespace std;
enum ClassMethods { evNotDefined,
prepare_netlist,
init_sync,
init_async,
stepsolve_sync,
acceptstep_sync,
stepsolve_async,
acceptstep_async,
rejectstep_async,
getsolution,
debug,
printx,
getN,
getM,
getJac,
setecvs,
getnodev,
getvprobe,
getiprobe
};
std::map<std::string, ClassMethods> s_mapClassMethodStrs;
void Initialize()
{
s_mapClassMethodStrs["prepare_netlist"] = prepare_netlist;
s_mapClassMethodStrs["init_sync"] = init_sync;
s_mapClassMethodStrs["init_async"] = init_async;
s_mapClassMethodStrs["stepsolve_sync"] = stepsolve_sync;
s_mapClassMethodStrs["acceptstep_sync"] = acceptstep_sync;
s_mapClassMethodStrs["stepsolve_async"] = stepsolve_async;
s_mapClassMethodStrs["acceptstep_async"] = acceptstep_async;
s_mapClassMethodStrs["rejectstep_async"] = rejectstep_async;
s_mapClassMethodStrs["getsolution"] = getsolution;
s_mapClassMethodStrs["debug"] = debug;
s_mapClassMethodStrs["printx"] = printx;
s_mapClassMethodStrs["getN"] = getN;
s_mapClassMethodStrs["getM"] = getM;
s_mapClassMethodStrs["getJac"] = getJac;
s_mapClassMethodStrs["setecvs"] = setecvs;
s_mapClassMethodStrs["getnodev"] = getnodev;
s_mapClassMethodStrs["getvprobe"] = getvprobe;
s_mapClassMethodStrs["getiprobe"] = getiprobe;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
char cmd[128];
Initialize();
if (nrhs < 1 || mxGetString(prhs[0], cmd, sizeof(cmd)))
{
mexErrMsgTxt("First input should be a command string less than 128 characters long.");
}
if (!strcmp("new", cmd))
{
if (nlhs != 1)
mexErrMsgTxt("New: One output expected.");
plhs[0] = convertPtr2Mat<mextrsolver>(new mextrsolver);
return;
}
if (nrhs < 2)
mexErrMsgTxt("Second input should be a class instance handle.");
if (!strcmp("delete", cmd))
{
destroyObject<mextrsolver>(prhs[1]);
if (nlhs != 0 || nrhs != 2)
mexWarnMsgTxt("Delete: Unexpected arguments ignored.");
return;
}
mextrsolver *mextrsolver_instance = convertMat2Ptr<mextrsolver>(prhs[1]);
switch(s_mapClassMethodStrs[cmd])
{
case prepare_netlist:
mextrsolver_instance->prepare_netlist(nlhs, plhs, nrhs, prhs);
return;
case init_sync:
mextrsolver_instance->init_sync(nlhs, plhs, nrhs, prhs);
return;
case init_async:
mextrsolver_instance->init_async(nlhs, plhs, nrhs, prhs);
return;
case stepsolve_sync:
mextrsolver_instance->stepsolve_sync(nlhs, plhs, nrhs, prhs);
return;
case acceptstep_sync:
mextrsolver_instance->acceptstep_sync(nlhs, plhs, nrhs, prhs);
return;
case stepsolve_async:
mextrsolver_instance->stepsolve_async(nlhs, plhs, nrhs, prhs);
return;
case acceptstep_async:
mextrsolver_instance->acceptstep_async(nlhs, plhs, nrhs, prhs);
return;
case rejectstep_async:
mextrsolver_instance->rejectstep_async(nlhs, plhs, nrhs, prhs);
return;
case getsolution:
mextrsolver_instance->getsolution(nlhs, plhs, nrhs, prhs);
return;
case printx:
mextrsolver_instance->printx();
return;
case getN:
mextrsolver_instance->getN(nlhs, plhs, nrhs, prhs);
return;
case getM:
mextrsolver_instance->getM(nlhs, plhs, nrhs, prhs);
return;
case getJac:
mextrsolver_instance->getJac(nlhs, plhs, nrhs, prhs);
return;
case setecvs:
mextrsolver_instance->setecvs(nlhs, plhs, nrhs, prhs);
return;
case getnodev:
mextrsolver_instance->getnodev(nlhs, plhs, nrhs, prhs);
return;
case getvprobe:
mextrsolver_instance->getvprobe(nlhs, plhs, nrhs, prhs);
return;
case getiprobe:
mextrsolver_instance->getiprobe(nlhs, plhs, nrhs, prhs);
return;
default:
mexErrMsgTxt("Unrecognised class command string.");
break;
}
}