diff options
Diffstat (limited to 'Source/external/Luax/luax_state.h')
-rw-r--r-- | Source/external/Luax/luax_state.h | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/Source/external/Luax/luax_state.h b/Source/external/Luax/luax_state.h new file mode 100644 index 0000000..e162965 --- /dev/null +++ b/Source/external/Luax/luax_state.h @@ -0,0 +1,298 @@ +#ifndef __LUAX_STATE_H__ +#define __LUAX_STATE_H__ + +#include <string> + +#include "luax_config.h" +#include "luax_reftable.h" +#include "luax_globalstate.h" + +namespace Luax +{ + + class LuaxVM; + class LuaxEnum; + class LuaxStrongRef; + class LuaxWeakRef; + + /// + /// lua_StateĴ˱һlua_Stateòݡһʵmetatable£ + /// class table + /// member table + /// ref table + /// userdata + /// userdataͨgetmetatableȡϼmetatable֮һclass tableעڶӦ + /// ƿռ + /// + LUAX_API class LuaxState + { + public: + + LuaxState(lua_State* state); + LuaxState(const LuaxState& state); + virtual ~LuaxState(); + + inline lua_State* operator ->() { return mState; }; + inline lua_State& operator *() { return *mState; }; + inline operator lua_State*() { return mState; } + inline operator bool() { return mState != nullptr; }; + + /// + /// ȡlua_State + /// + inline lua_State* GetHandle() { return mState; }; + + global_State* GetGlobalState(); + + LuaxVM* GetVM(); + + //------------------------------------------------------------------------------// + + void OpenLibs(); + + //------------------------------------------------------------------------------// + // ƿռƿռһ_Gı + + void PushGlobalNamespace(); + void PushNamespace(cc8* name); + void PopNamespace(); + bool IsNamespace(int idx); + + //------------------------------------------------------------------------------// + + void SetTop(int top); + int GetTop(); + bool CheckParams(int idx, cc8* format); + int AbsIndex(int idx); + void Call(int nArgs, int nResults); + + //------------------------------------------------------------------------------// + + void GetField(int idx, cc8* name); + void GetField(int idx, int key); + std::string GetField(int idx, cc8* key, cc8* value); + std::string GetField(int idx, int key, cc8* value); + std::string GetField(int idx, cc8* key, const std::string& value); + std::string GetField(int idx, int key, const std::string& value); + bool GetFieldWithType(int idx, cc8* name, int type); + bool GetFieldWithType(int idx, int key, int type); + bool GetSubfieldWithType(int idx, cc8* format, int type, ...); + static cc8* GetLuaTypeName(int type); + + void SetField(int idx, cc8* key); + + bool IsNil(int idx); + bool IsNilOrNone(int idx); + bool IsTableOrUserdata(int idx); + bool IsTrueOrNotNil(int idx); + bool IsType(int idx, int type); + bool IsType(int idx, cc8* name, int type); + bool IsValid(); + + bool HasField(int idx, cc8* name); + bool HasField(int idx, int key); + bool HasField(int idx, cc8* name, int type); + bool HasField(int idx, int name, int type); + bool HasKeys(int idx); + + void PushNil(); + void Push(bool value); + void Push(cc8* value); + void Push(double value); + void Push(float value); + void Push(int value); + void Push(u16 value); + void Push(u32 value); + void Push(u64 value); + void Push(s64 value); + void Push(uintptr value); + void Push(lua_CFunction value); + void Push(void* data, size_t size); + void Push(const void* value); + void Push(std::string value); + + /// + /// idxʼnpushջidxᱻȡn + /// + void PushValues(int idx, int n); + + /// + /// void** ʽuserdataֵΪptr + /// + void PushPtrUserdata(void* ptr); + + void Pop(int n = 1); + + void Settop(int idx); + + template<typename T> T* GetUserdata(int idx = 1); + + //------------------------------------------------------------------------------// + + int ErrorType(int idx, cc8* hint); + + //------------------------------------------------------------------------------// + + template<typename T> T GetValue(int idx, T default_value); + template<typename T> T GetField(int idx, int key, T value); + template<typename T> T GetField(int idx, cc8* key, T value); + template<typename T> void SetField(int idx, cc8* key, T value); + template<typename T> void SetFieldByIndex(int idx, int key, T value); + + template<typename T> T* CheckUserdata(int idx); + template<typename T> T CheckValue(int idx); + + //------------------------------------------------------------------------------// + + void DoString(const std::string& code); + void DoFile(const std::string& file); + + //------------------------------------------------------------------------------// + // ע᷽ + + /// + /// עṤͨ࣬New + /// + template<class TYPE> void RegisterFactory(); + + /// + /// עᵥûNew + /// + template<class TYPE> void RegisterSingleton(); + + /// + /// עö + /// + void RegisterEnum(cc8* name, LuaxEnum* enums); + + /// + /// עCעһ{0 0} + /// + void RegisterMethods(const luaL_Reg *l); + + /// + /// עᵥC + /// + void RegisterMethod(cc8* fname, lua_CFunction func); + + /// + /// preloaderӵpackage.preloadrequire"libname"ʱlualoader_preload + /// libnameҵpreloaderֱӼءʵҪrequireʱżأҼعһκ + /// package.loaded¼´βټءͨrequirepreloader + /// + void RegisterPreloader(cc8* libname, lua_CFunction preloader); + + /// + /// luaL_Reglib table_Gpackage.loadedlibnameָlib table + /// + void RegisterLib(cc8* libname, const luaL_Reg* l); + +#if LUAX_ENABLE_PLAIN_CLASS + /// + /// עᴿluaעắluaࡣ + /// + void RegisterPlainClassRegistry(cc8* name); +#endif + +#if LUAX_ENABLE_PLAIN_ENUM + /// + /// עᴿluaö٣Էֹöֵ + /// + void RegisterPlainEnumRegistry(cc8* name); +#endif + + protected: + + friend class LuaxVM; + + /// + /// ζLuaxStateĵַز + /// + void* operator &(); + void* operator new(size_t size); + + lua_State* const mState; + }; + + //--------------------------------------------------------------------------------// + // GetValue()ģػ + + template <> bool LuaxState::GetValue < bool >(int idx, const bool value); + template <> cc8* LuaxState::GetValue < cc8* >(int idx, const cc8* value); + template <> double LuaxState::GetValue < double >(int idx, const double value); + template <> float LuaxState::GetValue < float >(int idx, const float value); + template <> s8 LuaxState::GetValue < s8 >(int idx, const s8 value); + template <> s16 LuaxState::GetValue < s16 >(int idx, const s16 value); + template <> s32 LuaxState::GetValue < s32 >(int idx, const s32 value); + template <> s64 LuaxState::GetValue < s64 >(int idx, const s64 value); + template <> u8 LuaxState::GetValue < u8 >(int idx, const u8 value); + template <> u16 LuaxState::GetValue < u16 >(int idx, const u16 value); + template <> u32 LuaxState::GetValue < u32 >(int idx, const u32 value); + template <> u64 LuaxState::GetValue < u64 >(int idx, const u64 value); + template <> std::string LuaxState::GetValue < std::string >(int idx, const std::string value); + template <> const void* LuaxState::GetValue < const void* >(int idx, const void* value); + + //--------------------------------------------------------------------------------// + // CheckValueģػ + + template <> bool LuaxState::CheckValue < bool >(int idx); + template <> cc8* LuaxState::CheckValue < cc8* >(int idx); + template <> double LuaxState::CheckValue < double >(int idx); + template <> float LuaxState::CheckValue < float >(int idx); + template <> s8 LuaxState::CheckValue < s8 >(int idx); + template <> s16 LuaxState::CheckValue < s16 >(int idx); + template <> s32 LuaxState::CheckValue < s32 >(int idx); + template <> s64 LuaxState::CheckValue < s64 >(int idx); + template <> u8 LuaxState::CheckValue < u8 >(int idx); + template <> u16 LuaxState::CheckValue < u16 >(int idx); + template <> u32 LuaxState::CheckValue < u32 >(int idx); + template <> u64 LuaxState::CheckValue < u64 >(int idx); + template <> std::string LuaxState::CheckValue < std::string >(int idx); + template <> const void* LuaxState::CheckValue < const void* >(int idx); + + /// + /// ڳԱﴴLuaxStateԲм顣 + /// +#define LUAX_SETUP(L, params) \ + Luax::LuaxState state(L); \ + if(!state.CheckParams(1, params)) return 0 + +#define LUAX_STATE(L) \ + Luax::LuaxState state(L) + + //--------------------------------------------------------------------------------// + + /// + /// ȷȫluaܹڵ֮صstack״̬ + /// + class LuaxScopedState + : public LuaxState + { + public: + LuaxScopedState(lua_State* state) + : LuaxState(state) + { + mRestoreTop = lua_gettop(mState); + } + LuaxScopedState(const LuaxState& state) + : LuaxState(state) + { + mRestoreTop = lua_gettop(mState); + } + ~LuaxScopedState() + { + if (mState) { + if (lua_gettop(mState) != mRestoreTop) { + lua_settop(mState, mRestoreTop); + } + } + } + private: + void* operator new(size_t); + int mRestoreTop; + + }; + +} + +#endif
\ No newline at end of file |