Subversion

gpucv

[/] [experimental/] [trunk/] [gpucv/] [src/] [lib/] [GPUCVSwitch/] [Cl_GenSw_Fct.cpp] - Rev 569 Go to most recent revision

Compare with Previous - Blame


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

namespace GCV{

#define SW_ARR_GPU_IMPLS ",\n{GpuCVSettings::GPUCV_IMPL_GLSL, NULL, NULL, true, GenericGPU::HRD_PRF_2},\n\
{GpuCVSettings::GPUCV_IMPL_CUDA, NULL, NULL, true, GenericGPU::HRD_PRF_CUDA}\n}; \n "

using namespace std;
using namespace GCV;

/*static*/ SGE::CL_TEMPLATE_OBJECT_MANAGER<CL_GenSwFn, std::string> * CL_GenSwFn::m_FctObjMngr = NULL;

CL_GenSwFn::CL_GenSwFn(const std::string &_name):
SGE::CL_BASE_OBJ<std::string>(_name)
,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);
        //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*/);
                                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());
                FctAgrs NewArgs = ParseArgument(currArg);
#if 0
                Start_sp		= currArg.find_last_of(" ");
                Start_st		= currArg.find_last_of("*");
                Start_am		= currArg.find_last_of("&");

                Start			= (Start_sp < Start_st) ? Start_sp : Start_st;
                Start			= (Start < Start_am) ? Start : Start_am;

                if (Start==Start_sp)
                {
                        if (currArg.substr(0,Start).find_last_of(" ")!=std::string::npos)
                        {
                                subarg			= currArg.substr(0,Start);
                                Start			= subarg.find_last_of(" ");
                                if (Start!=std::string::npos)
                                        subarg			= subarg.substr(Start+1,currArg.size());
                        }
                        else 
                        {
                                if (currArg.find_last_of(";")!=std::string::npos)
                                        subarg			= currArg.substr(Start+1,currArg.substr(Start+1,currArg.size()).size()-2);
                                else 
                                        subarg			= currArg.substr(Start+1,currArg.size());
                        }
                }


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

                else
                subarg			= currArg.substr(Start+1,currArg.size());


                
                NewArgs.m_name = subarg;
                subarg			= currArg.substr(0, Start+1);
                NewArgs.m_type = subarg;
                NewArgs.m_defaultVal = "";
#endif
                m_ArgsList.push_back(NewArgs);
                /*	if(subarg.substr(0, strlen("const"))=="const")
                {
                        subarg = subarg.substr(strlen("const")+1, subarg.size());
                }
                else
                */
                //End				= currArg.find_first_of(";");
        }
        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);

        m_SwFnType		= GenSwFnTypeDef();
        SetID(m_FnName);
        return true;
};

CL_GenSwFn::~CL_GenSwFn()
{
};



#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")


void CL_GenSwFn::AppendFileToFnsFile(ofstream & fileswfns, std::string FileName)
{
        SG_AssertFile(SGE::CL_BASE_OBJ_FILE::FileExists(FileName),FileName, "File does not exist");

        fstream NewFile(FileName.data());
        char str[2000];
        while (!NewFile.eof())
        {
                NewFile.getline(str, 2000);
                fileswfns << str << std::endl;
        }
        NewFile.close();
}

