#include <mexhelper.h>

#ifdef NEED_CHILDENV
namespace ctl
{
	void setChildEnv (Environment *env) { }
}
#endif

#ifndef NO_CTL
void initEnv ()
{
	const mxArray *tmp = mexGetVariablePtr("global", "ctl_env");
	if (!tmp)
	{
		void *env = &ctl::env();
		mexMakeMemoryPersistent(env);
		mxArray *tmp3 = mxCreateDoubleMatrix(2, 1, mxREAL);
		double *tmp2 = mxGetPr(tmp3);
		tmp2[0] = (int)env;
		tmp2[1] = ((long long)(int)env) >> 32;
		mexPutVariable("global", "ctl_env", tmp3);
	}
	else
	{
		double *tmp2 = mxGetPr(tmp);
		char *env = (char *)((int)(((long long)tmp2[1]) << 32)) + (int)tmp2[0];
		ctl::Environment *globEnv = &ctl::env();
		if (env != (char *)globEnv)
		{
			mexPrintf("setChildEnv()\n");
			ctl::setChildEnv((ctl::Environment *)env);
		}
	}
}
#endif

bool mexTypeCheck (const mxArray *mval, const char *wantType, int i, int j)
{
	if (!mval || !wantType)
		return false;
	const char *isType = mxGetClassName(mval);
	const int N = mxGetN(mval);
	const int M = mxGetM(mval);
	return !strcmp(isType, wantType) && i==N && j==M;
}
