x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
caller.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\python\detail\caller.hpp
旋转
特效
属性
历史版本
#if !defined(BOOST_PP_IS_ITERATING) // Copyright David Abrahams 2002. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) # ifndef CALLER_DWA20021121_HPP # define CALLER_DWA20021121_HPP # include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
namespace boost { namespace python { namespace detail { template
inline PyObject* get(mpl::int_
, PyObject* const& args_) { return PyTuple_GET_ITEM(args_,N); } inline unsigned arity(PyObject* const& args_) { return PyTuple_GET_SIZE(args_); } // This "result converter" is really just used as // a dispatch tag to invoke(...), selecting the appropriate // implementation typedef int void_result_to_python; // Given a model of CallPolicies and a C++ result type, this // metafunction selects the appropriate converter to use for // converting the result to python. template
struct select_result_converter : mpl::eval_if< is_same
, mpl::identity
, mpl::apply1
> { }; template
inline ResultConverter create_result_converter( ArgPackage const& args_ , ResultConverter* , converter::context_result_converter* ) { return ResultConverter(args_); } template
inline ResultConverter create_result_converter( ArgPackage const& , ResultConverter* , ... ) { return ResultConverter(); } #ifndef BOOST_PYTHON_NO_PY_SIGNATURES template
struct converter_target_type { static PyTypeObject const *get_pytype() { return create_result_converter((PyObject*)0, (ResultConverter *)0, (ResultConverter *)0).get_pytype(); } }; template < > struct converter_target_type
{ static PyTypeObject const *get_pytype() { return 0; } }; #endif template
struct caller_arity; template
struct caller; # define BOOST_PYTHON_NEXT(init,name,n) \ typedef BOOST_PP_IF(n,typename mpl::next< BOOST_PP_CAT(name,BOOST_PP_DEC(n)) >::type, init) name##n; # define BOOST_PYTHON_ARG_CONVERTER(n) \ BOOST_PYTHON_NEXT(typename mpl::next
::type, arg_iter,n) \ typedef arg_from_python
c_t##n; \ c_t##n c##n(get(mpl::int_
(), inner_args)); \ if (!c##n.convertible()) \ return 0; # define BOOST_PP_ITERATION_PARAMS_1 \ (3, (0, BOOST_PYTHON_MAX_ARITY + 1,
)) # include BOOST_PP_ITERATE() # undef BOOST_PYTHON_ARG_CONVERTER # undef BOOST_PYTHON_NEXT // A metafunction returning the base class used for caller
. template
struct caller_base_select { enum { arity = mpl::size
::value - 1 }; typedef typename caller_arity
::template impl
type; }; // A function object type which wraps C++ objects as Python callable // objects. // // Template Arguments: // // F - // the C++ `function object' that will be called. Might // actually be any data for which an appropriate invoke_tag() can // be generated. invoke(...) takes care of the actual invocation syntax. // // CallPolicies - // The precall, postcall, and what kind of resultconverter to // generate for mpl::front
::type // // Sig - // The `intended signature' of the function. An MPL sequence // beginning with a result type and continuing with a list of // argument types. template
struct caller : caller_base_select
::type { typedef typename caller_base_select< F,CallPolicies,Sig >::type base; typedef PyObject* result_type; caller(F f, CallPolicies p) : base(f,p) {} }; }}} // namespace boost::python::detail # endif // CALLER_DWA20021121_HPP #else # define N BOOST_PP_ITERATION() template <> struct caller_arity
{ template
struct impl { impl(F f, Policies p) : m_data(f,p) {} PyObject* operator()(PyObject* args_, PyObject*) // eliminate // this // trailing // keyword dict { typedef typename mpl::begin
::type first; typedef typename first::type result_t; typedef typename select_result_converter
::type result_converter; typedef typename Policies::argument_package argument_package; argument_package inner_args(args_); # if N # define BOOST_PP_LOCAL_MACRO(i) BOOST_PYTHON_ARG_CONVERTER(i) # define BOOST_PP_LOCAL_LIMITS (0, N-1) # include BOOST_PP_LOCAL_ITERATE() # endif // all converters have been checked. Now we can do the // precall part of the policy if (!m_data.second().precall(inner_args)) return 0; PyObject* result = detail::invoke( detail::invoke_tag
() , create_result_converter(args_, (result_converter*)0, (result_converter*)0) , m_data.first() BOOST_PP_ENUM_TRAILING_PARAMS(N, c) ); return m_data.second().postcall(inner_args, result); } static unsigned min_arity() { return N; } static py_func_sig_info signature() { const signature_element * sig = detail::signature
::elements(); #ifndef BOOST_PYTHON_NO_PY_SIGNATURES typedef BOOST_DEDUCED_TYPENAME Policies::template extract_return_type
::type rtype; typedef typename select_result_converter
::type result_converter; static const signature_element ret = { (boost::is_void
::value ? "void" : type_id
().name()) , &detail::converter_target_type
::get_pytype , boost::detail::indirect_traits::is_reference_to_non_const
::value }; py_func_sig_info res = {sig, &ret }; #else py_func_sig_info res = {sig, sig }; #endif return res; } private: compressed_pair
m_data; }; }; #endif // BOOST_PP_IS_ITERATING
caller.hpp
网页地址
文件地址
上一页
4/65
下一页
下载
( 8 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.