Subversion

gpucv

[/] [experimental/] [trunk/] [gpucv/] [src/] [lib/] [GPUCVSwitch/] [Cl_GenSw_Fct.cpp] - Rev 605

Compare with Previous - Blame


#include "StdAfx.h"
#include <GPUCVSwitch/macro.h>
#include <GPUCVSwitch/Cl_GenSw_Fct.h>
#include <iostream>
#include <fstream>
#include <string>

namespace GCV{

using namespace std;
using namespace GCV;

/**
Look for the given input string into the list of strings and return the string ID, -1 if not found
*/
int FindCheckPatternIntoStrings(std::string inputstr, std::string * _strList,
                                                                  int _strNbr
                                                                  )
{
        size_t Start = 0;
        bool Loop = true;

        for(int i =0; i < _strNbr; i++)
        {
                Start = inputstr.find(_strList[i]);
                if (Start!=std::string::npos)
                        return i;
        }
        return -1;
}
//==================================================
CL_FctAgrs::CL_FctAgrs(const std::string &_name)
: SGE::CL_XML_BASE_OBJ<std::string>(_name, "Arg")
,m_Const(false)
,m_ObjType(Obj_Unknown)
{
        ParseArgument(_name);
        ParseArgsType();
}
//==================================================
CL_FctAgrs::CL_FctAgrs(void)
: SGE::CL_XML_BASE_OBJ<std::string>("", "Arg")
,m_Const(false)
,m_ObjType(Obj_Unknown)
{

}
//==================================================
CL_FctAgrs::~CL_FctAgrs()
{
}
//==================================================
CL_FctAgrs& CL_FctAgrs::ParseArgument(const std::string &arg)
{
        string LocalArgStr = arg;

        size_t Start, Start_sp;//, Start_st, Start_am;
        std::string subarg;

        //check default value:
        Start = LocalArgStr.find_first_of("=");
        if(Start==std::string::npos)
        {
                Start = LocalArgStr.find("CV_DEFAULT");
        }
        if(Start!=std::string::npos)
        {
                m_DefaultVal = LocalArgStr.substr(Start, LocalArgStr.size());
                LocalArgStr = LocalArgStr.substr(0, Start-1);
                if(m_DefaultVal[m_DefaultVal.size()-1]!=')')
                        m_DefaultVal+=")";
        }
        //===============================

        SGE::StrTrimLR(LocalArgStr);
        SGE::StrTrimLastChar(LocalArgStr, ';');
        SGE::StrTrimLastChar(LocalArgStr, ')');
        SGE::StrTrimLR(LocalArgStr);


        //check for type, 
        //it is normally every thing on the left of * or &
        Start		= LocalArgStr.find_last_of("*");
        if(Start==std::string::npos)
        {
                Start		= LocalArgStr.find_last_of("&");
        }

        if(Start!=std::string::npos)
        {
                m_Type = LocalArgStr.substr(0, Start+1);
                m_Name = LocalArgStr.substr(Start+1, LocalArgStr.size());
        }
        else//we check for a space...
        {
                Start_sp		= LocalArgStr.find_last_of(" ");
                if(Start_sp!=std::string::npos)
                {
                        m_Type = LocalArgStr.substr(0, Start_sp);
                        m_Name = LocalArgStr.substr(Start_sp+1, LocalArgStr.size());
                }
        }

        //trim all space that might be there...
        SGE::StrTrimLR(m_Type);
        SGE::StrTrimLR(m_Name);
        SGE::StrTrimLR(m_DefaultVal);

        //check const values
        Start = m_Type.find("const");
        if(Start!=std::string::npos)
        {
                m_Const = true;
                m_Type = m_Type.substr(Start+strlen("const"), m_Type.size());
        }
        else
                m_Const = false;

        //check that argument is not an array of type 'int x[4]'
        Start =m_Name.find_first_of("[");
        if(Start!=std::string::npos)
        {
                m_Name = m_Name.substr(0, Start);
                m_Type += " * ";
        }

        if(m_Name=="" || m_Type=="")
        {//just to make breakpoints
                int a =0;
                a++;
        }
        return *this;
}
//======================================================
std::string CL_FctAgrs::GenDefinition(ENUM_SrcFileType _fileType)
{
        SG_Assert(GetName()!="", "Empty name");
        std::string strDef;
        if(GetObjType()==Obj_Param && GetConst()==true)
                strDef	+=  "const ";
        strDef		+=	GetType();
        strDef		+=	" ";
        strDef		+=	GetName();
        if(_fileType==FILETYPE_H && GetDefaultVal()!="")
        {
                strDef		+=	" ";
                strDef		+=	GetDefaultVal();
        }
        return strDef;
}
//======================================================
std::string StrngsTableSrc[] = {
                "src"
                ,"mask"
                //cvIntegral
                ,"image"
                ,"arr"
                //cvFilter2D
                ,"kernel"
                //cvgswReleasePyramid
                ,"pyramid"
        };
        std::string StrngsTableDst[] = {
                "dst"
                //cvIntegral
                ,"sum"
                ,"sqsum"
                ,"tilted_sum"
                //cvWatershed
                ,"markers"
                //cvgswCreatePyramid
                //, "bufarr"??
        };

