operator.hpp.svn-base
来自「本人找过多个在linux下c++的lua5.1封装库,但很少.luabind已经」· SVN-BASE 代码 · 共 354 行
SVN-BASE
354 行
// Copyright (c) 2004 Daniel Wallin and Arvid Norberg// Permission is hereby granted, free of charge, to any person obtaining a// copy of this software and associated documentation files (the "Software"),// to deal in the Software without restriction, including without limitation// the rights to use, copy, modify, merge, publish, distribute, sublicense,// and/or sell copies of the Software, and to permit persons to whom the// Software is furnished to do so, subject to the following conditions:// The above copyright notice and this permission notice shall be included// in all copies or substantial portions of the Software.// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE// OR OTHER DEALINGS IN THE SOFTWARE.#ifndef OPERATOR_040729_HPP#define OPERATOR_040729_HPP#include <boost/mpl/eval_if.hpp>#include <boost/mpl/identity.hpp>#include <boost/mpl/apply_wrap.hpp>#include <boost/type_traits/is_same.hpp>#include <luabind/detail/other.hpp>#include <luabind/raw_policy.hpp>#if defined(__GNUC__) && __GNUC__ < 3# define LUABIND_NO_STRINGSTREAM#else# if defined(BOOST_NO_STRINGSTREAM)# define LUABIND_NO_STRINGSTREAM# endif#endif#ifdef LUABIND_NO_STRINGSTREAM#include <strstream>#else#include <sstream>#endifnamespace luabind { namespace detail { template<class W, class T> struct unwrap_parameter_type; template<class Derived> struct operator_ {}; struct operator_void_return {};#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) template<class T> inline T const& operator,(T const& x, operator_void_return) { return x; }#endif }} // namespace luabindnamespace luabind { namespace operators { #define BOOST_PP_ITERATION_PARAMS_1 (3, \ (0, LUABIND_MAX_ARITY, <luabind/detail/call_operator_iterate.hpp>)) #include BOOST_PP_ITERATE() }} // namespace luabind::operators#include <boost/preprocessor/iteration/local.hpp>namespace luabind { template<class Derived> struct self_base { operators::call_operator0<Derived> operator()() const { return 0; } #define BOOST_PP_LOCAL_MACRO(n) \ template<BOOST_PP_ENUM_PARAMS(n, class A)> \ BOOST_PP_CAT(operators::call_operator, n)< \ Derived \ BOOST_PP_ENUM_TRAILING_PARAMS(n, A) \ >\ operator()( \ BOOST_PP_ENUM_BINARY_PARAMS(n, A, const& BOOST_PP_INTERCEPT) \ ) const \ { \ return 0; \ }#define BOOST_PP_LOCAL_LIMITS (1, LUABIND_MAX_ARITY)#include BOOST_PP_LOCAL_ITERATE() }; struct self_type : self_base<self_type> { }; struct const_self_type : self_base<const_self_type> { };namespace detail { template<class W, class T> struct unwrap_parameter_type { typedef typename boost::mpl::eval_if< boost::is_same<T, self_type> , boost::mpl::identity<W&> , boost::mpl::eval_if< boost::is_same<T, const_self_type> , boost::mpl::identity<W const&> , unwrap_other<T> > >::type type; }; template<class Derived, class A, class B> struct binary_operator : operator_<binary_operator<Derived, A, B> > { binary_operator(int) {} template<class T, class Policies> struct apply { typedef typename unwrap_parameter_type<T, A>::type arg0; typedef typename unwrap_parameter_type<T, B>::type arg1; static void execute(lua_State* L, arg0 _0, arg1 _1) { Derived::template apply<arg0, arg1, Policies>::execute( L, _0, _1); } }; static char const* name() { return Derived::name(); } }; template<class Derived, class A> struct unary_operator : operator_<unary_operator<Derived, A> > { unary_operator(int) {} template<class T, class Policies> struct apply { typedef typename unwrap_parameter_type<T, A>::type arg0; static void execute(lua_State* L, arg0 _0) { Derived::template apply<arg0, Policies>::execute(L, _0); } }; static char const* name() { return Derived::name(); } }; template<class Policies> inline void operator_result(lua_State* L, operator_void_return, Policies*) { } namespace mpl = boost::mpl; template<class T, class Policies> inline void operator_result(lua_State* L, T const& x, Policies*) { typedef typename find_conversion_policy< 0 , Policies >::type cv_policy; typename mpl::apply_wrap2<cv_policy,T,cpp_to_lua>::type cv; cv.apply(L, x); }}} // namespace detail::luabindnamespace luabind {#define LUABIND_BINARY_OPERATOR(name_, op) \ namespace operators { \\ struct name_ \ { \ template<class T0, class T1, class Policies> \ struct apply \ { \ static void execute(lua_State* L, T0 _0, T1 _1) \ { \ detail::operator_result(L, _0 op _1, (Policies*)0); \ } \ }; \\ static char const* name() \ { \ return "__" # name_; \ } \ }; \\ } \ \ template<class T, class U> \ detail::binary_operator< \ operators::name_ \ , U \ , T \ > \ inline operator op(self_base<U>, T const&) \ { \ return 0; \ } \ \ template<class T, class U> \ detail::binary_operator< \ operators::name_ \ , T \ , U \ > \ inline operator op(T const&, self_base<U>) \ { \ return 0; \ } \ \ detail::binary_operator< \ operators::name_ \ , self_type \ , self_type \ > \ inline operator op(self_type, self_type) \ { \ return 0; \ } \ \ detail::binary_operator< \ operators::name_ \ , self_type \ , const_self_type \ > \ inline operator op(self_type, const_self_type) \ { \ return 0; \ } \ \ detail::binary_operator< \ operators::name_ \ , const_self_type \ , self_type \ > \ inline operator op(const_self_type, self_type) \ { \ return 0; \ } \ \ detail::binary_operator< \ operators::name_ \ , const_self_type \ , const_self_type \ > \ inline operator op(const_self_type, const_self_type) \ { \ return 0; \ } LUABIND_BINARY_OPERATOR(add, +) LUABIND_BINARY_OPERATOR(sub, -) LUABIND_BINARY_OPERATOR(mul, *) LUABIND_BINARY_OPERATOR(div, /) LUABIND_BINARY_OPERATOR(pow, ^) LUABIND_BINARY_OPERATOR(lt, <) LUABIND_BINARY_OPERATOR(le, <=) LUABIND_BINARY_OPERATOR(eq, ==)#undef LUABIND_UNARY_OPERATOR#define LUABIND_UNARY_OPERATOR(name_, op, fn) \ namespace operators { \\ struct name_ \ { \ template<class T, class Policies> \ struct apply \ { \ static void execute(lua_State* L, T x) \ { \ detail::operator_result(L, op(x), (Policies*)0); \ } \ }; \\ static char const* name() \ { \ return "__" # name_; \ } \ }; \\ } \ \ template<class T> \ detail::unary_operator< \ operators::name_ \ , T \ > \ inline fn(self_base<T>) \ { \ return 0; \ } template<class T> std::string tostring_operator(T const& x) {#ifdef LUABIND_NO_STRINGSTREAM std::strstream s; s << x << std::ends;#else std::stringstream s; s << x;#endif return s.str(); }; LUABIND_UNARY_OPERATOR(tostring, tostring_operator, tostring) LUABIND_UNARY_OPERATOR(unm, -, operator-)#undef LUABIND_BINARY_OPERATOR namespace { LUABIND_ANONYMOUS_FIX self_type self; LUABIND_ANONYMOUS_FIX const_self_type const_self; } // namespace unnamed } // namespace luabind#endif // OPERATOR_040729_HPP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?