doc tweaks
[luabind.git] / luabind / detail / overload_rep.hpp
blob5171482427c95d57b713074d4e4a27b3cf223227
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 #include <luabind/detail/class_rep.hpp>
38 #include <luabind/detail/is_indirect_const.hpp>
40 namespace luabind { namespace detail
42 struct dummy_ {};
44 // this class represents a specific overload of a member-function.
45 struct overload_rep: public overload_rep_base
47 #define BOOST_PP_ITERATION_PARAMS_1 (4, (0, LUABIND_MAX_ARITY, <luabind/detail/overload_rep.hpp>, 1))
48 #include BOOST_PP_ITERATE()
50 bool operator==(const overload_rep& o)
52 if (o.m_const != m_const) return false;
53 if (o.m_arity != m_arity) return false;
54 if (o.m_num_args != m_num_args) return false;
55 for (int i = 0; i < m_num_args; ++i)
56 if (!(LUABIND_TYPE_INFO_EQUAL(m_params[i], o.m_params[i]))) return false;
57 return true;
60 // inline int match(lua_State* L, int num_params) const { if (num_params != m_arity) return -1; return m_match_fun(L); }
62 void add_offset(int offset) throw() { m_pointer_offset += offset; }
63 int offset() const throw() { return m_pointer_offset; }
65 inline void set_fun(boost::function2<int,lua_State*,void*>& f) { call_fun = f; }
66 inline int call(lua_State* L, const object_rep& o) const;
68 boost::function2<int,lua_State*,void*> call_fun;
70 private:
72 // the offset we need to apply to the object pointer when calling this method.
73 // it depends on which class_rep this method is found in
74 int m_pointer_offset;
76 // the number of parameters this overload takes
77 // these are used to detect when a method is overridden by a derived class.
78 // int m_arity;
79 int m_num_args;
80 // the types of the parameter it takes
81 LUABIND_TYPE_INFO m_params[LUABIND_MAX_ARITY];
82 // is true if the overload is const (this is a part of the signature)
83 bool m_const;
86 }} // namespace luabind::detail
88 #endif // LUABIND_OVERLOAD_REP_HPP_INCLUDED
90 #elif BOOST_PP_ITERATION_FLAGS() == 1
92 #define LUABIND_PARAM(z, n, _) m_params[n] =LUABIND_TYPEID(A##n);
93 #define LUABIND_POLICY_DECL(z,n,text) typedef typename find_conversion_policy<n + 1, Policies>::type BOOST_PP_CAT(p,n);
94 #define LUABIND_ARITY(z,n,text) + BOOST_PP_CAT(p,n)::has_arg
96 // overloaded template funtion that initializes the parameter list
97 // called m_params and the m_arity member.
98 template<class R, class T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A), class Policies>
99 overload_rep(R(T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), Policies*)
100 : m_pointer_offset(0)
101 , m_num_args(BOOST_PP_ITERATION())
102 , m_const(false)
104 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM, _)
105 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL, _)
106 m_arity = 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY, 0);
109 template<class R, class T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A), class Policies>
110 overload_rep(R(T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)) const, Policies*)
111 : m_pointer_offset(0)
112 , m_num_args(BOOST_PP_ITERATION())
113 , m_const(true)
115 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM, _)
116 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL, _)
117 m_arity = 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY, 0);
120 // non-member functions
122 template<class R, class T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A), class Policies>
123 overload_rep(R(*)(T* BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), Policies*)
124 : m_pointer_offset(0)
125 , m_num_args(BOOST_PP_ITERATION())
126 , m_const(false)
128 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM, _)
129 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL, _)
130 m_arity = 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY, 0);
133 template<class R, class T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A), class Policies>
134 overload_rep(R(*)(const T* BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), Policies*)
135 : m_pointer_offset(0)
136 , m_num_args(BOOST_PP_ITERATION())
137 , m_const(true)
139 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM, _)
140 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL, _)
141 m_arity = 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY, 0);
144 template<class R, class T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A), class Policies>
145 overload_rep(R(*)(T& BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), Policies*)
146 : m_pointer_offset(0)
147 , m_num_args(BOOST_PP_ITERATION())
148 , m_const(false)
150 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM, _);
151 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL, _)
152 m_arity = 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY, 0);
155 template<class R, class T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A), class Policies>
156 overload_rep(R(*)(const T& BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), Policies*)
157 : m_pointer_offset(0)
158 , m_num_args(BOOST_PP_ITERATION())
159 , m_const(true)
161 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM, _)
162 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL, _)
163 m_arity = 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY, 0);
167 template<class R, class T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class A), class Policies>
168 overload_rep(R(*)(T BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), A)), Policies*)
169 : m_pointer_offset(0)
170 , m_num_args(BOOST_PP_ITERATION())
171 , m_const(is_indirect_const<T>::value)
173 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_PARAM, _)
174 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_POLICY_DECL, _)
175 m_arity = 0 BOOST_PP_REPEAT(BOOST_PP_ITERATION(), LUABIND_ARITY, 0);
178 #undef LUABIND_PARAM
180 #endif