void CL_GenSwFn::AddObjsToFns_H(std::string Outfilename, std::string OUT_FILEPATH) //as argument
{
        GPUCV_NOTICE("\n\tGenerating "<< OUT_FILEPATH << "/" <<Outfilename);

        //SG_Assert(CL_GenSwFn::GetFctObjMngr()->GetCount()==0, "CL_GenSwFn::AddObjsToFns_H() must be called after funtcion CL_GenSwFn::AddObjsToFns_CPP()");

        ifstream funcfile;
        ofstream fileswfns;
        string FileOut = OUT_FILEPATH;
        FileOut += "/";
        FileOut += Outfilename;
        fileswfns.open(FileOut.data());
        std::string  swfns;

        std::string BaseFileName = Outfilename.substr(0, Outfilename.size()-2);//remove ".h"
        std::string HeaderFileMacro = "__";
        HeaderFileMacro += BaseFileName;
        HeaderFileMacro += "_H";
        HeaderFileMacro = SGE::StringToUpper(HeaderFileMacro );



        //Create an output file
                AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__LICENSE_FILE);
                AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__TOP_H_FILE);

                swfns	= "#ifndef ";
                swfns	+= HeaderFileMacro;
                swfns	+= "\n#define ";
                swfns	+= HeaderFileMacro;
                swfns	+= "\n";
                fileswfns << swfns ;
                swfns="";

                fileswfns << "\n#include <" << BaseFileName<< "/config.h>\n";
                int FctNbr =0;
                CL_GenSwFn *LocalFctGen = NULL;
                std::string SpareLine;
                
                //export macro
                std::string ExportStr = "_";
                ExportStr += SGE::StringToUpper(BaseFileName);
                ExportStr += "_EXPORT_C ";
                
                int iPos=0;
                
                fileswfns << "void cvg_" << swfns << "_RegisterTracerSingletons(SG_TRC::TTCL_APPLI_TRACER<SG_TRC::SG_TRC_Default_Trc_Type> * _pAppliTracer, SG_TRC::CL_TRACING_EVENT_LIST *_pEventList);\n";



                //start iterating functions
                SGE::CL_TEMPLATE_OBJECT_MANAGER<CL_GenSwFn, std::string>::iterator itFunct;

                
                for(itFunct=CL_GenSwFn::GetFctObjMngr()->GetFirstIter();
                        itFunct!=CL_GenSwFn::GetFctObjMngr()->GetLastIter();
                        itFunct++)
                {
                        //if(!itFunct)
                        //	continue;
                        swfns += ExportStr;
                        swfns	+=	(*itFunct).second->GenSwFnDeclaration(FILETYPE_H);
                }
                fileswfns << swfns;
                fileswfns << "/*........End Declaration.............*/" << "\n";
                AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__BOTTOM_H_FILE);
                swfns	= "\n#endif //";
                swfns	+= HeaderFileMacro;
                fileswfns << swfns;
                fileswfns.close();
}


void CL_GenSwFn::AddObjsToFns_H_WRAPPER(std::string Outfilename, std::string OUT_FILEPATH) //as argument
{
        GPUCV_NOTICE("\n\tGenerating "<< OUT_FILEPATH << "/" <<Outfilename);
        //SG_Assert(CL_GenSwFn::GetFctObjMngr()->GetCount()==0, "CL_GenSwFn::AddObjsToFns_H() must be called after funtcion CL_GenSwFn::AddObjsToFns_CPP()");

        ifstream funcfile;
        ofstream fileswfns;
        string FileOut = OUT_FILEPATH;
        FileOut += "/";
        FileOut += Outfilename;
        FileOut += "_wrapper.h";
        fileswfns.open(FileOut.data());
        std::string  swfns;

        std::string BaseFileName = Outfilename.substr(0, Outfilename.size()-2);//remove ".h"
        std::string HeaderFileMacro = "__";
        HeaderFileMacro += BaseFileName;
        HeaderFileMacro += "_H";
        HeaderFileMacro = SGE::StringToUpper(HeaderFileMacro );



        //Create an output file
        AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__LICENSE_FILE);
        AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__TOP_H_FILE);

        int FctNbr =0;
        CL_GenSwFn *LocalFctGen = NULL;
        std::string SpareLine;
        int iPos=0;;


        SGE::CL_TEMPLATE_OBJECT_MANAGER<CL_GenSwFn, std::string>::iterator itFunct;

        swfns	+= "#ifndef ";
        swfns	+= HeaderFileMacro;
        swfns	+= "\n#define ";
        swfns	+= HeaderFileMacro;
        swfns	+= "\n";

        fileswfns << swfns;
        
        //include file containing the cvgws* functions...
        swfns	= "\n\n#include <";
        swfns	+= Outfilename;
        swfns	+= "/";
        swfns	+= 	Outfilename;
        swfns	+= 	".h";
        swfns	+= ">\n";
        fileswfns << swfns;

        std::string BaseName;
        std::string NewName;
        size_t Start=0;

        for(itFunct=CL_GenSwFn::GetFctObjMngr()->GetFirstIter();
                itFunct!=CL_GenSwFn::GetFctObjMngr()->GetLastIter();
                itFunct++)
        {
                //get function names
                BaseName = (*itFunct).second->GetIDStr();
                NewName = _GCV_SWITCH_FCT_PREFIX;//"cvgSw";
                NewName	+=	(*itFunct).second->m_FnShortName;

                //write definitions
                //swfns ="\n#ifdef ";
                //swfns +=	BaseName;
                //swfns +="\n#undef "	;
                //swfns +=	BaseName;
                swfns ="\n#define ";
                swfns +=	BaseName;
                swfns +="\t ";
                swfns +=	NewName;
                //swfns +="\n;//#endif\n";
                fileswfns << swfns;
        }
        fileswfns << "\n/*........End Declaration.............*/" << "\n";
        AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__BOTTOM_H_FILE);
        swfns	= "\n#endif //";
        swfns	+= HeaderFileMacro;
        fileswfns << swfns;
        fileswfns.close();
}


