24 #ifndef LUABIND_CLASS_HPP_INCLUDED 25 #define LUABIND_CLASS_HPP_INCLUDED 70 #include <luabind/prefix.hpp> 71 #include <luabind/config.hpp> 77 #include <boost/preprocessor/repetition/enum_params.hpp> 78 #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp> 79 #include <boost/preprocessor/repetition/repeat.hpp> 81 #include <boost/type_traits/is_same.hpp> 82 #include <boost/type_traits/is_member_object_pointer.hpp> 83 #include <boost/mpl/apply.hpp> 84 #include <boost/mpl/lambda.hpp> 85 #include <boost/mpl/logical.hpp> 86 #include <boost/mpl/find_if.hpp> 87 #include <boost/mpl/eval_if.hpp> 88 #include <boost/mpl/logical.hpp> 89 #include <boost/mpl/vector/vector10.hpp> 91 #include <luabind/config.hpp> 92 #include <luabind/scope.hpp> 93 #include <luabind/back_reference.hpp> 94 #include <luabind/function.hpp> 95 #include <luabind/dependency_policy.hpp> 96 #include <luabind/detail/constructor.hpp> 97 #include <luabind/detail/call.hpp> 98 #include <luabind/detail/deduce_signature.hpp> 99 #include <luabind/detail/primitives.hpp> 100 #include <luabind/detail/property.hpp> 101 #include <luabind/detail/typetraits.hpp> 102 #include <luabind/detail/class_rep.hpp> 103 #include <luabind/detail/call.hpp> 104 #include <luabind/detail/object_rep.hpp> 105 #include <luabind/detail/call_member.hpp> 106 #include <luabind/detail/enum_maker.hpp> 107 #include <luabind/detail/operator_id.hpp> 108 #include <luabind/detail/pointee_typeid.hpp> 109 #include <luabind/detail/link_compatibility.hpp> 110 #include <luabind/detail/inheritance.hpp> 111 #include <luabind/detail/signature_match.hpp> 112 #include <luabind/no_dependency.hpp> 113 #include <luabind/typeid.hpp> 117 #pragma warning(push) 118 #pragma warning(disable: 4355) 139 template<
class T,
class X1 = detail::unspecified,
class X2 = detail::unspecified,
class X3 = detail::unspecified>
145 get_const_holder(...)
156 # ifdef LUABIND_CPP0x 158 template <
class... Args>
167 BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
175 # endif // LUABIND_CPP0x 184 # ifdef LUABIND_CPP0x 185 template <
class... Args>
190 template <BOOST_PP_ENUM_PARAMS(LUABIND_MAX_BASES,
class A)>
191 struct is_bases<bases<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_BASES, A)> >
196 template <
class T,
class P>
215 template<
class Predicate>
218 typedef mpl::protect<is_unspecified_mfn<Predicate> > type;
221 template <
class Result,
class Default>
227 template <
class Default>
230 typedef Default type;
233 template<
class Parameters,
class Predicate,
class DefaultValue>
236 typedef typename get_predicate<Predicate>::type pred;
237 typedef typename boost::mpl::find_if<Parameters, pred>::type iterator;
239 typename iterator::type, DefaultValue
246 LUABIND_API std::string stack_content_by_name(
lua_State* L,
int start_index);
265 T& operator[](
scope s)
const 267 self.add_inner_scope(s);
272 template<
class U>
void operator,(U
const&)
const;
292 type_id const& type, class_id
id 293 ,
type_id const& wrapped_type, class_id wrapper_id);
295 void add_base(
type_id const& base, cast_function cast);
300 const char* name()
const;
302 void add_static_constant(
const char* name,
int val);
303 void add_inner_scope(
scope& s);
305 void add_cast(class_id src, class_id target, cast_function cast);
318 template <
class Class,
class F,
class Policies>
329 object fn = make_function(
330 L, f, deduce_signature(f, (Class*)0), policies);
348 template <
class P,
class T>
357 typedef std::auto_ptr<T> type;
360 template <
class Class,
class Po
inter,
class Signature,
class Policies>
369 typedef typename default_pointer<Pointer, Class>::type pointer;
371 object fn = make_function(
390 mpl::or_<boost::is_pointer<T>, is_primitive<T> >
392 , typename boost::add_reference<T>::type
399 mpl::or_<boost::is_pointer<T>, is_primitive<T> >
401 , typename boost::add_reference<
402 typename boost::add_const<T>::type
407 template <
class T,
class Policies>
412 , has_policy<Policies, detail::no_dependency_policy>
415 , policy_cons<dependency_policy<0, 1>, Policies>
421 ,
class Get,
class GetPolicies
429 , GetPolicies
const& get_policies
430 , Set
const&
set = Set()
431 , SetPolicies
const& set_policies = SetPolicies()
435 , get_policies(get_policies)
437 , set_policies(set_policies)
446 , make_get(L,
get, boost::is_member_object_pointer<Get>())
452 object make_get(
lua_State* L, F
const& f, mpl::false_)
const 454 return make_function(
455 L, f, deduce_signature(f, (Class*)0), get_policies);
458 template <
class T,
class D>
459 object make_get(
lua_State* L, D T::* mem_ptr, mpl::true_)
const 463 D, GetPolicies>::type policies;
465 return make_function(
468 , mpl::vector2<result_type, Class const&>()
474 object make_set(
lua_State* L, F
const& f, mpl::false_)
const 476 return make_function(
477 L, f, deduce_signature(f, (Class*)0), set_policies);
480 template <
class T,
class D>
481 object make_set(
lua_State* L, D T::* mem_ptr, mpl::true_)
const 485 return make_function(
488 , mpl::vector3<void, Class&, argument_type>()
496 ,
object const& get_, S
const&)
const 498 context[name] = property(
500 , make_set(L,
set, boost::is_member_object_pointer<Set>())
508 context[name] = property(get_);
513 GetPolicies get_policies;
515 SetPolicies set_policies;
521 template<
class T,
class X1,
class X2,
class X3>
528 template<
class A,
class B,
class C,
class D>
533 typedef boost::mpl::vector4<X1, X2, X3, detail::unspecified> parameters_type;
538 , boost::is_base_and_derived<T, boost::mpl::_>
547 , boost::is_base_and_derived<boost::mpl::_, T>
548 , boost::is_base_and_derived<T, boost::mpl::_>
554 template <
class Src,
class Target>
555 void add_downcast(Src*, Target*, boost::mpl::true_)
564 template <
class Src,
class Target>
565 void add_downcast(Src*, Target*, boost::mpl::false_)
581 add_downcast((To*)0, (T*)0, boost::is_polymorphic<To>());
587 # ifndef LUABIND_CPP0x 589 #define LUABIND_GEN_BASE_INFO(z, n, text) gen_base_info(detail::type_<BaseClass##n>()); 591 template<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_BASES,
class BaseClass)>
592 void generate_baseclass_list(
detail::type_<
bases<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_BASES, BaseClass)> >)
594 BOOST_PP_REPEAT(LUABIND_MAX_BASES, LUABIND_GEN_BASE_INFO, _)
597 #undef LUABIND_GEN_BASE_INFO 599 # else // !LUABIND_CPP0x 601 template <
class... Args>
602 void ignore(Args&&...)
605 template <
class... Bases>
611 # endif // !LUABIND_CPP0x 616 detail::check_link_compatibility();
622 class_& def(
const char* name, F f)
624 return this->virtual_def(
630 template<
class F,
class DefaultOrPolicies>
631 class_& def(
char const* name, F fn, DefaultOrPolicies default_or_policies)
633 return this->virtual_def(
635 , LUABIND_MSVC_TYPENAME detail::is_policy_cons<DefaultOrPolicies>::type());
638 template<
class F,
class Default,
class Policies>
639 class_& def(
char const* name, F fn
640 , Default default_, Policies
const& policies)
642 return this->virtual_def(
644 , policies, boost::mpl::false_());
647 # ifdef LUABIND_CPP0x 657 template<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_ARITY,
class A)>
663 template<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_ARITY,
class A),
class Policies>
664 class_& def(
constructor<BOOST_PP_ENUM_PARAMS(LUABIND_MAX_ARITY, A)> sig,
const Policies& policies)
666 return this->def_constructor(&sig, policies);
669 # endif // LUABIND_CPP0x 671 template <
class Getter>
672 class_& property(
const char* name, Getter g)
680 template <
class Getter,
class MaybeSetter>
681 class_& property(
const char* name, Getter g, MaybeSetter s)
683 return property_impl(
689 template<
class Getter,
class Setter,
class GetPolicies>
690 class_& property(
const char* name, Getter g, Setter s,
const GetPolicies& get_policies)
697 new registration_type(name, g, get_policies, s));
701 template<
class Getter,
class Setter,
class GetPolicies,
class SetPolicies>
705 , GetPolicies
const& get_policies
706 , SetPolicies
const& set_policies)
709 T, Getter, GetPolicies, Setter, SetPolicies
713 new registration_type(name, g, get_policies, s, set_policies));
717 template <
class C,
class D>
718 class_& def_readonly(
const char* name, D C::*mem_ptr)
728 template <
class C,
class D,
class Policies>
729 class_& def_readonly(
const char* name, D C::*mem_ptr, Policies
const& policies)
735 new registration_type(name, mem_ptr, policies));
739 template <
class C,
class D>
740 class_& def_readwrite(
const char* name, D C::*mem_ptr)
747 new registration_type(
752 template <
class C,
class D,
class GetPolicies>
754 const char* name, D C::*mem_ptr, GetPolicies
const& get_policies)
757 T, D C::*, GetPolicies, D C::*
761 new registration_type(
762 name, mem_ptr, get_policies, mem_ptr));
766 template <
class C,
class D,
class GetPolicies,
class SetPolicies>
770 , GetPolicies
const& get_policies
771 , SetPolicies
const& set_policies
775 T, D C::*, GetPolicies, D C::*, SetPolicies
779 new registration_type(
780 name, mem_ptr, get_policies, mem_ptr, set_policies));
784 template<
class Derived,
class Policies>
789 , &Derived::template apply<T, Policies>::execute
794 template<
class Derived>
799 , &Derived::template apply<T, detail::null_type>::execute
811 void operator=(
class_ const&);
817 void add_wrapper_cast(U*)
825 add_downcast((T*)0, (U*)0, boost::is_polymorphic<T>());
833 detail::is_bases<boost::mpl::_>
834 , boost::is_base_and_derived<boost::mpl::_, T>
840 boost::mpl::if_<detail::is_bases<bases_t>
848 ,
typeid(WrappedType)
852 add_wrapper_cast((WrappedType*)0);
857 template<
class Getter,
class GetPolicies>
858 class_& property_impl(
const char* name,
860 GetPolicies policies,
861 boost::mpl::bool_<true>)
869 template<
class Getter,
class Setter>
870 class_& property_impl(
const char* name,
873 boost::mpl::bool_<false>)
880 new registration_type(name, g, detail::null_type(), s));
885 template<
class F,
class Policies>
886 class_& virtual_def(
char const* name, F
const& fn
891 name, fn, Policies()));
895 template<
class F,
class Default,
class Policies>
896 class_& virtual_def(
char const* name, F
const& fn
897 , Default
const& default_, Policies
const&, boost::mpl::false_)
901 name, fn, Policies()));
903 this->add_default_member(
905 name, default_, Policies()));
910 template<
class Signature,
class Policies>
911 class_& def_constructor(Signature*, Policies
const&)
913 typedef typename Signature::signature signature;
915 typedef typename boost::mpl::if_<
916 boost::is_same<WrappedType, detail::null_type>
919 >::type construct_type;
923 construct_type, HeldType, signature, Policies>(
926 this->add_default_member(
928 construct_type, HeldType, signature, Policies>(
941 #endif // LUABIND_CLASS_HPP_INCLUDED Definition: signature_match.hpp:58
Definition: class.hpp:388
Definition: class.hpp:361
Definition: basic_dir_monitor.hpp:13
Definition: inheritance.hpp:141
Definition: property.hpp:11
Definition: class.hpp:136
Definition: class.hpp:259
Definition: enum_maker.hpp:94
Definition: class.hpp:170
Definition: typeid.hpp:22
Definition: class.hpp:132
Definition: class.hpp:248
Definition: inheritance.hpp:132
Definition: inheritance.hpp:153
Definition: class.hpp:207
Definition: class.hpp:124
Definition: class.hpp:222
Definition: class.hpp:424
Definition: minilua.c:461
Definition: class.hpp:280
Definition: class.hpp:134
Definition: policy.hpp:140
Definition: PEtypes.h:507
Definition: class.hpp:210
Definition: constructor.hpp:66
Definition: class.hpp:285
Definition: class.hpp:319
Definition: class.hpp:140
Definition: primitives.hpp:42
Definition: primitives.hpp:44
Definition: class.hpp:397
Definition: class.hpp:408
Definition: class.hpp:197
Definition: class.hpp:216
Definition: class.hpp:349
Definition: class.hpp:180
Definition: from_stack.hpp:28