summaryrefslogtreecommitdiff
path: root/Source/external/Luax/luax_state.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/external/Luax/luax_state.h')
-rw-r--r--Source/external/Luax/luax_state.h298
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.preloadrequire"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