void CL_GenSwFn::AddObjsToFns_CPP(	std::string Infilename, std::string IN_FILEPATH, \
                                std::string Outfilename, std::string OUT_FILEPATH) //as argument
{
        GPUCV_NOTICE("\n\tGenerating "<< OUT_FILEPATH << "/" <<Outfilename);
        GPUCV_NOTICE("\tFrom "<< IN_FILEPATH << "/" <<Infilename);
        
        ifstream funcfile;
        ofstream fileswfns;
        string FileIn = IN_FILEPATH;
        FileIn += "/";
        FileIn += Infilename;
        string FileOut = OUT_FILEPATH;
        FileOut += "/";
        FileOut += Outfilename;
        funcfile.open(FileIn.data(),  ifstream::in);
        fileswfns.open(FileOut.data());
        std::string line, swfns;

        //Create an output file
        if(funcfile.is_open())
        {
                AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__LICENSE_FILE);
                AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__TOP_CPP_FILE);

                
                size_t DotPos = Outfilename.find_last_of(".");
                if(DotPos != std::string::npos)
                        swfns	= Outfilename.substr(0, DotPos);
                else
                        swfns	= Outfilename;



                fileswfns << "\n#include <" << swfns << "/" << swfns << ".h>\n";
                fileswfns << "#include <GPUCVSwitch/switch.h>";
                

                //add a first common function to register profiling singletons
                fileswfns << std::endl << "/*====================================*/" <<std::endl;
                fileswfns << "void cvg_" << swfns << "_RegisterTracerSingletons(SG_TRC::TTCL_APPLI_TRACER<SG_TRC::SG_TRC_Default_Trc_Type> * _pAppliTracer, SG_TRC::CL_TRACING_EVENT_LIST *_pEventList)\n";
                fileswfns << "{\nSG_TRC::TTCL_APPLI_TRACER<SG_TRC::SG_TRC_Default_Trc_Type>::Instance().RegisterNewSingleton(_pAppliTracer);\n";
                fileswfns << "SG_TRC::CL_TRACING_EVENT_LIST::Instance().RegisterNewSingleton(_pEventList);\n";
                fileswfns << "}\n/*====================================*/\n";


                int FctNbr =0;
                CL_GenSwFn *LocalFctGen = NULL;
                std::string SpareLine;
                size_t iPos=0;;
                do
                {
                        //we check that we do not have several function definition on the same line
                                if(SpareLine=="")
                                        getline (funcfile,line);
                                else
                                {
                                        getline (funcfile,line);
                                        line = SpareLine + line;
                                        SpareLine="";
                                }

                                iPos=line.find_first_of(";");

                                if(iPos!=std::string::npos)
                                {//we have a ';'
                                        if(iPos!=line.size()-1)
                                        {//it is not the end of the line
                                                line = line.substr(0, iPos);
                                                SpareLine = line.substr(iPos, line.size());
                                        }
                                }
                        //=====================

                        if(line=="")
                                continue;
                        //funcfile.getline(line);
                        if(!line.empty())
                        {
                                LocalFctGen = new CL_GenSwFn("");
                                if(LocalFctGen->ParseLine(line))
                                {
                                        if(CL_GenSwFn::GetFctObjMngr()->Find(LocalFctGen->GetID()))
                                        {
                                                GPUCV_WARNING("A function has been found twice in the header file: \n "<< LocalFctGen->GetID());
                                                delete LocalFctGen;
                                                continue;
                                        }
                                        else if (LocalFctGen->GetID().substr(0, 2) != "cv")
                                        {
                                                GPUCV_WARNING("A function has not a cv* like name, exiting wrapping: \n "<< LocalFctGen->GetID());
                                                delete LocalFctGen;
                                                continue;
                                        }
                                        CL_GenSwFn::GetFctObjMngr()->AddObj(LocalFctGen);

                                        //call generate Funct and concat result into a string

                                        //swfns    =  LocalFctGen->m_Fntype;
                                        LocalFctGen->ParseArgsType();
                                        swfns	= "\n/*====================================*/\n";
                                        swfns	+=	LocalFctGen->GenSwFnDeclaration(FILETYPE_CPP);
                                        swfns	+= "{\n";

                                        if(LocalFctGen->m_Src_Arr.empty() 
                                                && LocalFctGen->m_Dst_Arr.empty() 
                                                && !LocalFctGen->m_requireSwitching
                                                )
                                        {//no input or output images, no need to switch!
                                                GPUCV_NOTICE("Function do not have input image:" << LocalFctGen->GetID());
                                                GPUCV_NOTICE("Function do not have output image:" << LocalFctGen->GetID());

                                                swfns	+=	LocalFctGen->GenNoSwitch();
                                        }
                                        else
                                        {//we switch
                                                swfns	+=	LocalFctGen->GenSwFnTypeDef();
                                                //swfns	+=	LocalFctGen->GenSwchImpnsArr(); no need any more...
                                                swfns	+=	LocalFctGen->GenSwchFnName();
                                                swfns	+=	LocalFctGen->GenSwchInOutArr();
                                                swfns	+=	LocalFctGen->GenStrtRunStop();
                                        }
                                        swfns	+= "}\n";
                                        fileswfns << swfns << "\n";
                                        FctNbr++;
                                }
                                else
                                {
                                        GPUCV_ERROR("Error parsing line: \n=>" << line);
                                }
                        }
                        //if (FctNbr>10)
                        //	break;//just for debugging....
                }
                while (!funcfile.eof());
                fileswfns << "/*........End Code.............*/" << "\n";
                AppendFileToFnsFile(fileswfns, GPUCV_SWITCH__BOTTOM_CPP_FILE);
                funcfile.close();
                fileswfns.close();
                //save output file/...
                /*		string outfile = OUT_FILEPATH;
                outfile += "/";
                outfile += Outfilename;
                */
                
        }

        else 

                GPUCV_NOTICE("Empty File");
}

