From 88b882ed0b432c6aff2063213e2f793a36dd25f7 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 6 Jun 2019 00:11:18 +0800 Subject: *misc --- source/3rd-party/Luax/luax_class.hpp | 281 ----------------------------------- 1 file changed, 281 deletions(-) delete mode 100644 source/3rd-party/Luax/luax_class.hpp (limited to 'source/3rd-party/Luax/luax_class.hpp') diff --git a/source/3rd-party/Luax/luax_class.hpp b/source/3rd-party/Luax/luax_class.hpp deleted file mode 100644 index c39138d..0000000 --- a/source/3rd-party/Luax/luax_class.hpp +++ /dev/null @@ -1,281 +0,0 @@ -#ifndef __LUAX_CLASS_H__ -#define __LUAX_CLASS_H__ - -#include "luax_config.h" - -#if LUAX_PROFILER -#include -#endif - -#include - -#include "luax_ref.h" -#include "luax_memberref.h" -#include "luax_cfunctions.h" -#include "luax_watchdog.h" - -namespace Luax -{ - - class LuaxVM; - - /// - /// RegisterLuaxClass 注册类的方法和成员,比如枚举、常量等到class table - /// LuaxGetFactoryName 获得工厂的类名,同时用来避免注册时错误注册为了singleton,通过编译 - /// 时报错避免 - /// -#define LUAX_DECL_FACTORY(type, ...) \ - friend class Luax::LuaxState; \ - friend class Luax::LuaxNativeClass; \ - static void RegisterLuaxClass(Luax::LuaxState&); \ - static void RegisterLuaxPostprocess(Luax::LuaxState&); \ - static const char* GetLuaxFactoryName() { return #type; };\ - static const char* GetLuaxClassName() { return #type; };\ - static bool IsLuaxClassSingleton() { return false; } - - /// - /// 作为基类的抽象工厂类可以使用此宏,注册一个入口,在派生类的注册函数中调用,注册基类的这些 - /// 方法。 - /// -#define LUAX_DECL_ABSTRACT_FACTORY() \ - static void RegisterLuaxClass(Luax::LuaxState&);\ - static void RegisterLuaxPostprocess(Luax::LuaxState&) - - /// - /// RegisterLuaxClass 注册类的方法和成员,比如枚举、常量等到class table - /// LuaxGetSingletonName 获得单例的类名 - /// -#define LUAX_DECL_SINGLETON(type, ...) \ - friend class Luax::LuaxState; \ - friend class Luax::LuaxNativeClass; \ - static void RegisterLuaxClass(Luax::LuaxState&); \ - static void RegisterLuaxPostprocess(Luax::LuaxState&); \ - static const char* GetLuaxSingletonName() { return #type; }; \ - static const char* GetLuaxClassName() { return #type; }; \ - static bool IsLuaxClassSingleton() { return true; } - -#define LUAX_DECL_METHOD(mtd) static int mtd(lua_State* L) - -#define LUAX_DECL_ENUM(e, under_line_index) - - /// - /// 标明方法实现的宏。上下文里有一个L。 - /// -#define LUAX_IMPL_METHOD(type, f) int type::f(lua_State* L) - - /// - /// 由应用程序实现的两个接口。上下文里有一个state。 - /// -#define LUAX_REGISTRY(type) void type::RegisterLuaxClass(Luax::LuaxState& state) -#define LUAX_POSTPROCESS(type) void type::RegisterLuaxPostprocess(Luax::LuaxState& state) - - /// - /// 用来注册的宏。之前这里忘了用可变宏,导致没有luaclastable ref没有注册对。 - /// -#define LUAX_REGISTER_FACTORY(state, param) state.RegisterFactory() -#define LUAX_REGISTER_SINGLETON(state, param) state.RegisterSingleton() -#define LUAX_REGISTER_ABSTRACT_FACTORY(state, type) type::RegisterLuaxPostprocess(state) -#define LUAX_REGISTER_METHODS(state, ...) \ - do{ \ - luaL_Reg __m[] = {__VA_ARGS__,{0, 0}}; \ - state.RegisterMethods(__m); \ - }while(0) -#define LUAX_REGISTER_ENUM(state, name, ...) \ - do{ \ - Luax::LuaxEnum __e[] = {__VA_ARGS__,{0, 0}}; \ - state.RegisterEnum(name, __e); \ - }while(0) - -#define LUAX_PREPARE(L, T) \ - LUAX_STATE(L); \ - T* self = state.GetUserdata(1); - -#define LUAX_INHERIT(state, type) type::RegisterLuaxClass(state) - - /// - /// 虚基类,为了实现多态。需要访问下面这些接口的外部基类需要虚继承此类,之后再派生链中就会 - /// 调用对应实体的方法。注意继承此类时不能实现下面的方法,实现在LuaxNativeClass中,实现会 - /// 导致二义性。 - /// - /// 依据Effective C++条款40,如果在必须使用virtual base基类情况下,应该尽可能避免向其中放 - /// 置数据成员,规避数据成员初始化造成的一些隐性问题。依据这一点,vpb基类更加接近C#和Java中 - /// 的Interface。所以,在这里把类用I开头标识这是一个接口。 - /// - class LuaxObject - { - public: - LuaxObject() {}; - virtual ~LuaxObject() {}; - - /// - /// 成员引用管理,在实例的ref table里。设置、取、清除。 - /// - virtual bool PushLuaxMemberRef(LuaxState& state, int refID) = 0; - virtual bool PushLuaxUserdata(LuaxState& state) = 0; - virtual bool PushLuaxMemberTable(LuaxState& state) = 0; - virtual bool PushLuaxRefTable(LuaxState& state) = 0; - - /// - /// 被LuaxNativeClass实现。保持和释放native资源。 - /// - virtual void Retain() = 0; - virtual void Release() = 0; - - }; - - // TODO: 将公共部分提取出来,不要重复生成代码 - //class LuaxNativeClassBase - //{ - //} - - /// - /// 需要暴露给lua的native class需要继承此类。通过lua管理的实例要确保引用计数的正确性,在 - /// 多个线程中需要确定不会误释放。 - /// - template - class LuaxNativeClass : public BASE - { - public: - - /// - /// 将userdata作为key,在ref table里对userdata添加一个引用,以维持userdata的生命周期。 - /// 相比较member ref,这个用在实体会被多次被不同其他实体引用的情况,并频繁销毁这些实体, - /// 避免lua频繁的调用gc检测。 - /// - template void LuaxRetain(LuaxState& state, DATATYPE* userdata); - - /// - /// 对userdata减少一个引用在ref table里,以尝试回收userdata。 - /// - template void LuaxRelease(LuaxState& state, DATATYPE* userdata); - - /// - /// 将userdata push到栈顶,如果没有初始化mUserdata,初始化设置好元表并把初始化好的 - /// userdata留在栈顶。并添加一个引用。这是一个将native对象所有权移交给lua控制的方法。 - /// - bool PushLuaxMemberRef(LuaxState& state, int refID) override; - bool PushLuaxUserdata(LuaxState& state) override; - bool PushLuaxMemberTable(LuaxState& state) override; - bool PushLuaxRefTable(LuaxState& state) override; - - /// - /// Watch dog 添加一个native引用。luaVM引用不会提供外部接口。继承此类的派生类不能直接使用 - /// delete方法,应该使用Release释放。一般情况下这个操作由虚拟机__gc进行,但是允许用户 - /// 程序在native中隔绝虚拟机情况下释放,这种情况下要使用Release。 - /// - /// 这两个函数是native接口。 - /// - void Retain() override final; - void Release() override final; - -#if LUAX_PROFILER - // 对堆上创建的实例进行delete保险检查 - static void operator delete(void* pdead, size_t size); -#endif - - protected: - - LuaxNativeClass(); - virtual ~LuaxNativeClass(); - - /// - /// 成员引用管理,在实例的ref table里。设置、取、清除 - /// - void SetLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef, int idx); - bool PushLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef); - void ClearLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef); - - private: - - friend class LuaxState; - - static void RegisterLuaxClassShared(LuaxState& state); - static void RegisterLuaxFactoryClass(LuaxState& state); - static void RegisterLuaxSingletonClass(LuaxState& state); - - static void SetLuaxClassTableRef(LuaxState& state, int idx); - static void PushLuaxClassTable(LuaxState& state); - - /// - /// 创建userdata,绑定实例到state。 - /// - void BindToLua(LuaxState& state); - - //------------------------------------------------------------------------------// - - // 公共内容 - static int __tostring (lua_State*); - static int _GetClass (lua_State*); - static int _GetClassName (lua_State*); - - // 工厂类相关 - static int __gc (lua_State*); - static int _GetRefTable (lua_State*); - static int _New (lua_State*); - -#if LUAX_ENABLE_NATIVE_EXTEND - static int _ExtendFactory (lua_State*); - static int _ExtendSingleton (lua_State*); -#endif - - //--------------------------------------------------------------------------------// - - /// - /// class table,工厂和单例都有。 - /// - static LuaxStrongRef mClassTable; - - /// - /// 如果类是单例,这个用来保存singleton的引用关系,以保证不会被回收类似普通类的ref table。 - /// 单例的成员是全生命周期的,所以直接在_LUAX_STRONGREF_TABLE。单例对userdata进行 - /// LuaxRetain\LuaxRelease和member ref操作时和工厂实例不同,是存在下面这个ref table里 - /// 的,这个table在_LUAX_STRONGREF_TABLE里。 - /// - static LuaxStrongRef mSingletonRefTable; - - /// - /// 通过userdata可以拿到: - /// 1: ref table - /// 2: member table - /// 3: class table - /// - LuaxWeakRef mUserdata; - - /// - /// 通过后才能删除 - /// - LuaxWatchDog mWatchDog; - -#if LUAX_PROFILER - // 托管此对象的虚拟机 - std::unordered_set mRefVMs; - // 保险,此类的派生类不能在外部使用delete直接删除,而应该使用Release - bool mSafer; -#endif - - }; - -#if LUAX_ENABLE_PLAIN_CLASS - /// - /// 纯lua类 - /// - class LuaxPlainClass - { - public: - - /// - /// 用来注册类的入口函数。可以通过registry(类名)注册类。 - /// - static int registry(lua_State* L); - - LUAX_DECL_METHOD(__tostring); - LUAX_DECL_METHOD(_Extend); - LUAX_DECL_METHOD(_New); - LUAX_DECL_METHOD(_TypeOf); - - }; -#endif - -} - -#endif \ No newline at end of file -- cgit v1.1-26-g67d0