Initial revision
[luabind.git] / luabind / detail / overload_rep.hpp
blob30637f5f2fd488430577d99caf46596558b3b9ba
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
39 struct dummy_ {};
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;
54 return true;
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;
67 private:
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
71 int m_pointer_offset;
73 // the number of parameters this overload takes
74 // these are used to detect when a method is overridden by a derived class.
75 // int m_arity;
76 int m_num_args;
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)
80 bool m_const;
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*)
97 : m_pointer_offset(0)
98 , m_num_args(BOOST_PP_ITERATION())
99 , m_const(false)
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())
110 , m_const(true)
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())
123 , m_const(false)
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())
134 , m_const(true)
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())
145 , m_const(false)
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())
156 , m_const(true)
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);
163 #undef LUABIND_PARAM
165 #endif