/* 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(i!=0)
                        SwitchFnDec	+=  ", ";
                if(m_ArgsList[i].m_objType==Obj_Param && m_ArgsList[i].m_const==true)
                        SwitchFnDec	+=  "const ";
                SwitchFnDec		+=	m_ArgsList[i].m_type;
                SwitchFnDec		+=	" ";
                SwitchFnDec		+=	m_ArgsList[i].m_name;
                if(_fileType==FILETYPE_H && m_ArgsList[i].m_defaultVal!="")
                {
                        SwitchFnDec		+=	" ";
                        SwitchFnDec		+=	m_ArgsList[i].m_defaultVal;
                }
        }
        if(_fileType==FILETYPE_H)
                SwitchFnDec		+= ");\n";
        else
                SwitchFnDec		+= ")\n";
        return SwitchFnDec;
}




/* To generate the following -

typedef void(*CVGType_Sub)(CvArr*,CvArr*,CvArr*,CvArr*);
*/
std::string CL_GenSwFn::GenSwFnTypeDef()
{
        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;
        //==========================

        SwfnType	 = "\ttypedef ";
        SwfnType	+= m_Fntype;
        SwfnType	+= "(*";
        SwfnType	+= m_FnTypeDef;
        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].m_name=="")
                        continue;

                if(SwfnTypeNbr!=0)
                        SwfnType	+= ", ";
                //if(!m_Args_Type.empty())
                if(m_ArgsList[i].m_objType==Obj_Param && m_ArgsList[i].m_const==true)
                        SwfnType	+=  "const ";
                SwfnType	+= m_ArgsList[i].m_type;
                SwfnTypeNbr++;
        }


        SwfnType	+= " ); \n";

        return SwfnType;
}


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

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

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

        return FnName;

}