        std::string StrngsTableImage[] = {
                "CvArr"
                ,"CvMat"
                ,"IplImage"
                ,"const CvArr*"
                ,"const CvArr *"
                ,"CvArr*"
                ,"CvArr *"
                ,"const CvMat*"
                ,"const CvMat *"
                ,"CvMat*"
                ,"CvMat *"
                ,"const IplImage*"
                ,"const IplImage *"
                ,"IplImage*"
                ,"IplImage *"
        };

void CL_FctAgrs::ParseArgsType()
{
        if (FindCheckPatternIntoStrings(GetType(), StrngsTableImage, sizeof(StrngsTableImage)/sizeof(std::string) ) !=-1)
        {
        /*	if(GetType().find("**")!=std::string::npos)
                {//when it is a pointer to pointer we do manage it ... 
                        SetObjType(Obj_Mngd_GpuCV);
                }
                else
                */
                if(GetConst()==true)//we assume const object are source object ;-)
                {
                        SetObjType(Obj_Input_Arr);
                }
                else if (FindCheckPatternIntoStrings(GetName(), StrngsTableSrc, sizeof(StrngsTableSrc)/sizeof(std::string)) !=-1)
                {
                        SetObjType(Obj_Input_Arr);
                }
                else if (FindCheckPatternIntoStrings(GetName(), StrngsTableDst, sizeof(StrngsTableDst)/sizeof(std::string)) !=-1)
                {
                        SetObjType(Obj_Output_Arr);
                }
                else
                {//unkown type...input output..?
                        SetObjType(Obj_UNKOWN_Arr);
                }
                
                //check mask
                if(GetName().find("mask")!=std::string::npos)
                {
                        SetObjType((ObjType)(GetObjType() | Obj_Mask_Arr));
                }
        }
        else
        {
                SetObjType(Obj_Param);
        }
}
//======================================================
TiXmlElement* CL_FctAgrs::XMLLoad(TiXmlElement* _XML_Root, const std::string & _subTagName)
{
        SG_Assert(_XML_Root, "No XML root");
        TiXmlElement* pLocalNode = SGE::XMLGetElement(_XML_Root, _subTagName);
        if(pLocalNode)
        {
                //Load id
                SGE::CL_XML_BASE_OBJ<std::string>::XMLLoad(pLocalNode);

                //Load values
                SGE::XMLReadVal(pLocalNode,"Const",		m_Const);
                SGE::XMLReadVal(pLocalNode,"Type",		m_Type);
                SGE::XMLReadVal(pLocalNode,"Name",		m_Name);
                SGE::XMLReadVal(pLocalNode,"DefaultVal",	m_DefaultVal);
                
                int iObjType = 0;
                int  currentVal=0;
                m_ObjType=Obj_Unknown;
                SGE::XMLReadVal(_XML_Root,"GpuMngd",	currentVal);
                if(currentVal)
                        iObjType= (int)iObjType | (int)Obj_Mngd_GpuCV;
                
                currentVal=0;
                SGE::XMLReadVal(_XML_Root,"SrcArr",	currentVal);
                if(currentVal)
                        iObjType= (int)iObjType | (int)Obj_Input_Arr;
                
                currentVal=0;
                SGE::XMLReadVal(_XML_Root,"DstArr",	currentVal);
                if(currentVal)
                        iObjType= (int)iObjType | (int)Obj_Output_Arr;
                
                currentVal=0;
                SGE::XMLReadVal(_XML_Root,"Mask",	currentVal);
                if(currentVal)
                        iObjType= (int)iObjType | (int)Obj_Mask_Arr;
                
                currentVal=0;
                SGE::XMLReadVal(_XML_Root,"Param",	currentVal);
                if(currentVal)
                        iObjType= (int)iObjType | (int)Obj_Param;

                currentVal=0;
                SGE::XMLReadVal(_XML_Root,"UNKOWN_TYPE",	currentVal);
                if(currentVal)
                        iObjType= (int)iObjType | (int)Obj_UNKOWN_Arr;

                m_ObjType  = (ObjType) iObjType;

                SGE::XMLReadVal(_XML_Root,"DevNotes",	m_DevNotes);
                
        }
        return pLocalNode;
}
//======================================================
TiXmlElement* CL_FctAgrs::XMLSave(TiXmlElement* _XML_Root, const std::string & _subTagName)
{
        SG_Assert(_XML_Root, "No XML root");
        //save id
        SGE::CL_XML_BASE_OBJ<std::string>::XMLSave(_XML_Root);

        //save values
        if(m_Const)
                SGE::XMLWriteVal(_XML_Root,"Const",		m_Const);
        SGE::XMLWriteVal(_XML_Root,"Type",		m_Type);
        SGE::XMLWriteVal(_XML_Root,"Name",		m_Name);
        if(m_DefaultVal!="")
                SGE::XMLWriteVal(_XML_Root,"DefaultVal",m_DefaultVal);
        
        int  currentVal=1;
        if((m_ObjType & Obj_Mngd_GpuCV)==Obj_Mngd_GpuCV)
                SGE::XMLWriteVal(_XML_Root,"GpuMngd",	currentVal);
        
        if((m_ObjType & Obj_Input_Arr)==Obj_Input_Arr)
                SGE::XMLWriteVal(_XML_Root,"SrcArr",	currentVal);
        
        if((m_ObjType & Obj_Output_Arr)==Obj_Output_Arr)
                SGE::XMLWriteVal(_XML_Root,"DstArr",	currentVal);

        if((m_ObjType & Obj_Mask_Arr)==Obj_Mask_Arr)
                SGE::XMLWriteVal(_XML_Root,"Mask",	currentVal);

        if((m_ObjType & Obj_Param)==Obj_Param)
                SGE::XMLWriteVal(_XML_Root,"Param",	currentVal);

        if((m_ObjType & Obj_UNKOWN_Arr)==Obj_UNKOWN_Arr)
                SGE::XMLWriteVal(_XML_Root,"UNKOWN_TYPE",	currentVal);

        SGE::XMLWriteVal(_XML_Root,"DevNotes",	m_DevNotes);

        return _XML_Root;
}
//======================================================






//======================================================
//======================================================
CL_GenSwFn::CL_GenSwFn(const std::string &_name):
SGE::CL_XML_BASE_OBJ<std::string>(_name, "FctDef")
,m_Fntype("")
,m_FnName("")
,m_Argstr("")
,m_SwFnType("")
,m_Dst_Arr()
,m_Src_Arr()
,m_RequireSwitching(false)
//,m_Args_Type()
//,m_Args_Name()
//,m_Args_DefltVal()
{

};

bool CL_GenSwFn::MatchBrackets(std::string &currArg, size_t &StartBracketPos, size_t &StopBracketPos)
{

        std::string TempStr=currArg;

        size_t Start	= 0;
        size_t End		= 0;
        bool loop		= true;

        int StartBrkts	= 0;
        int EndBrkts	= 0;
        StartBracketPos = StopBracketPos = 0;

        do 
        {
                Start			= TempStr.find_first_of("(");

                if (Start!=std::string::npos)
                {
                        if(Start>1)
                        {
                                //Start			= TempStr.find_first_of("(");
                                //if (Start!=std::string::npos)
                                //	break;
                                StartBracketPos = Start;
                                //StartBrkts++;
                                for(size_t i =Start; i < TempStr.size(); i++)
                                {
                                        if(TempStr[i]==')')
                                                EndBrkts++;
                                        else if(TempStr[i]=='(')
                                                StartBrkts++;
                                        if(EndBrkts==StartBrkts)
                                        {
                                                StopBracketPos = i;
                                                loop=false;
                                                break;
                                        }
                                }
                                //StartBrkts++;
                        }
                        else
                                TempStr = TempStr.substr(Start+1, TempStr.size()-Start-1);
                        /*End				= TempStr.find_first_of(")");
                        if (End!=std::string::npos)
                        {
                                EndBrkts++;
                        }
                        else loop=false;
                        */
                }
                else loop=false;
        }
        while (loop);

        if(StartBracketPos!= StopBracketPos && StopBracketPos!=0)
                return true;//>1 && StartBrkts==EndBrkts) return true;
        else
                return false;


}
//================================================
bool CL_GenSwFn::ParseLine(const std::string &line)
{
        std::string args, currArg, subarg, func_name_args;

        size_t Start	= 0;
        size_t End		= 0;
        size_t Start_sp = 0;
        size_t Start_st = 0;
        size_t Start_am = 0;

        //read function type, name and args...
        Start			= line.find_first_of(" ");
        if(Start==std::string::npos)
                return false;
        m_Fntype = line.substr(0, Start);
        func_name_args	= line.substr(Start, line.size());
        SGE::StrTrimLR(func_name_args);
        //check the const califier
        if(m_Fntype=="const")
        {
                Start = func_name_args.find_first_of(" ");
                m_Fntype += " ";
                m_Fntype += func_name_args.substr(0, Start);
                func_name_args = func_name_args.substr(Start, line.size());
        }
        //get function name
        SGE::StrTrimLR(func_name_args);
        Start			= func_name_args.find_first_of("(");
        if(Start==std::string::npos)
                return false;
        m_FnName		= func_name_args.substr(0, Start);
        if(m_FnName == "cvDilate")
        {//juste for breakpoint...
                m_FnName = m_FnName;
        }
        //get function short name without cv
        size_t Pos	=	m_FnName.find_first_of("cv");
        if (Pos!=std::string::npos)
                m_FnShortName =	m_FnName.substr(Pos+2, m_FnName.size());
        else
                m_FnShortName =	m_FnName;
        //get args
        End				= func_name_args.find_first_of(";");
        if(Start==std::string::npos)
                return false;
        args			= func_name_args.substr(Start, End);
        m_Argstr		= args;
        SGE::StrTrimLR(m_FnName);
        //SGE::StrTrimLR(m_Argstr);

        //====================
        bool loop=true;

        size_t BracketPosStart=0;
        size_t BracketPosStop=0;
        //parse function args.
        do 
        {
                if(args=="")
                        break;
                Start			= args.find_first_of(","); // write a function that check the number of open nd close brackets then include ot disclude accordingly the arguement

                if(MatchBrackets(args, BracketPosStart, BracketPosStop))
                {
                        if(BracketPosStart<Start)
                        {
                                currArg = args.substr(1, BracketPosStop/*BracketPosStart-1*/);
                                //??? bug when having several optional arguments? Start = -1;
                        }
                        else
                                currArg			= args.substr(1, Start-1);
                }
                else
                        currArg			= args.substr(1, Start-1);
/*
                if (MatchBrackets(currArg))
                {
                        Start			= currArg.find_first_of("(");
                        subarg			= currArg.substr(1,Start);
                        //if(currArg.find_first_of(" "))
                        m_Args_Type.push_back(subarg.substr(1,currArg.find_first_of(" ")));
                        m_Args_Name.push_back(subarg.substr(currArg.find_first_of(" "),currArg.size()));

                        currArg		= currArg.substr(currArg.find_last_of(")")+1, currArg.size());
                }
*/		if (currArg.find_last_of(";")!=std::string::npos)
                        loop=false;
                else if (Start==std::string::npos)
                        loop=false;

                args			= args.substr(Start+1,args.size());
                if(args!="")
                {
                        m_ArgsList.push_back(new CL_FctAgrs(currArg));
                }
        }
        while(loop);//End==std::string::npos);

        //Start			= func_type.find_last_of(" ");
        //m_FnName		= currArg.substr(Start+1,func_type.size()-1);
        //m_Fntype		= currArg.substr(0, Start);

        UpdateSwFnTypeDef();
        SetID(m_FnName);
        return true;
};

CL_GenSwFn::~CL_GenSwFn()
{
};


#if 0//..???moved
#define GPUCV_SWITCH__LICENSE_FILE	GetGpuCVSettings()->GetShaderPath() + std::string ("../etc/sed/license.h")
#define GPUCV_SWITCH__TOP_H_FILE	GetGpuCVSettings()->GetShaderPath() + std::string ("../etc/sed/cv.h/cv.top.h")
#define GPUCV_SWITCH__TOP_CPP_FILE	GetGpuCVSettings()->GetShaderPath() + std::string ("../etc/sed/cv.h/cv.top.cpp")
#define GPUCV_SWITCH__BOTTOM_H_FILE GetGpuCVSettings()->GetShaderPath() + std::string ("../etc/sed/cv.h/cv.bottom.h")
#define GPUCV_SWITCH__BOTTOM_CPP_FILE	GetGpuCVSettings()->GetShaderPath() + std::string ("../etc/sed/cv.h/cv.bottom.cpp")
#endif

/* To generate the following string -

void cvswSub(CvArr* src1, CvArr* src2, CvArr* dst, CvArr* mask)

*/
std::string CL_GenSwFn::GenSwFnDeclaration(ENUM_SrcFileType _fileType)
{		
        std::string SwitchFnDec;

        SwitchFnDec		= m_Fntype;
        SwitchFnDec		+=	" ";
        SwitchFnDec		+=	_GCV_SWITCH_FCT_PREFIX;//"cvgSw"
        SwitchFnDec		+=	m_FnShortName;
        SwitchFnDec		+=	"(";

        for (size_t i = 0; i < m_ArgsList.size(); i++)
        {
                if(m_ArgsList[i]->GetName()=="")
                        continue;
                if(i!=0)
                        SwitchFnDec	+=  ", ";
                
                SwitchFnDec		+=	m_ArgsList[i]->GenDefinition(_fileType);
                
        }
        if(_fileType==FILETYPE_H)
                SwitchFnDec		+= ");\n";
        else
                SwitchFnDec		+= ")\n";
        return SwitchFnDec;
}


/* To generate the following -

typedef void(*CVGType_Sub)(CvArr*,CvArr*,CvArr*,CvArr*);
*/
void CL_GenSwFn::UpdateSwFnTypeDef()
{
        std::string SwfnType;
        std::string Type, LastPart;
        std::string TempStr;
        
        int SwfnTypeNbr = 0;
        size_t Start = 0;
        
        TempStr		 = m_Argstr; //( const CvArr* src, CvArr* dst, CvPoint offset, int bordertype, CvScalar value CV_DEFAULT(cvScalarAll(0)));

        //generate function typedef name
        m_FnTypeDef = "TypeDef_";
        m_FnTypeDef += _GCV_SWITCH_FCT_PREFIX;
        m_FnTypeDef += "_";
        m_FnTypeDef += m_FnShortName;
        //==========================

        m_SwFnType	 = "\ttypedef ";
        m_SwFnType	+= m_Fntype;
        m_SwFnType	+= "(*";
        m_SwFnType	+= m_FnTypeDef;
        m_SwFnType	+= ") (";

        //if(!m_Args_Type.empty())
        //	SwfnType	+= m_Args_Type[0];

        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                if(m_ArgsList[i]->GetName()=="")
                        continue;

                if(SwfnTypeNbr!=0)
                        m_SwFnType	+= ", ";
                //if(!m_Args_Type.empty())
                if(m_ArgsList[i]->GetObjType()==Obj_Param && m_ArgsList[i]->GetConst()==true)
                        m_SwFnType	+=  "const ";
                m_SwFnType	+= m_ArgsList[i]->GetType();
                SwfnTypeNbr++;
        }
        m_SwFnType	+= " ); \n";
}

