1 // Copyright (c) 2003 Daniel Wallin and Arvid Norberg
3 // Permission is hereby granted, free of charge, to any person obtaining a
4 // copy of this software and associated documentation files (the "Software"),
5 // to deal in the Software without restriction, including without limitation
6 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
7 // and/or sell copies of the Software, and to permit persons to whom the
8 // Software is furnished to do so, subject to the following conditions:
10 // The above copyright notice and this permission notice shall be included
11 // in all copies or substantial portions of the Software.
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
14 // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
15 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16 // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17 // SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
18 // ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
21 // OR OTHER DEALINGS IN THE SOFTWARE.
24 #if !BOOST_PP_IS_ITERATING
26 #ifndef LUABIND_OVERLOAD_REP_HPP_INCLUDED
27 #define LUABIND_OVERLOAD_REP_HPP_INCLUDED
29 #include <luabind/config.hpp>
31 #include <boost/preprocessor/enum_params.hpp>
32 #include <boost/preprocessor/iteration/iterate.hpp>
33 #include <boost/preprocessor/repeat.hpp>
35 #include <luabind/detail/overload_rep_base.hpp>
37 namespace luabind
{ namespace detail
41 // this class represents a specific overload of a member-function.
42 struct overload_rep
: public overload_rep_base
44 #define BOOST_PP_ITERATION_PARAMS_1 (4, (0, LUABIND_MAX_ARITY, <luabind/detail/overload_rep.hpp>, 1))
45 #include BOOST_PP_ITERATE()
47 bool operator==(const overload_rep
& o
)
49 if (o
.m_const
!= m_const
) return false;
50 if (o
.m_arity
!= m_arity
) return false;
51 if (o
.m_num_args
!= m_num_args
) return false;
52 for (int i
= 0; i
< m_num_args
; ++i
)
53 if (!(LUABIND_TYPE_INFO_EQUAL(m_params
[i
], o
.m_params
[i
]))) return false;
57 // inline int match(lua_State* L, int num_params) const { if (num_params != m_arity) return -1; return m_match_fun(L); }
59 void add_offset(int offset
) throw() { m_pointer_offset
+= offset
; }
60 int offset() const throw() { return m_pointer_offset
; }
62 inline void set_fun(boost::function2
<int,lua_State
*,void*>& f
) { call_fun
= f
; }
63 inline int call(lua_State
* L
, const object_rep
& o
) const { return call_fun(L
, o
.ptr(m_pointer_offset
)); }
65 boost::function2
<int,lua_State
*,void*> call_fun
;
69 // the offset we need to apply to the object pointer when calling this method.
70 // it depends on which class_rep this method is found in
73 // the number of parameters this overload takes
74 // these are used to detect when a method is overridden by a derived class.
77 // the types of the parameter it takes
78 LUABIND_TYPE_INFO m_params
[LUABIND_MAX_ARITY
];
79 // is true if the overload is const (this is a part of the signature)
83 }} // namespace luabind::detail
85 #endif // LUABIND_OVERLOAD_REP_HPP_INCLUDED
87 #elif BOOST_PP_ITERATION_FLAGS() == 1
89 #define LUABIND_PARAM(z, n, _) m_params[n] =LUABIND_TYPEID(A##n);
90 #define LUABIND_POLICY_DECL(z,n,text) typedef typename find_conversion_policy<n + 1, Policies>::type BOOST_PP_CAT(p,n);
91 #define LUABIND_ARITY(z,n,text) + BOOST_PP_CAT(p,n)::has_arg
93 // overloaded template funtion that initializes the parameter list
94 // called m_params and the m_arity member.
95 template<class R
, class T
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A
), class Policies
>
96 overload_rep(R(T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A
)), Policies
*)
98 , m_num_args(BOOST_PP_ITERATION())
101 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM
, _
)
102 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL
, _
)
103 m_arity
= 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY
, 0);
106 template<class R
, class T
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A
), class Policies
>
107 overload_rep(R(T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A
)) const, Policies
*)
108 : m_pointer_offset(0)
109 , m_num_args(BOOST_PP_ITERATION())
112 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM
, _
)
113 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL
, _
)
114 m_arity
= 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY
, 0);
117 // non-member functions
119 template<class R
, class T
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A
), class Policies
>
120 overload_rep(R(*)(T
* BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A
)), Policies
*)
121 : m_pointer_offset(0)
122 , m_num_args(BOOST_PP_ITERATION())
125 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM
, _
)
126 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL
, _
)
127 m_arity
= 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY
, 0);
130 template<class R
, class T
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A
), class Policies
>
131 overload_rep(R(*)(const T
* BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A
)), Policies
*)
132 : m_pointer_offset(0)
133 , m_num_args(BOOST_PP_ITERATION())
136 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM
, _
)
137 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL
, _
)
138 m_arity
= 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY
, 0);
141 template<class R
, class T
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A
), class Policies
>
142 overload_rep(R(*)(T
& BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A
)), Policies
*)
143 : m_pointer_offset(0)
144 , m_num_args(BOOST_PP_ITERATION())
147 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM
, _
);
148 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL
, _
)
149 m_arity
= 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY
, 0);
152 template<class R
, class T
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A
), class Policies
>
153 overload_rep(R(*)(const T
& BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A
)), Policies
*)
154 : m_pointer_offset(0)
155 , m_num_args(BOOST_PP_ITERATION())
158 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM
, _
)
159 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL
, _
)
160 m_arity
= 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY
, 0);