Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef GS_H_LUA_STATE
- #define GS_H_LUA_STATE
- #include <cstdio>
- #include <utility>
- #include <initializer_list>
- // FIXME: REFERENCES
- // And PushCodeFunction/PushFileFunction, etc.
- // Ternary/iff, Evaluate methods
- namespace gs
- {
- namespace lua
- {
- #define GS_LUA_ALLRET -1
- #define GS_LUA_ALLARG -1
- #define GS_LUA_NOHANDLER 0
- template<
- typename _Number = double,
- typename _Integer = long long,
- typename _Unsigned = unsigned long long,
- typename _TypeID = int,
- typename _StackPos = int,
- typename _Function = StackPos (*)(State*)>
- class State
- {
- // FIXME: Make TypeIDs available here somehow
- typedef _Number Number;
- typedef _Integer Integer;
- typedef _Unsigned Unsigned;
- typedef _TypeID TypeID;
- typedef _StackPos StackPos;
- typedef _Function Function;
- public:
- // Stack utils
- virtual StackPos GetTop() = 0;
- virtual void SetTop(StackPos iStackPos) = 0;
- virtual void Pop(StackPos iAmount = 1) = 0;
- virtual void Replace(StackPos iDestPos, StackPos iSrcPos = -1) = 0;
- virtual void Remove(StackPos iStackPos = -1, StackPos iAmount = 1) = 0;
- virtual void Copy(StackPos iCopyPos = -1, StackPos iRetPos = -1, StackPos iAmount = 1) = 0;
- virtual void Move(StackPos iDestPos, StackPos iSrcPos = -1) = 0;
- // Special tables
- virtual void PushGlobal() = 0;
- virtual void PushRegistry() = 0;
- virtual void PushEnv() = 0;
- // FIXME: Add stack space stuff
- // References
- virtual StackPos CreateRef(StackPos iTablePos = -2) = 0;
- virtual StackPos CreateRef(StackPos iTablePos, StackPos iObjectPos) = 0;
- virtual StackPos ReserveRef(StackPos iTablePos) = 0;
- virtual bool PushRef(StackPos iRef, StackPos iTablePos = -1) = 0;
- //virtual bool PushRef(StackPos iRef, TypeID iType, StackPos iTablePos = -1) = 0;
- //virtual bool PushRef(StackPos iRef, ConstList<TypeID> tTypes, StackPos iTablePos = -1) = 0;
- virtual void FreeRef(StackPos iRef) = 0;
- // Type operations
- virtual StackPos Call(StackPos iArgs = 0, StackPos iReturns = GS_LUA_MULTIRET, bool bRaw = false) = 0;
- virtual StackPos Call(StackPos iArgs, StackPos iReturns, StackPos iFuncPos, bool bRaw = false) = 0;
- virtual StackPos Call(StackPos iArgs, StackPos iReturns, StackPos iFuncPos, StackPos iArgPos, bool bRaw = false) = 0;
- virtual StackPos PCall(StackPos iArgs = 0, StackPos iReturns = GS_LUA_MULTIRET, StackPos iStackHandler = GS_LUA_NOHANDLER, bool bRaw = false) = 0;
- virtual StackPos PCall(StackPos iArgs, StackPos iReturns, StackPos iStackHandler, StackPos iFuncPos, bool bRaw = false) = 0;
- virtual StackPos PCall(StackPos iArgs, StackPos iReturns, StackPos iStackHandler, StackPos iFuncPos, StackPos iArgPos, bool bRaw = false) = 0;
- // FIXME: CheckDefaultX for allowing nils?
- #define __GS_LUA_STATE_1OP(Name, Type)\
- virtual Type Name(bool bRaw = false);\
- virtual Type Name(StackPos iStackPos, bool bRaw = false, StackPos iDestPos = -1) = 0;\
- virtual Type Get##Name(bool bRaw = false, StackPos iDestPos = -1);\
- virtual Type Get##Name(StackPos iStackPos, bool bRaw = false, StackPos iDestPos = -1) = 0;
- __GS_LUA_STATE_1OP(Negate, Number)
- __GS_LUA_STATE_1OP(INegate, Integer)
- __GS_LUA_STATE_1OP(Length, Unsigned)
- __GS_LUA_STATE_1OP(Eval, bool)
- __GS_LUA_STATE_1OP(Not, bool)
- #undef __GS_LUA_STATE_1OP
- #define __GS_LUA_STATE_2OP(Name, Type)\
- virtual Type Name(bool bRaw = false, StackPos iDestPos = -1) = 0;\
- virtual Type Name(StackPos iStackPos1, StackPos2 iStackPos2, bool bRaw = false, StackPos iDestPos = -1) = 0;\
- virtual Type Get##Name(bool bRaw = false, StackPos iDestPos = -1) = 0;\
- virtual Type Get##Name(StackPos iStackPos1, StackPos iStackPos2, bool bRaw = false) = 0;
- __GS_LUA_STATE_2OP(Equal, bool)
- __GS_LUA_STATE_2OP(LessThan, bool)
- __GS_LUA_STATE_2OP(LessThanEqual, bool)
- __GS_LUA_STATE_2OP(GreaterThan, bool)
- __GS_LUA_STATE_2OP(GreaterThanEqual, bool)
- __GS_LUA_STATE_2OP(And, bool)
- __GS_LUA_STATE_2OP(Or, bool)
- __GS_LUA_STATE_2OP(XOr, bool)
- __GS_LUA_STATE_2OP(Concat, std::string)
- __GS_LUA_STATE_2OP(Add, Number)
- __GS_LUA_STATE_2OP(Subtract, Number)
- __GS_LUA_STATE_2OP(Multiply, Number)
- __GS_LUA_STATE_2OP(Divide, Number)
- __GS_LUA_STATE_2OP(Mod, Number)
- __GS_LUA_STATE_2OP(FMod, Number)
- __GS_LUA_STATE_2OP(Power, Number)
- __GS_LUA_STATE_2OP(IAdd, Integer)
- __GS_LUA_STATE_2OP(ISubtract, Integer)
- __GS_LUA_STATE_2OP(IMultiply, Integer)
- __GS_LUA_STATE_2OP(IDivide, Integer)
- __GS_LUA_STATE_2OP(IMod, Integer)
- __GS_LUA_STATE_2OP(IFMod, Integer)
- __GS_LUA_STATE_2OP(IPower, Integer)
- __GS_LUA_STATE_2OP(UAdd, Integer)
- __GS_LUA_STATE_2OP(USubtract, Integer)
- __GS_LUA_STATE_2OP(UMultiply, Integer)
- __GS_LUA_STATE_2OP(UDivide, Integer)
- __GS_LUA_STATE_2OP(UMod, Integer)
- __GS_LUA_STATE_2OP(UPower, Integer)
- __GS_LUA_STATE_2OP(BAnd, Integer)
- __GS_LUA_STATE_2OP(BOr, Integer)
- __GS_LUA_STATE_2OP(BXOr, Integer)
- __GS_LUA_STATE_2OP(BLShift, Integer)
- __GS_LUA_STATE_2OP(BRShift, Integer)
- #undef __GS_LUA_STATE_2OP
- // Table operations
- virtual void CreateTable(StackPos iArrayElements = 0, StackPos iHashElements = 0, StackPos iDestPos = -1) = 0;
- virtual void PackTable(StackPos iElements, StackPos iDestPos = -1) = 0; // Each element is a key + value pair
- virtual void CreateArray(StackPos iArrayElements = 0, StackPos iDestPos = -1) = 0;
- virtual void PackArray(StackPos iValues, StackPos iDestPos = -1) = 0; // Makes an array-styled table ({val1, val2, val3}). Each element is a value
- virtual StackPos UnpackTable() = 0;
- virtual StackPos GetUnpackTable(StackPos iTablePos, StackPos iDestPos) = 0;
- virtual void UnpackTableLen(std::size_t uiLen, StackPos iDestPos = -1) = 0;
- virtual void GetUnpackTableLen(std::size_t uiLen, StackPos iTablePos = -1, StackPos iDestPos = -1) = 0;
- virtual StackPos UnpackTableValues(StackPos iDestPos = -1) = 0;
- virtual StackPos GetUnpackTableValues(StackPos iTablePos = -1, StackPos iDestPos = -1) = 0;
- virtual void UnpackTableValuesLen(std::size_t uiLen, StackPos iDestPos = -1) = 0;
- virtual void GetUnpackTableValuesLen(std::size_t uiLen, StackPos iTablePos = -1, StackPos iDestPos = -1) = 0;
- virtual bool Next(StackPos iTablePos = -2, bool bRaw = false, StackPos iNewKeyPos = -1, StackPos iNewValPos = -1) = 0;
- virtual bool Next(StackPos iTablePos, StackPos iKeyPos, bool bRaw = false, StackPos iNewKeyPos = -1, StackPos iNewValPos = -1) = 0;
- virtual bool INext(StackPos iTablePos = -2, bool bRaw = false, StackPos iNewKeyPos = -1, StackPos iNewValPos = -1) = 0;
- virtual bool INext(StackPos iTablePos, StackPos iKeyPos, bool bRaw = false, StackPos iNewKeyPos = -1, StackPos iNewValPos = -1) = 0;
- virtual bool NextKey(StackPos iTablePos = -2, bool bRaw = false, StackPos iNewKeyPos = -1) = 0;
- virtual bool NextKey(StackPos iTablePos, StackPos iKeyPos, bool bRaw = false, StackPos iNewKeyPos = -1) = 0;
- // FIXME: Inconsistent naming?
- virtual TypeID PushField(StackPos iTablePos = -2, bool bRaw = false, StackPos iDestPos = -1) = 0; // Pop
- virtual TypeID PushField(StackPos iTablePos, StackPos iKeyPos, bool bRaw = false, StackPos iDestPos = -1) = 0; // No pop
- virtual TypeID PushFieldKey(bool, StackPos iTablePos = -1, bool bRaw = false, StackPos iDestPos = -1) = 0;
- virtual TypeID PushFieldKey(Number, StackPos iTablePos = -1, bool bRaw = false, StackPos iDestPos = -1) = 0;
- virtual TypeID PushFieldKey(Integer, StackPos iTablePos = -1, bool bRaw = false, StackPos iDestPos = -1) = 0;
- virtual TypeID PushFieldKey(Unsigned, StackPos iTablePos = -1, bool bRaw = false, StackPos iDestPos = -1) = 0;
- virtual TypeID PushFieldKey(std::string, StackPos iTablePos = -1, bool bRaw = false, StackPos iDestPos = -1) = 0;
- virtual TypeID CheckFieldType(StackPos iTablePos, bool bRaw = false) = 0;
- virtual TypeID CheckFieldType(StackPos iTablePos, StackPos iKeyPos, bool bRaw = false) = 0;
- virtual TypeID GetFieldTypeKey(bool, StackPos iTablePos, bool bRaw = false) = 0;
- virtual TypeID GetFieldTypeKey(Number, StackPos iTablePos, bool bRaw = false) = 0;
- virtual TypeID GetFieldTypeKey(Integer, StackPos iTablePos, bool bRaw = false) = 0;
- virtual TypeID GetFieldTypeKey(Unsigned, StackPos iTablePos, bool bRaw = false) = 0;
- virtual TypeID GetFieldTypeKey(std::string, StackPos iTablePos, bool bRaw = false) = 0;
- #define __GS_LUA_STATE_GETFIELD(Name, RetType)\
- Prefix virtual RetType GetField##Name(StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType GetField##Name(StackPos iTablePos, StackPos iKeyPos, bool bRaw = false) = 0;\
- Prefix virtual RetType GetField##Name##Key(bool, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType GetField##Name##Key(Number, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType GetField##Name##Key(Integer, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType GetField##Name##Key(Unsigned, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType GetField##Name##Key(std::string, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType CheckField##Name(StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType CheckField##Name(StackPos iTablePos, StackPos iKeyPos, bool bRaw = false) = 0;\
- Prefix virtual RetType CheckField##Name##Key(bool, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType CheckField##Name##Key(Number, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType CheckField##Name##Key(Integer, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType CheckField##Name##Key(Unsigned, StackPos iTablePos, bool bRaw = false) = 0;\
- Prefix virtual RetType CheckField##Name##Key(std::string, StackPos iTablePos, bool bRaw = false) = 0;
- __GS_LUA_STATE_GETFIELD(Boolean, bool)
- __GS_LUA_STATE_GETFIELD(Pointer, void*)
- __GS_LUA_STATE_GETFIELD(Number, Number)
- __GS_LUA_STATE_GETFIELD(Integer, Integer)
- __GS_LUA_STATE_GETFIELD(Unsigned, Unsigned)
- __GS_LUA_STATE_GETFIELD(Boolean, bool)
- __GS_LUA_STATE_GETFIELD(String, std::string)
- __GS_LUA_STATE_GETFIELD(Function, CFunc)
- __GS_LUA_STATE_GETFIELD(Data, void*)
- __GS_LUA_STATE_GETFIELD(Data, Ret*, template<typename Ret>)
- #undef __GS_LUA_STATE_GETFIELD
- virtual void SetField(StackPos iTablePos = -3, bool bRaw = false) = 0; // Pop
- virtual void SetField(StackPos iTablePos, StackPos iKeyPos, StackPos iValuePos = -1, bool bRaw = false) = 0; // No pop
- #define __GS_LUA_STATE_SETFIELD(Type)\
- virtual void SetFieldKey(Type, StackPos iTablePos = -2, StackPos iValuePos = -1, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, bool>, StackPos iTablePos = -1, tPair, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, void*>, StackPos iTablePos = -1, tPair, bool bRaw = false) = 0;\
- template<typename UserData> virtual void SetFieldKey(std::pair<Type, UserData>, StackPos iTablePos = -1, tPair, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, Number> tPair, StackPos iTablePos = -2, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, Integer> tPair, StackPos iTablePos = -2, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, Unsigned> tPair, StackPos iTablePos = -2, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, std::string> tPair, StackPos iTablePos = -2, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, CFunc> tPair, StackPos iTablePos = -2, bool bRaw = false) = 0;\
- virtual void SetFieldKey(std::pair<Type, std::pair<void*, TypeID>> tPair, StackPos iTablePos = -2, bool bRaw = false) = 0;\
- template<typename UserData> virtual void SetFieldKey(std::pair<Type, std::pair<UserData*, TypeID>> tPair, StackPos iTablePos = -2, bool bRaw = false) = 0;
- __GS_LUA_STATE_SETFIELD(bool)
- __GS_LUA_STATE_SETFIELD(Number)
- __GS_LUA_STATE_SETFIELD(Integer)
- __GS_LUA_STATE_SETFIELD(Unsigned)
- __GS_LUA_STATE_SETFIELD(std::string)
- #undef __GS_LUA_STATE_SETFIELD
- // Metatable operations
- // FIXME: Remove these in favor of discrete object modifiers
- virtual bool PushMetaTable(StackPos iObjectPos = -1, StackPos iDestPos = -1) = 0;
- virtual void SetMetaTable(StackPos iObjectPos = -2) = 0;
- virtual void SetMetaTable(StackPos iObjectPos, StackPos iTablePos) = 0;
- virtual TypeID PushMetaField(std::string sKey, StackPos iObjectPos = -1, StackPos iDestPos = -1) = 0;
- virtual TypeID GetMetaFieldType(std::string sKey, StackPos iObjectPos = -1) = 0;
- // Environment operations
- virtual bool PushFEnv(StackPos iObjectPos = -1, StackPos iDestPos = -1) = 0;
- virtual bool SetFEnv(StackPos iObjectPos = -1) = 0;
- virtual bool SetFEnv(StackPos iObjectPos, StackPos iTablePos) = 0;
- // Errors
- virtual void Error(StackPos iErrorPos = -1) = 0;
- virtual void Error(std::string sError) = 0;
- virtual void Error(std::string sError, ...) = 0;
- virtual void Error(std::string sError, va_list tErrorArgs) = 0;
- virtual void ArgError(StackPos iArg, StackPos iErrorPos = -1) = 0;
- virtual void ArgError(StackPos iArg, std::string sSubError) = 0;
- virtual void ArgError(StackPos iArg, std::string sSubError, ...) = 0;
- virtual void ArgError(StackPos iArg, std::string sSubError, va_list tErrorArgs) = 0;
- virtual void ArgError(std::initializer_list<StackPos> tArgs, std::string sSubError) = 0;
- virtual void ArgError(std::initializer_list<StackPos> tArgs, std::string sSubError, ...) = 0;
- virtual void ArgError(std::initializer_list<StackPos> tArgs, std::string sSubError, va_list tErrorArgs) = 0;
- // Type system
- virtual TypeID RegisterType(std::string sName, bool bPushMeta = true) = 0;
- virtual bool RegisterType(std::string sName, TypeID iID, bool bPushMeta = true) = 0;
- virtual bool IaRegisteredType(TypeID iID) = 0;
- virtual std::string TypeIDName(TypeID iID) = 0;
- virtual bool PushTypeMetaTable(TypeID iID) = 0;
- // Stack types
- virtual TypeID GetType(StackPos iStackPos) = 0;
- virtual std::string GetTypeName(StackPos iStackPos) = 0;
- virtual bool IsType(StackPos iStackPos, TypeID iType) = 0;
- virtual bool IsType(StackPos iStackPos, std::initializer_list<TypeID> tTypes) = 0;
- virtual TypeID CheckType(StackPos iStackPos, TypeID iType) = 0;
- virtual TypeID CheckType(StackPos iStackPos, std::initializer_list<TypeID> tTypes) = 0;
- // Stack modifiers
- virtual void PushNil(StackPos iDestPos = -1) = 0;
- virtual void PushBoolean(bool, StackPos iDestPos = -1) = 0;
- virtual void PushPointer(void*, StackPos iDestPos = -1) = 0; // FIXME: Should this be allowed?
- virtual void PushNumber(Number, StackPos iDestPos = -1) = 0;
- virtual void PushInteger(Integer, StackPos iDestPos = -1) = 0;
- virtual void PushUnsigned(Unsigned, StackPos iDestPos = -1) = 0;
- virtual void PushString(std::string, StackPos iDestPos = -1) = 0;
- virtual void PushFString(std::string sFormat, ...) = 0;
- virtual void PushFString(std::string sFormat, va_list tArgs, StackPos iDestPos = -1) = 0;
- virtual void PushFunction(CFunc, StackPos iDestPos = -1) = 0;
- template<typename Func, Func func, State state> virtual void PushFunction() = 0;
- virtual void PushData(void*, TypeID iType, StackPos iDestPos = -1) = 0;
- virtual void PushThread(StackPos iDestPos = -1) = 0;
- // Stack accessors
- virtual bool CheckBoolean(StackPos iStackPos) = 0;
- virtual void* CheckPointer(StackPos iStackPos) = 0;
- template<typename UserData> virtual UserData* CheckLightUserData(StackPos iStackPos) = 0;
- virtual Number CheckNumber(StackPos iStackPos, bool bCoerceString = true) = 0;
- virtual Integer CheckInteger(StackPos iStackPos, bool bCoerceString = true, bool bAllowDecimal = true) = 0;
- virtual Unsigned CheckUnsigned(StackPos iStackPos, bool bCoerceString = true, bool bAllowDecimal = true) = 0;
- virtual std::string CheckString(StackPos iStackPos, bool bCoerceNumber = true) = 0;
- virtual std::string CheckStringLen(StackPos iStackPos, std::size_t uiLen, bool bCoerceNumber = true) = 0;
- virtual CFunc CheckFunction(StackPos iStackPos, StackPos iUpValues = 0) = 0;
- virtual void* CheckData(StackPos iStackPos, TypeID iType) = 0;
- template<typename UserData> virtual UserData* CheckData(StackPos iStackPos, TypeID iType) = 0;
- virtual bool GetBool(StackPos iStackPos) = 0;
- virtual void* GetPointer(StackPos iStackPos) = 0;
- template<typename UserData> virtual UserData* GetLightUserData(StackPos iStackPos) = 0;
- virtual Number GetNumber(StackPos iStackPos, bool bCoerceString = true) = 0;
- virtual Integer GetInteger(StackPos iStackPos, bool bCoerceString = true, bool bAllowDecimal = true) = 0;
- virtual Unsigned GetUnsigned(StackPos iStackPos, bool bCoerceString = true, bool bAllowDecimal = true) = 0;
- virtual std::string GetString(StackPos iStackPos, bool bCoerceNumber = true) = 0;
- virtual std::string GetStringLen(StackPos iStackPos, std::size_t uiLen, bool bCoerceNumber = true) = 0;
- virtual CFunc GetFunction(StackPos iStackPos, StackPos iUpValues = 0) = 0;
- virtual void* GetData(StackPos iStackPos, TypeID iType) = 0;
- template<typename UserData> virtual UserData* GetData(StackPos iStackPos, TypeID iType) = 0;
- };
- }
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement