Files
FC1/CryCommon/IScriptSystem.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

784 lines
26 KiB
C++
Raw Permalink Blame History

#ifndef _ISCRIPTSYSTEM_H_
#define _ISCRIPTSYSTEM_H_
#if !defined(_XBOX) && !defined(LINUX)
#ifdef CRYSCRIPTSYSTEM_EXPORTS
#define CRYSCRIPTSYSTEM_API __declspec(dllexport)
#else
#define CRYSCRIPTSYSTEM_API __declspec(dllimport)
#endif
#else
#define CRYSCRIPTSYSTEM_API
#endif
class ICrySizer;
struct IWeakScriptObject;
struct IScriptObject;
struct ISystem;
#define HSCRIPT void*
#define HSCRIPTFUNCTION unsigned int
enum {
//## [Sergiy] this is the same as LUA_NOREF; I think this is better to use since
//## in LUA documentation only LUA_NOREF(-2) and LUA_REFNIL (-1) are described as
//## special values, 0 isn't. Please put 0 here if you know for sure and it is documented
//## that 0 is invalid reference value for LUA
INVALID_SCRIPT_FUNCTION = -2
};
#define THIS_PTR void*
#define HTAG int
#define USER_DATA ULONG_PTR //## AMD Port
typedef int(*SCRIPT_FUNCTION)(HSCRIPT hScript);
typedef int HBREAKPOINT;
enum BreakState{
bsStepNext,
bsStepInto,
bsContinue,
bsNoBreak
};
struct IFunctionHandler;
struct IScriptDebugSink;
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/*! IScriptSystem callback interface
this interface must be implemented by host applicatio the use the scripting system
to receive error messages and notification
*/
// Summary:
// Callback interface.
// Description:
// This interface must be implemented by the host application in order to
// receive error messages and various notifications from the Scripting
// System.
struct IScriptSystemSink
{
/*! called by the scripting system when an error occur
@param sSourceFile the script file where the error occured
@param sFuncName the script function where the error occured
@param nLineNum the line number of the the script file where the error occured (-1 if there is no line no info)
@param sErrorDesc descriptio of the error
*/
virtual void OnScriptError(const char *sSourceFile,const char *sFuncName,int nLineNum,const char *sErrorDesc) = 0;
/*! called by the scripting system to ask for permission to change a global tagged value
@return true if permission is granted, false if not
*/
virtual bool CanSetGlobal (const char* sVarName) = 0;
/*! called by the scripting system when a global tagged value is set by inside a script
@param sVarName the name of the variable that has been changed
*/
virtual void OnSetGlobal(const char *sVarName) = 0;
/*! called by the scripting system for each load script when DumpLoadedScripts is called
@param sScriptPath path of a script
*/
virtual void OnLoadedScriptDump(const char *sScriptPath) = 0;
virtual void OnCollectUserData(INT_PTR nValue,int nCookie) = 0; //## AMD Port
};
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/*! main interface of the scripting engine
this interface is mapped 1:1 on a script state
all script loaded from the same interface instance are visible together
*/
struct IScriptSystem
{
//DOC-IGNORE-BEGIN
//! internal use
virtual IFunctionHandler *GetFunctionHandler()=0;
//! internal use
virtual HSCRIPT GetScriptHandle() = 0;
//DOC-IGNORE-END
/*! load a script file and run it
@param sFileName path of the script file
@param bRaiseError if true the script engine will call IScirptSystemSink::OnError() if
an error will occur
@return false if the execution fail if not true
REMARKS: all global variables and function declared into the executed script
will persist for all the script system lifetime
*/
virtual bool ExecuteFile(const char *sFileName,bool bRaiseError = true, bool bForceReload=false) = 0;
/*! execute an ASCII buffer
@param sBuffer an 8bit ASCII buffer containing the script that must be executed
@param bRaiseError if true the script engine will call IScirptSystemSink::OnError() if
an error will occur
@return false if the execution fail if not true
REMARKS: all global variables and function declared into the executed buffer
will persist for all the script system lifetime
*/
virtual bool ExecuteBuffer(const char *sBuffer, size_t nSize) = 0;
/*! unload a script
@param sFileName apath of the script file
NOTES: the script engine never load twice the same file(same path) because internally
stores a list of loaded files.This function simple remove the specified path from
this list
*/
virtual void UnloadScript(const char *sFileName) = 0;
/*! unload all scripts
NOTES: the script engine never load twice the same file(same path) because internally
stores a list of loaded files.This function simple remove all entries from
this list
*/
virtual void UnloadScripts() = 0;
/*! realod a script
@param sFileName apath of the script file
@param bRaiseError if true the script engine will call IScirptSystemSink::OnError() if
an error will occur
@return false if the execution fail if not true
*/
virtual bool ReloadScript(const char *sFileName,bool bRaiseError = true) = 0;
//! reload all scripts previously loaded
virtual bool ReloadScripts() = 0;
//! generate a OnLoadedScriptDump() for every loaded script
virtual void DumpLoadedScripts() = 0 ;
//! return a object that store all global variables as members
virtual IScriptObject *GetGlobalObject() = 0;
/*! create a new IScriptObject that is not mapped to a object in the script
this is used to store an object that lua pass to a C++ function
@return a pointer to the created object
*/
virtual IScriptObject* CreateEmptyObject() = 0;
/*! create a new IScriptObject
@return a pointer to the created object
*/
virtual IScriptObject* CreateObject() = 0;
/*! create a global IScriptObject
@param sName the name of the object into the script scope
@param pThis pointer to the C++ class that will receive a call from the script
[this parameter can be NULL]
@return a pointer to the created object
*/
virtual IScriptObject* CreateGlobalObject(const char *sName) = 0;
/*! start a call to script function
@param sTableName name of the script table that contai the function
@param sFuncName function name
CALLING A SCRIPT FUNCTION:
to call a function in the script object you must
call BeginCall
push all parameters whit PushParam
call EndCall
EXAMPLE:
m_ScriptSystem->BeginCall("Player","OnInit");
m_ScriptSystem->PushParam(pObj);
m_ScriptSystem->PushParam(nTime);
m_ScriptSystem->EndCall();
*/
//##@{
virtual int BeginCall(HSCRIPTFUNCTION hFunc) = 0; // M<>rcio: changed the return type
virtual int BeginCall(const char *sFuncName) = 0; // from void to int for error checking
virtual int BeginCall(const char *sTableName, const char *sFuncName) = 0;//
//##@}
/*! end a call to script function
@param ret reference to the variable that will store an eventual return value
*/
//##@{
virtual void EndCall()=0;
virtual void EndCall(int &nRet)=0;
virtual void EndCall(float &fRet)=0;
virtual void EndCall(const char *&sRet)=0;
#if defined(WIN64) || defined(LINUX)
inline void EndCall(char *&sRet) {EndCall ((const char*&)sRet);}
#endif
virtual void EndCall(bool &bRet)=0;
virtual void EndCall(IScriptObject *pScriptObject)=0;
//##@}
/*! function under development ingnore it*/
//##@{
virtual HSCRIPTFUNCTION GetFunctionPtr(const char *sFuncName) = 0;
virtual HSCRIPTFUNCTION GetFunctionPtr(const char *sTableName, const char *sFuncName) = 0;
//##@}
virtual void ReleaseFunc(HSCRIPTFUNCTION f) = 0;
/*! push a parameter during a function call
@param val value that must be pushed
*/
//##@{
virtual void PushFuncParam(int nVal) = 0;
virtual void PushFuncParam(float fVal) = 0;
virtual void PushFuncParam(const char *sVal) = 0;
virtual void PushFuncParam(bool bVal) = 0;
virtual void PushFuncParam(IScriptObject *pVal) = 0;
//##@}
/*! set a global script variable
@param sKey variable name
@param val variable value
*/
//##@{
virtual void SetGlobalValue(const char *sKey, int nVal) = 0;
virtual void SetGlobalValue(const char *sKey, float fVal) = 0;
virtual void SetGlobalValue(const char *sKey, const char *sVal) = 0;
virtual void SetGlobalValue(const char *sKey, IScriptObject *pObj) = 0;
//##@}
//! get the value of a global variable
//##@{
virtual bool GetGlobalValue(const char *sKey, int &nVal) = 0;
virtual bool GetGlobalValue(const char *sKey, float &fVal) = 0;
virtual bool GetGlobalValue(const char *sKey, const char * &sVal) = 0;
virtual bool GetGlobalValue(const char *sKey, IScriptObject *pObj) = 0;
virtual void SetGlobalToNull(const char *sKey) = 0;
//##@}
/*! create a global tagged value
a tagged value is a varible tha is visible in lua as a normal
script variable but his value is stored into a c++ defined memory block
@param sKey name of the value
@param pVal pointer to the C++ variable tha will store the value
@return if succeded an handle to the tagged value else NULL
*/
//##@{
virtual HTAG CreateTaggedValue(const char *sKey, int *pVal) = 0;
virtual HTAG CreateTaggedValue(const char *sKey, float *pVal) = 0;
virtual HTAG CreateTaggedValue(const char *sKey, char *pVal) = 0;
//##@}
virtual USER_DATA CreateUserData(INT_PTR nVal,int nCookie)=0;
/*! remove a tagged value
@param tag handle to a tagged value
*/
virtual void RemoveTaggedValue(HTAG tag) = 0;
/*! generate a script error
@param sErr "printf like" string tha define the error
*/
virtual void RaiseError(const char *sErr,...) = 0;
/*! force a Garbage collection cycle
in the current status of the engine the automatic GC is disabled
so this function must be called explicitly
*/
virtual void ForceGarbageCollection() = 0;
/*! number of "garbaged" object
*/
virtual int GetCGCount() = 0;
/*! legacy function*/
virtual void SetGCThreshhold(int nKb) = 0;
/*! un bind all gc controlled userdata variables (from this point is the application that must explicitly delete those objs)*/
virtual void UnbindUserdata() = 0;
/*! release and destroy the script system*/
virtual void Release() = 0;
//!debug functions
//##@{
virtual void EnableDebugger(IScriptDebugSink *pDebugSink) = 0;
virtual IScriptObject *GetBreakPoints() = 0;
virtual HBREAKPOINT AddBreakPoint(const char *sFile,int nLineNumber)=0;
virtual IScriptObject *GetLocalVariables(int nLevel = 0) = 0;
/*!return a table containing 1 entry per stack level(aka per call)
an entry will look like this table
[1]={
description="function bau()",
line=234,
sourcefile="/scripts/bla/bla/bla.lua"
}
*/
virtual IScriptObject *GetCallsStack() = 0;
virtual void DebugContinue() = 0;
virtual void DebugStepNext() = 0;
virtual void DebugStepInto() = 0;
virtual void DebugDisable() = 0;
virtual BreakState GetBreakState() = 0;
//##@}
virtual void GetMemoryStatistics(ICrySizer *pSizer) = 0;
//! Is not recusive but combines the hash values of the whole table when the specifies variable is a table
//! otherwise is has to be a lua function
//! @param sPath zero terminated path to the variable (e.g. _localplayer.cnt), max 255 characters
//! @param szKey zero terminated name of the variable (e.g. luaFunc), max 255 characters
//! @param dwHash is used as input and output
virtual void GetScriptHash( const char *sPath, const char *szKey, unsigned int &dwHash )=0;
//////////////////////////////////////////////////////////////////////////
// Called one time after initialization of system to register script system console vars.
//////////////////////////////////////////////////////////////////////////
virtual void PostInit() = 0;
};
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
struct IScriptObjectSink
{
virtual void OnRelease()=0;
};
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
enum ScriptVarType
{
svtNull = 0,
svtString,
svtNumber,
svtFunction,
svtObject,
svtUserData,
};
// Returns literal representation of the type value
inline const char* ScriptVarTypeAsCStr(ScriptVarType t)
{
switch (t)
{
case svtNull: return "Null";
case svtString: return "String";
case svtNumber: return "Number";
case svtFunction: return "Function";
case svtObject: return "Object";
case svtUserData: return "UserData";
default: return "#Unknown";
}
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
struct IScriptObjectDumpSink
{
virtual void OnElementFound(const char *sName,ScriptVarType type) = 0;
virtual void OnElementFound(int nIdx,ScriptVarType type) = 0;
};
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
struct IScriptObject
{
//DOC-IGNORE-BEGIN
//! internal use
virtual int GetRef() = 0;
//! internal use
//DOC-IGNORE-END
virtual void Attach() = 0;
virtual void Attach(IScriptObject *so) = 0;
virtual void Delegate(IScriptObject *pObj) = 0;
virtual void PushBack(int nVal) = 0;
virtual void PushBack(float fVal) = 0;
virtual void PushBack(const char *sVal) = 0;
virtual void PushBack(bool bVal) = 0;
virtual void PushBack(IScriptObject *pObj) = 0;
/*! Set the value of a memeber varible
@param sKey variable name
@param val variable value
*/
//##@{
virtual void SetValue(const char *sKey, int nVal) = 0;
virtual void SetValue(const char *sKey, float fVal) = 0;
virtual void SetValue(const char *sKey, const char *sVal) = 0;
virtual void SetValue(const char *sKey, bool bVal) = 0;
virtual void SetValue(const char *sKey, IScriptObject *pObj) = 0;
virtual void SetValue(const char *sKey, USER_DATA ud) = 0;
//##@}
/*! Set the value of a member variable to nil
@param sKey variable name
*/
virtual void SetToNull(const char *sKey) = 0;
/*! Get the value of a memeber varible
@param sKey variable name
@param val reference to the C++ variable that will store the value
@return false if failed true if succeded
*/
//##@{
virtual bool GetValue(const char *sKey, int &nVal) = 0;
virtual bool GetValue(const char *sKey, float &fVal) = 0;
virtual bool GetValue(const char *sKey, bool &bVal) = 0;
virtual bool GetValue(const char *sKey, const char* &sVal) = 0;
//#if defined(WIN64)
// inline bool GetValue(const char *sKey, char* &sVal) {return GetValue (sKey, (const char*&)sVal);}
//#endif
virtual bool GetValue(const char *sKey, IScriptObject *pObj) = 0;
virtual bool GetValue(const char *sKey, HSCRIPTFUNCTION &funcVal) = 0;
virtual bool GetUDValue(const char *sKey, USER_DATA &nValue, int &nCookie) = 0; //## AMD Port
//#ifdef WIN64
inline bool GetUDValue(const char *sKey, INT_PTR &nValue, int &nCookie){return GetUDValue(sKey, (USER_DATA&)nValue, nCookie);} //## AMD Port
//#endif
//! used to create a hash value out of a lua function (for cheat protection)
virtual bool GetFuncData(const char *sKey, unsigned int * &pCode, int &iSize) = 0;
//##@}
/*! Get the value of a memeber varible
@param sKey variable name
@param val reference to the C++ variable that will store the value
@return false if failed true if succeded
*/
//##@{
virtual bool BeginSetGetChain()=0;
virtual bool GetValueChain(const char *sKey, int &nVal) = 0;
//virtual bool GetValueChain(const char *sKey, unsigned int &nVal) = 0;
virtual bool GetValueChain(const char *sKey, float &fVal) = 0;
virtual bool GetValueChain(const char *sKey, bool &bVal) = 0;
virtual bool GetValueChain(const char *sKey, const char* &sVal) = 0;
virtual bool GetValueChain(const char *sKey, IScriptObject *pObj) = 0;
virtual bool GetValueChain(const char *sKey, HSCRIPTFUNCTION &funcVal) = 0;
virtual bool GetUDValueChain(const char *sKey, USER_DATA &nValue, int &nCookie) = 0; //## AMD Port
//#ifdef WIN64
inline bool GetUDValueChain(const char *sKey, INT_PTR &nValue, int &nCookie){return GetUDValueChain(sKey, (USER_DATA&)nValue, nCookie);} //#ingore AMD Port
//#endif
virtual void SetValueChain(const char *sKey, int nVal) = 0;
virtual void SetValueChain(const char *sKey, float fVal) = 0;
virtual void SetValueChain(const char *sKey, const char *sVal) = 0;
virtual void SetValueChain(const char *sKey, bool bVal) = 0;
virtual void SetValueChain(const char *sKey, IScriptObject *pObj) = 0;
virtual void SetValueChain(const char *sKey, USER_DATA ud) = 0;
virtual void SetToNullChain(const char *sKey)=0;
virtual void EndSetGetChain()=0;
//##@}
/*!Get the vaue type of a table member
@param sKey variable name
@return the value type (svtNull if doesn't exist)
*/
virtual ScriptVarType GetValueType(const char *sKey) = 0;
virtual ScriptVarType GetAtType(int nIdx) = 0;
/*! Set the value of a memeber varible at the specified index
this mean that you will use the object as vector into the script
@param nIdx index of the variable
@param val variable value
*/
//##@{
virtual void SetAt(int nIdx,int nVal)=0;
virtual void SetAt(int nIdx,float fVal)=0;
virtual void SetAt(int nIdx,bool bVal)=0;
virtual void SetAt(int nIdx,const char* sVal)=0;
virtual void SetAt(int nIdx,IScriptObject *pObj)=0;
virtual void SetAtUD(int nIdx,USER_DATA nValue)=0;
//##@}
/*! Set the value of a member variable to nil at the specified index
@param nIdx index of the variable
*/
virtual void SetNullAt(int nIdx)=0;
/*! Get the value of a memeber varible at the specified index
@param nIdx index of the variable
@param val reference to the C++ variable that will store the value
@return false if failed true if succeded
*/
//##@{
virtual bool GetAt(int nIdx,int &nVal)=0;
virtual bool GetAt(int nIdx,float &fVal)=0;
virtual bool GetAt(int nIdx,bool &bVal)=0;
virtual bool GetAt(int nIdx,const char* &sVal)=0;
virtual bool GetAt(int nIdx,IScriptObject *pObj)=0;
virtual bool GetAtUD(int nIdx, USER_DATA &nValue, int &nCookie)=0;
//##@}
virtual bool BeginIteration() = 0;
virtual bool MoveNext() = 0;
virtual bool GetCurrent(int &nVal) = 0;
virtual bool GetCurrent(float &fVal) = 0;
virtual bool GetCurrent(bool &bVal) = 0;
virtual bool GetCurrent(const char* &sVal) = 0;
virtual bool GetCurrent(IScriptObject *pObj) = 0;
//! used to get a unique identifier for the table (to iterate without problems with cycles)
virtual bool GetCurrentPtr(const void * &pObj)=0;
//! used to create a hash value out of a lua function (for cheat protection)
virtual bool GetCurrentFuncData(unsigned int * &pCode, int &iSize) = 0;
virtual bool GetCurrentKey(const char* &sVal) = 0;
#if defined(WIN64) || defined(LINUX)
inline bool GetCurrentKey(char* &sVal) {return GetCurrentKey((const char*&)sVal);}
inline bool GetCurrent(char* &sVal) {return GetCurrent ((const char*&)sVal);}
inline bool GetAt(int nIdx,char* &sVal) {return GetAt(nIdx, (const char*&)sVal);}
#endif
virtual bool GetCurrentKey(int &nKey) = 0;
virtual ScriptVarType GetCurrentType() = 0;
virtual void EndIteration() = 0;
virtual void SetNativeData(void *) =0;
virtual void *GetNativeData() = 0;
virtual void Clear() = 0;
//! get the count of elements into the object
virtual int Count()=0 ;
/*
*/
virtual bool Clone(IScriptObject *pObj)=0;
//DOC-IGNORE-BEGIN
/*under development*/
virtual void Dump(IScriptObjectDumpSink *p) = 0;
//DOC-IGNORE-END
/*! add a function to the object
@param name of the function
@param C++ function pointer(declared as SCRIPT_FUNCTION)
@param nFuncID id of the function that will be passed beck by the engine
@return false if failed true if succeded
*/
virtual bool AddFunction(const char *sName, SCRIPT_FUNCTION pThunk, int nFuncID) = 0;
//!
virtual bool AddSetGetHandlers(SCRIPT_FUNCTION pSetThunk,SCRIPT_FUNCTION pGetThunk) = 0;
/*! register the host object as parent
@param pSink pointer to an object that implement IScriptObjectSink
NOTE: if the parent is registered the script object will notify when is deleted
*/
virtual void RegisterParent(IScriptObjectSink *pSink) = 0;
//! detach the IScriptObject from the "real" script object
//! used to detach from the C++ code quick objects like vectors or temporary structures
virtual void Detach() = 0;
//! delete the IScriptObject/
virtual void Release() = 0;
//! @param szPath e.g. "cnt.table1.table2", "", "mytable", max 255 characters
//! @return true=path was valid, false otherwise
virtual bool GetValueRecursive( const char *szPath, IScriptObject *pObj ) = 0;
};
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
//DOC-IGNORE-BEGIN
/*! internal use*/
struct IWeakScriptObject
{
virtual IScriptObject *GetScriptObject() = 0;
virtual void Release() = 0 ;
};
//DOC-IGNORE-END
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// Description:
// This interface is used by the C++ function mapped to the script
// to retrieve the function parameters passed by the script and
// to return an optiona result value to the script.
struct IFunctionHandler
{
//DOC-IGNORE-BEGIN
/*! internal use */
virtual void __Attach(HSCRIPT hScript) = 0;
/*! internal use */
virtual THIS_PTR GetThis() = 0;
//virtual THIS_PTR GetThis2() = 0;
/*! internal use */
virtual int GetFunctionID() = 0;
//DOC-IGNORE-END
//! Get the number of parameter passed by lua
virtual int GetParamCount() = 0;
/*! get the nIdx param passed by the script
@param nIdx 1-based index of the parameter
@param val reference to the C++ variable that will store the value
@param nReference should the function create strong reference to the object? By default 0, means weak reference is created
*/
//##@{
virtual bool GetParam(int nIdx, int &n) = 0;
virtual bool GetParam(int nIdx, float &f) = 0;
virtual bool GetParam(int nIdx, const char * &s) = 0;
#if defined(WIN64) || defined(LINUX)
inline bool GetParam(int nIdx, char * &s) {return GetParam(nIdx, (const char*&)s);}
#endif
#if defined(WIN64) || defined(LINUX64)
virtual bool GetParam(int nIdx, INT_PTR &n) = 0; //## AMD Port
#endif
virtual bool GetParam(int nIdx,bool &b) = 0;
virtual bool GetParam(int nIdx, IScriptObject *pObj) = 0;
virtual bool GetParam(int nIdx, HSCRIPTFUNCTION &hFunc, int nReference = 0) = 0;
virtual bool GetParam(int nIdx,USER_DATA &ud)=0;
virtual bool GetParamUDVal(int nIdx,USER_DATA &val,int &cookie)=0; //## AMD Port
//#ifdef WIN64
inline bool GetParamUDVal(int nIdx,INT_PTR&val,int &cookie){return GetParamUDVal(nIdx, (USER_DATA&)val, cookie);} //## AMD Port
//#endif
//##@}
virtual ScriptVarType GetParamType(int nIdx) = 0;
/*! get the return value that you must return from your "SCRIPT_FUNCTION"
@param the value that xou want to return to the script
*/
//##@{
virtual int EndFunctionNull() = 0;
virtual int EndFunction(int nRetVal) = 0;
virtual int EndFunction(float fRetVal) = 0;
virtual int EndFunction(const char* fRetVal) = 0;
virtual int EndFunction(bool bRetVal) = 0;
virtual int EndFunction(IScriptObject *pObj) = 0;
virtual int EndFunction(HSCRIPTFUNCTION hFunc) = 0;
virtual int EndFunction(USER_DATA ud) = 0;
virtual int EndFunction() = 0;
// 2 return params versions.
virtual int EndFunction(int nRetVal1,int nRetVal2) = 0;
virtual int EndFunction(float fRetVal1,float fRetVal2) = 0;
//##@}
virtual void Unref(HSCRIPTFUNCTION hFunc) = 0;
};
//DOC-IGNORE-BEGIN
//! under development
struct ScriptDebugInfo{
const char *sSourceName;
int nCurrentLine;
};
//! under development
struct IScriptDebugSink{
virtual void OnLoadSource(const char *sSourceName,unsigned char *sSource,long nSourceSize)=0;
virtual void OnExecuteLine(ScriptDebugInfo &sdiDebugInfo)=0;
};
//DOC-IGNORE-END
/////////////////////////////////////////////////////////////////////////////
//Utility classes
/////////////////////////////////////////////////////////////////////////////
//#define USE_WEAK_OBJS
class _SmartScriptObject
{
_SmartScriptObject(const _SmartScriptObject&)
{
}
_SmartScriptObject& operator =(const _SmartScriptObject &)
{
return *this;
}
_SmartScriptObject& operator =(IScriptObject *)
{
return *this;
}
public:
_SmartScriptObject()
{
m_pSO=NULL;
}
explicit _SmartScriptObject(IScriptSystem *pSS,IScriptObject *p)
{
m_pSO=pSS->CreateEmptyObject();
m_pSO->Attach(p);
}
explicit _SmartScriptObject(IScriptSystem *pSS,bool bCreateEmpty=false)
{
if(!bCreateEmpty)
{
m_pSO=pSS->CreateObject();
}
else{
m_pSO=pSS->CreateEmptyObject();
}
}
~_SmartScriptObject()
{
if(m_pSO)
m_pSO->Release();
}
IScriptObject *operator ->(){
return m_pSO;
}
IScriptObject *operator *(){
return m_pSO;
}
operator const IScriptObject*() const
{
return m_pSO;
}
operator IScriptObject*()
{
return m_pSO;
}
bool Create(IScriptSystem *pSS)
{
m_pSO=pSS->CreateObject();
return m_pSO?true:false;
}
//////////////////////////////////////////////////////////////////////////
// Boolean comparasions.
//////////////////////////////////////////////////////////////////////////
bool operator !() const
{
return m_pSO == NULL;
};
bool operator ==(const IScriptObject* p2) const
{
return m_pSO == p2;
};
bool operator ==(IScriptObject* p2) const
{
return m_pSO == p2;
};
bool operator !=(const IScriptObject* p2) const
{
return m_pSO != p2;
};
bool operator !=(IScriptObject* p2) const
{
return m_pSO != p2;
};
bool operator <(const IScriptObject* p2) const
{
return m_pSO < p2;
};
bool operator >(const IScriptObject* p2) const
{
return m_pSO > p2;
};
protected:
IScriptObject *m_pSO;
};
class _HScriptFunction
{
public:
_HScriptFunction(){m_pScriptSystem=0;m_hFunc=0;};
_HScriptFunction(IScriptSystem *pSS){m_pScriptSystem=pSS;m_hFunc=0;}
_HScriptFunction(IScriptSystem *pSS,HSCRIPTFUNCTION hFunc){m_pScriptSystem=pSS;m_hFunc=0;}
~_HScriptFunction(){ if(m_hFunc)m_pScriptSystem->ReleaseFunc(m_hFunc);m_hFunc=0; }
void Init(IScriptSystem *pSS,HSCRIPTFUNCTION hFunc){if(m_hFunc)m_pScriptSystem->ReleaseFunc(m_hFunc);m_hFunc=hFunc;m_pScriptSystem=pSS;}
operator HSCRIPTFUNCTION() const
{
return m_hFunc;
}
_HScriptFunction& operator =(HSCRIPTFUNCTION f){
if(m_hFunc)m_pScriptSystem->ReleaseFunc(m_hFunc);
m_hFunc=f;
return *this;
}
private:
HSCRIPTFUNCTION m_hFunc;
IScriptSystem *m_pScriptSystem;
};
extern "C"{
CRYSCRIPTSYSTEM_API IScriptSystem *CreateScriptSystem( ISystem *pSystem,IScriptSystemSink *pSink,IScriptDebugSink *pDebugSink,bool bStdLibs);
}
typedef IScriptSystem *(*CREATESCRIPTSYSTEM_FNCPTR)(ISystem *pSystem,IScriptSystemSink *pSink,IScriptDebugSink *pDebugSink,bool bStdLibs);
#endif //_ISCRIPTSYSTEM_H_