class.hpp.svn-base
来自「本人找过多个在linux下c++的lua5.1封装库,但很少.luabind已经」· SVN-BASE 代码 · 共 1,342 行 · 第 1/3 页
SVN-BASE
1,342 行
template<> struct holder_constructor<detail::null_type> { typedef void(*constructor)(void*,void*); template<class T> static constructor apply(detail::type_<T>) { return 0; } }; // the following two functions are the ones that returns // a pointer to a const_held_type_constructor, or 0 if there // is no held_type template<class HolderType> struct const_holder_constructor { typedef void(*constructor)(void*,void*); template<class T> static constructor apply(detail::type_<T>) { return get_const_holder_constructor(detail::type_<T>(), get_const_holder(static_cast<HolderType*>(0))); } private: template<class T, class ConstHolderType> static constructor get_const_holder_constructor(detail::type_<T>, ConstHolderType*) { return &internal_construct_holder<ConstHolderType, T>::apply; } }; template<> struct const_holder_constructor<detail::null_type> { typedef void(*constructor)(void*,void*); template<class T> static constructor apply(detail::type_<T>) { return 0; } }; // the following two functions are the ones that returns // a pointer to a held_type_constructor, or 0 if there // is no held_type. The holder_type is default constructed template<class HeldType> struct holder_default_constructor { typedef void(*constructor)(void*); template<class T> static constructor apply(detail::type_<T>) { return &internal_default_construct_holder<HeldType, T>::apply; } }; template<> struct holder_default_constructor<detail::null_type> { typedef void(*constructor)(void*); template<class T> static constructor apply(detail::type_<T>) { return 0; } }; // the following two functions are the ones that returns // a pointer to a const_held_type_constructor, or 0 if there // is no held_type. The constructed held_type is default // constructed template<class HolderType> struct const_holder_default_constructor { typedef void(*constructor)(void*); template<class T> static constructor apply(detail::type_<T>) { return get_const_holder_default_constructor(detail::type_<T>(), get_const_holder(static_cast<HolderType*>(0))); } private: template<class T, class ConstHolderType> static constructor get_const_holder_default_constructor(detail::type_<T>, ConstHolderType*) { return &internal_default_construct_holder<ConstHolderType, T>::apply; } }; template<> struct const_holder_default_constructor<detail::null_type> { typedef void(*constructor)(void*); template<class T> static constructor apply(detail::type_<T>) { return 0; } }; // this is a selector that returns the size of the held_type // or 0 if we don't have a held_type template <class HolderType> struct internal_holder_size { static int apply() { return get_internal_holder_size(get_const_holder(static_cast<HolderType*>(0))); } private: template<class ConstHolderType> static int get_internal_holder_size(ConstHolderType*) { return max_c<sizeof(HolderType), sizeof(ConstHolderType)>::value; } }; template <> struct internal_holder_size<detail::null_type> { static int apply() { return 0; } }; // if we have a held type, return the destructor to it // note the difference. The held_type should only be destructed (not deleted) // since it's constructed in the lua userdata template<class HeldType> struct internal_holder_destructor { typedef void(*destructor_t)(void*); template<class T> static destructor_t apply(detail::type_<T>) { return &detail::destruct_only_s<HeldType>::apply; } }; // if we don't have a held type, return the destructor of the raw type template<> struct internal_holder_destructor<detail::null_type> { typedef void(*destructor_t)(void*); template<class T> static destructor_t apply(detail::type_<T>) { return &detail::delete_s<T>::apply; } }; // if we have a held type, return the destructor to it's const version template<class HolderType> struct internal_const_holder_destructor { typedef void(*destructor_t)(void*); template<class T> static destructor_t apply(detail::type_<T>) { return const_holder_type_destructor(get_const_holder(static_cast<HolderType*>(0))); } private: template<class ConstHolderType> static destructor_t const_holder_type_destructor(ConstHolderType*) { return &detail::destruct_only_s<ConstHolderType>::apply; } }; // if we don't have a held type, return the destructor of the raw type template<> struct internal_const_holder_destructor<detail::null_type> { typedef void(*destructor_t)(void*); template<class T> static destructor_t apply(detail::type_<T>) { return 0; } }; template<class HolderType> struct get_holder_alignment { static int apply() { return internal_alignment(get_const_holder(static_cast<HolderType*>(0))); } private: template<class ConstHolderType> static int internal_alignment(ConstHolderType*) { return detail::max_c<boost::alignment_of<HolderType>::value , boost::alignment_of<ConstHolderType>::value>::value; } }; template<> struct get_holder_alignment<detail::null_type> { static int apply() { return 1; } }; } // detail namespace detail { template<class T> struct static_scope { static_scope(T& self_) : self(self_) { } T& operator[](scope s) const { self.add_inner_scope(s); return self; } private: template<class U> void operator,(U const&) const; void operator=(static_scope const&); T& self; }; struct class_registration; struct LUABIND_API class_base : scope { public: class_base(char const* name); struct base_desc { LUABIND_TYPE_INFO type; int ptr_offset; }; void init( LUABIND_TYPE_INFO type , LUABIND_TYPE_INFO holder_type , LUABIND_TYPE_INFO const_holder_type , void*(*extractor)(void*) , const void*(*const_extractor)(void*) , void(*const_converter)(void*,void*) , void(*holder_constructor)(void*,void*) , void(*const_holder_constructor)(void*,void*) , void(*holder_default_constructor)(void*) , void(*const_holder_default_constructor)(void*) , void(*destructor)(void*) , void(*const_holder_destructor)(void*) , void(*m_adopt_fun)(void*) , int holder_size , int holder_alignment); void add_getter( const char* name , const boost::function2<int, lua_State*, int>& g);#ifdef LUABIND_NO_ERROR_CHECKING void add_setter( const char* name , const boost::function2<int, lua_State*, int>& s);#else void add_setter( const char* name , const boost::function2<int, lua_State*, int>& s , int (*match)(lua_State*, int) , void (*get_sig_ptr)(lua_State*, std::string&));#endif void add_base(const base_desc& b); void add_constructor(const detail::construct_rep::overload_t& o); void add_method(const char* name, const detail::overload_rep& o);#ifndef LUABIND_NO_ERROR_CHECKING void add_operator( int op_id , int(*func)(lua_State*) , int(*matcher)(lua_State*) , void(*sig)(lua_State* , std::string&) , int arity);#else void add_operator( int op_id , int(*func)(lua_State*) , int(*matcher)(lua_State*) , int arity);#endif const char* name() const; void add_static_constant(const char* name, int val); void add_inner_scope(scope& s); private: class_registration* m_registration; }; template<class T, class W> struct adopt_function { static void execute(void* p) { wrapped_self_t& self = wrap_access::ref( *static_cast<W*>(static_cast<T*>(p)) ); LUABIND_CHECK_STACK(self.state()); self.get(self.state()); self.m_strong_ref.set(self.state()); } }; } // namespace detail // registers a class in the lua environment template<class T, class X1, class X2, class X3> struct class_: detail::class_base { typedef class_<T, X1, X2, X3> self_t; private: template<class A, class B, class C, class D> class_(const class_<A,B,C,D>&); public: // WrappedType MUST inherit from T typedef typename detail::extract_parameter< boost::mpl::vector3<X1,X2,X3> , boost::is_base_and_derived<T, boost::mpl::_> , detail::null_type >::type WrappedType; typedef typename detail::extract_parameter< boost::mpl::list3<X1,X2,X3> , boost::mpl::not_< boost::mpl::or_< boost::mpl::or_< detail::is_bases<boost::mpl::_> , boost::is_base_and_derived<boost::mpl::_, T> > , boost::is_base_and_derived<T, boost::mpl::_> > > , detail::null_type >::type HeldType; // this function generates conversion information // in the given class_rep structure. It will be able // to implicitly cast to the given template type template<class To> void gen_base_info(detail::type_<To>) { // fist, make sure the given base class is registered. // if it's not registered we can't push it's lua table onto // the stack because it doesn't have a table // try to cast this type to the base type and remember // the pointer offset. For multiple inheritance the pointer // may change when casting. Since we need to be able to // cast we need this pointer offset. // store the information in this class' base class-vector base_desc base; base.type = LUABIND_TYPEID(To); base.ptr_offset = detail::ptr_offset(detail::type_<T>(), detail::type_<To>()); add_base(base); } void gen_base_info(detail::type_<detail::null_type>) {}#define LUABIND_GEN_BASE_INFO(z, n, text) gen_base_info(detail::type_<B##n>()); template<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_BASES, class B)> void generate_baseclass_list(detail::type_<bases<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_BASES, B)> >) { BOOST_PP_REPEAT(LUABIND_MAX_BASES, LUABIND_GEN_BASE_INFO, _) }#undef LUABIND_GEN_BASE_INFO class_(const char* name): class_base(name), scope(*this) {#ifndef NDEBUG detail::check_link_compatibility();#endif init(); } template<class F> class_& def(const char* name, F f) { return this->virtual_def( name, f, detail::null_type() , detail::null_type(), boost::mpl::true_()); } // virtual functions template<class F, class DefaultOrPolicies> class_& def(char const* name, F fn, DefaultOrPolicies default_or_policies) { return this->virtual_def( name, fn, default_or_policies, detail::null_type() , LUABIND_MSVC_TYPENAME detail::is_policy_cons<DefaultOrPolicies>::type()); } template<class F, class Default, class Policies> class_& def(char const* name, F fn , Default default_, Policies const& policies) { return this->virtual_def( name, fn, default_ , policies, boost::mpl::false_()); } template<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_ARITY, class A)> class_& def(constructor<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_ARITY, A)> sig) { return this->def_constructor( boost::is_same<WrappedType, detail::null_type>() , &sig , detail::null_type() );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?