/*	To generate the following string -
static switchFctStruct SwitchImplementations[]={
{GpuCVSettings::GPUCV_IMPL_OPENCV, (PROC)cvSub, NULL, false, GenericGPU::HRD_PRF_0}
,{GpuCVSettings::GPUCV_IMPL_GLSL, (PROC)cvgSub, NULL, true, GenericGPU::HRD_PRF_2}
//,{GpuCVSettings::GPUCV_IMPL_CUDA, (PROC)cvgCudaAdd, NULL, true, GenericGPU::HRD_PRF_CUDA}
};
*/
std::string CL_GenSwFn::GenSwchImpnsArr()
{
#if 0
        std::string SwOp;
        SwOp = "\tstatic switchFctStruct SwitchImplementations[]={";
        SwOp += "\n";
        SwOp += "\t{GpuCVSettings::GPUCV_IMPL_OPENCV, (PROC)";
        SwOp += m_FnName;
        SwOp +=	", NULL, false, GenericGPU::HRD_PRF_0}";
        SwOp += SW_ARR_GPU_IMPLS;
        SwOp += "\n\t";


        return SwOp;
#endif
        return "";
}

void CL_GenSwFn::ParseArgsType()
{
        std::string StrngsTableSrc[] = {
                "src"
                ,"mask"
                //cvIntegral
                ,"image"		
        };
        std::string StrngsTableDst[] = {
                "dst"
                //cvIntegral
                ,"sum"
                ,"sqsum"
                ,"tilted_sum"
                //cvWatershed
                ,"markers"
        };

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

        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].m_type << ","<< m_ArgsList[i].m_name);
                if (CheckImageStrngs(m_ArgsList[i].m_type, StrngsTableImage, sizeof(StrngsTableImage)/sizeof(std::string) ))
                {
                        if(m_ArgsList[i].m_type.find("**")!=std::string::npos)
                        {//when it is a pointer to pointer we do not manage it ... 
                                m_ArgsList[i].m_objType = Obj_Mngd_GpuCV;
                                m_requireSwitching = true;
                        }
                        else if(m_ArgsList[i].m_const==true)//we suppose const object are source object ;-)
                        {
                                m_Src_Arr.push_back(m_ArgsList[i].m_name);
                                m_ArgsList[i].m_objType = Obj_Input_Arr;
                        }
                        else if (CheckImageStrngs(m_ArgsList[i].m_name, StrngsTableSrc, sizeof(StrngsTableSrc)/sizeof(std::string)))
                        {
                                m_Src_Arr.push_back(m_ArgsList[i].m_name);
                                m_ArgsList[i].m_objType = Obj_Input_Arr;
                        }
                        else if (CheckImageStrngs(m_ArgsList[i].m_name, StrngsTableDst, sizeof(StrngsTableDst)/sizeof(std::string)))
                        {
                                m_Dst_Arr.push_back(m_ArgsList[i].m_name);
                                m_ArgsList[i].m_objType = Obj_Output_Arr;
                        }
                }
                else
                {
                        m_ArgsList[i].m_objType = Obj_Param;
                }
        }
        //parsing return type:
        if(CheckImageStrngs(this->m_Fntype, StrngsTableImage, sizeof(StrngsTableImage)/sizeof(std::string)))
                m_requireSwitching = true;
                
}
//CvArr* SrcARR[]={src1, src2, mask};
//CvArr* DstARR[]={dst};
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];
        }

        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].m_name=="")
                        continue;
                if(Nbr!=0)
                        StRunSp+= ", ";
                StRunSp	+= "(";
                if(m_ArgsList[i].m_objType==Obj_Param && m_ArgsList[i].m_const==true)
                        StRunSp	+=  "const ";
                StRunSp	+=  m_ArgsList[i].m_type;
                StRunSp	+=	") ";		
                StRunSp	+=	m_ArgsList[i].m_name;
                Nbr++;
        }
        StRunSp += ");\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";
        
        StRunSp += "\tRUNOP((";		
        //list of args
        for (size_t i = 0; i < m_ArgsList.size(); i++ )
        {
                if(m_ArgsList[i].m_name=="")
                        continue;
                if(Nbr!=0)
                        StRunSp+= ", ";
                StRunSp	+= "(";
                if(m_ArgsList[i].m_objType==Obj_Param && m_ArgsList[i].m_const==true)
                        StRunSp	+=  "const ";
                StRunSp	+=  m_ArgsList[i].m_type;
                StRunSp	+=	") ";		
                StRunSp	+=	m_ArgsList[i].m_name;
                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;
}