/*
To generate : GPUCV_FUNCNAME("Erode");

*/
std::string CL_GenSwFn::GenSwchFnName()
{
        std::string FnName;

        FnName = "\tGPUCV_FUNCNAME(\"";
        FnName += m_FnName;
        FnName += "\");";
        FnName += "\n";

        return FnName;

}
//======================================================
void CL_GenSwFn::ParseArgsType()
{
        GPUCV_NOTICE("Fct " << GetID() << " Parsing " << m_ArgsList.size() << "arguments");
        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                GPUCV_NOTICE("\t" << i << " args: " << m_ArgsList[i]->GetType() << ","<< m_ArgsList[i]->GetName());
                //fill the input/ouput image table
                if((m_ArgsList[i]->GetObjType() & Obj_Input_Arr)==Obj_Input_Arr)
                        this->m_Src_Arr.push_back(m_ArgsList[i]->GetName());
                else if((m_ArgsList[i]->GetObjType() & Obj_Output_Arr)==Obj_Output_Arr)
                        this->m_Dst_Arr.push_back(m_ArgsList[i]->GetName());

                if(m_ArgsList[i]->GetObjType() & Obj_Mngd_GpuCV)//object need to be managed by GPUCV
                        SetRequireSwitching(true);
        }
        //parsing return type:
        if(FindCheckPatternIntoStrings(this->m_Fntype, StrngsTableImage, sizeof(StrngsTableImage)/sizeof(std::string))!=-1)
                SetRequireSwitching(true);
}
//======================================================
/** Generate this strings:
\code
CvArr* SrcARR[]={src1, src2, mask};
CvArr* DstARR[]={dst};
\endcode
*/
std::string CL_GenSwFn::GenSwchInOutArr()
{
        std::string InArr, OutArr;

        if(m_Src_Arr.size())
                InArr = "\tCvArr* SrcARR[] = {";
        else
                InArr = "\tCvArr** SrcARR = NULL;\n";
        if(m_Dst_Arr.size())
                OutArr = "\tCvArr* DstARR[] = {";
        else
                OutArr = "\tCvArr** DstARR = NULL;\n";

        for (size_t i = 0; i < m_Src_Arr.size(); i++ )
        {
                if(i!=0)
                        InArr+= ", ";
                InArr+=" (CvArr*) ";
                InArr+= m_Src_Arr[i];
        }

        for (size_t i = 0; i < m_Dst_Arr.size(); i++ )
        {
                if(i!=0)
                        OutArr+= ", ";
                OutArr+=" (CvArr*) ";
                OutArr+= m_Dst_Arr[i];
        }

        //add some comments for unknown input/output
        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                if(m_ArgsList[i]->GetObjType()& (Obj_UNKOWN_Arr-Obj_Mngd_GpuCV))
                {
                        OutArr+= "\n//Parameter ";
                        OutArr+= m_ArgsList[i]->GetName();
                        OutArr+= " has unknown input/output type\n";
                }
        }

        if(m_Src_Arr.size()!=0)
                InArr +="};\n";
        if(m_Dst_Arr.size()!=0)
                OutArr +="};\n";

        InArr += OutArr;

        return InArr;
}
//======================================================