bool CL_GenSwFn::CheckImageStrngs(std::string inputstr, std::string * _patterns,
                                                                  int _patternsNbr
                                                                  )
{
        size_t Start = 0;
        bool Loop = true;

        for(int i =0; i < _patternsNbr; i++)
        {
                Start = inputstr.find(_patterns[i]);
                if (Start!=std::string::npos)
                        return true;
                /*DstBuffer += tempSource.substr(0,Start);
                tempSource =
                tempSource.substr(Start+_patterns[i].size(),tempSource.size());
                }
                DstBuffer += tempSource;
                tempSource = DstBuffer;*/
        }
        return false;//..??
}



FctAgrs ParseArgument(std::string &arg)
{
        FctAgrs CurArg;
        string LocalArgStr = arg;
        CurArg.m_fullStr = 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)
        {
                CurArg.m_defaultVal = LocalArgStr.substr(Start, LocalArgStr.size());
                LocalArgStr = LocalArgStr.substr(0, Start-1);
                if(CurArg.m_defaultVal[CurArg.m_defaultVal.size()-1]!=')')
                        CurArg.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)
        {
                CurArg.m_type = LocalArgStr.substr(0, Start+1);
                CurArg.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)
                {
                        CurArg.m_type = LocalArgStr.substr(0, Start_sp);
                        CurArg.m_name = LocalArgStr.substr(Start_sp+1, LocalArgStr.size());
                }
        }

        //trim all space that might be there...
        SGE::StrTrimLR(CurArg.m_type);
        SGE::StrTrimLR(CurArg.m_name);
        SGE::StrTrimLR(CurArg.m_defaultVal);

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

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

        if(CurArg.m_name=="" || CurArg.m_type=="")
        {
                int a =0;
                a++;
        }
#if 0	
        Start			= min(Start_sp, Start_st);
        Start			= min(Start,Start_am);

        if (Start==Start_sp)
        {
                if (arg.substr(0,Start).find_last_of(" ")!=std::string::npos)
                {
                        subarg			= arg.substr(0,Start);
                        Start			= subarg.find_last_of(" ");
                        if (Start!=std::string::npos)
                                subarg			= subarg.substr(Start+1,arg.size());
                }
                else 
                {
                        if (arg.find_last_of(";")!=std::string::npos)
                                subarg			= arg.substr(Start+1,arg.substr(Start+1,arg.size()).size()-2);
                        else 
                                subarg			= arg.substr(Start+1,arg.size());
                }
        }
        /*else if (Start==Start_st)	//		= arg.find_last_of("*");
        {
        if (arg.substr(0,Start).find_last_of(" ")!=std::string::npos)
        {
        subarg			= arg.substr(0,Start);
        Start			= subarg.find_last_of(" ");
        if (Start!=std::string::npos)
        subarg			= subarg.substr(Start+1,arg.size());
        }
        }*/
        else
                subarg			= arg.substr(Start+1,arg.size());
#endif
        return CurArg;
}


}//namespace GCV

Powered by WebSVN v1.61