/*
SWITCH_START_OPR(dst);
RUNOP((src1,src2,dst,mask), CVGType_AddS);
SWITCH_STOP_OPR();
*/
//=====================================
std::string CL_GenSwFn::GenNoSwitch()
{
        std::string StRunSp= "\t";

        //	size_t Start, End;
        int Nbr=0;

        if(m_Fntype!="void")
                StRunSp += "return ";

        StRunSp += m_FnName;

        StRunSp += "(";		
        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                if(m_ArgsList[i]->GetName()=="")
                        continue;
                if(Nbr!=0)
                        StRunSp+= ", ";
                StRunSp	+= "(";
                if(m_ArgsList[i]->GetObjType()==Obj_Param && m_ArgsList[i]->GetConst()==true)
                        StRunSp	+=  "const ";
                StRunSp	+=  m_ArgsList[i]->GetType();
                StRunSp	+=	") ";		
                StRunSp	+=	m_ArgsList[i]->GetName();
                Nbr++;
        }
        StRunSp += ");\n";
        return StRunSp;
}
//=====================================
std::string CL_GenSwFn::GenDevComments()
{
        std::string StRunSp;
        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                if(m_ArgsList[i]->GetDevNotes()=="")
                        continue;
                StRunSp	+= "\n\t //Dev notes for argument '" + m_ArgsList[i]->GetName();
                StRunSp	+= "': ";
                StRunSp	+= m_ArgsList[i]->GetDevNotes()+"\n";
        }
        return StRunSp;
}
//=====================================
std::string CL_GenSwFn::GenStrtRunStop()
{
        std::string StRunSp;
//	size_t Start, End;
        int Nbr=0;

        if(m_Fntype!="void")
        {
                StRunSp += "\t";
                StRunSp += m_Fntype;
                StRunSp += " ReturnObj;";
        }
        StRunSp += "\tSWITCH_START_OPR(";
        if (!m_Dst_Arr.empty())
                StRunSp += m_Dst_Arr[0];
        else
                StRunSp += "NULL";
        StRunSp += "); \n";

        //check if we have a mask image...
        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                if((m_ArgsList[i]->GetObjType() & Obj_Mask_Arr)==Obj_Mask_Arr)
                {
                        StRunSp += "//Mask has been found, add it to params.\n";
                        StRunSp += "\t if(paramsobj &&";
                        StRunSp += m_ArgsList[i]->GetName()+")paramsobj->AddParam(\"option\", \"MASK\");\n";
                }
        }
        
        StRunSp += "\tRUNOP((";		
        //list of args
        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                if(m_ArgsList[i]->GetName()=="")
                        continue;
                if(Nbr!=0)
                        StRunSp+= ", ";
                StRunSp	+= "(";
                if(m_ArgsList[i]->GetObjType()==Obj_Param && m_ArgsList[i]->GetConst()==true)
                        StRunSp	+=  "const ";
                StRunSp	+=  m_ArgsList[i]->GetType();
                StRunSp	+=	") ";		
                StRunSp	+=	m_ArgsList[i]->GetName();
                Nbr++;
        }
        StRunSp += "), ";
        //==================
        //Start	=	m_SwFnType.find_first_of("*");
        //End		=	m_SwFnType.find_first_of(")");
        StRunSp += m_FnTypeDef;
        
        //return option...part 1
        StRunSp += ", ";
        if(m_Fntype!="void")
        {
//		StRunSp += m_Fntype;
                StRunSp += " ReturnObj =";
        }
        //=======================
        StRunSp += "); \n";
        StRunSp += "\tSWITCH_STOP_OPR();\n";

        //return option...part 2
        if(m_Fntype!="void")
        {
                StRunSp += "\treturn ReturnObj;\n\n";
        }
        //==================

        return StRunSp;
}
//======================================================
TiXmlElement* CL_GenSwFn::XMLLoad(TiXmlElement* _XML_Root)
{
        SG_Assert(_XML_Root, "No XML root");
        //Load id
        SGE::CL_XML_BASE_OBJ<std::string>::XMLLoad(_XML_Root);

        //Load values
        SGE::XMLReadVal(_XML_Root,"Type",		m_Fntype);
        SGE::XMLReadVal(_XML_Root,"Name",		m_FnName);
        SGE::XMLReadVal(_XML_Root,"ShortName",	m_FnShortName);
//	SGE::XMLReadVal(_XML_Root,"TypeDef",	m_FnTypeDef);
        SGE::XMLReadVal(_XML_Root,"ArgStr",		m_Argstr);
//	SGE::XMLReadVal(_XML_Root,"SwType",		m_SwFnType);

        SGE::XMLLoadVector<CL_FctAgrs>(_XML_Root, m_ArgsList, "ArgList", "Arg");

        UpdateSwFnTypeDef();
        ParseArgsType();
        return _XML_Root;
}
//======================================================
TiXmlElement* CL_GenSwFn::XMLSave(TiXmlElement* _XML_Root)
{
        SG_Assert(_XML_Root, "No XML root");
        //save id
        SGE::CL_XML_BASE_OBJ<std::string>::XMLSave(_XML_Root);

        //save values
        SGE::XMLWriteVal(_XML_Root,"Type",		m_Fntype);
        SGE::XMLWriteVal(_XML_Root,"Name",		m_FnName);
        SGE::XMLWriteVal(_XML_Root,"ShortName", m_FnShortName);
//	SGE::XMLWriteVal(_XML_Root,"TypeDef",	m_FnTypeDef);
        SGE::XMLWriteVal(_XML_Root,"ArgStr",	m_Argstr);
//	SGE::XMLWriteVal(_XML_Root,"SwType",	m_SwFnType);

        SGE::XMLSaveVector<CL_FctAgrs>(_XML_Root, m_ArgsList, "ArgList", "Arg");
        return _XML_Root;
}
//======================================================

}//namespace GCV

Powered by WebSVN v1.61