x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
object_manager.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\python\converter\object_manager.hpp
旋转
特效
属性
历史版本
// 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 OBJECT_MANAGER_DWA2002614_HPP # define OBJECT_MANAGER_DWA2002614_HPP # include
# include
# include
# include
# include
# include
# include
// Facilities for dealing with types which always manage Python // objects. Some examples are object, list, str, et. al. Different // to_python/from_python conversion rules apply here because in // contrast to other types which are typically embedded inside a // Python object, these are wrapped around a Python object. For most // object managers T, a C++ non-const T reference argument does not // imply the existence of a T lvalue embedded in the corresponding // Python argument, since mutating member functions on T actually only // modify the held Python object. // // handle
is an object manager, though strictly speaking it should // not be. In other words, even though mutating member functions of // hanlde
actually modify the handle
and not the T object, // handle
& arguments of wrapped functions will bind to "rvalues" // wrapping the actual Python argument, just as with other object // manager classes. Making an exception for handle
is simply not // worth the trouble. // // borrowed
cv* is an object manager so that we can use the general // to_python mechanisms to convert raw Python object pointers to // python, without the usual semantic problems of using raw pointers. // Object Manager Concept requirements: // // T is an Object Manager // p is a PyObject* // x is a T // // * object_manager_traits
::is_specialized == true // // * T(detail::borrowed_reference(p)) // Manages p without checking its type // // * get_managed_object(x, boost::python::tag) // Convertible to PyObject* // // Additional requirements if T can be converted from_python: // // * T(object_manager_traits
::adopt(p)) // steals a reference to p, or throws a TypeError exception if // p doesn't have an appropriate type. May assume p is non-null // // * X::check(p) // convertible to bool. True iff T(X::construct(p)) will not // throw. // Forward declarations // namespace boost { namespace python { namespace api { class object; } }} namespace boost { namespace python { namespace converter { // Specializations for handle
template
struct handle_object_manager_traits : pyobject_traits
{ private: typedef pyobject_traits
base; public: BOOST_STATIC_CONSTANT(bool, is_specialized = true); // Initialize with a null_ok pointer for efficiency, bypassing the // null check since the source is always non-null. static null_ok
* adopt(PyObject* p) { return python::allow_null(base::checked_downcast(p)); } }; template
struct default_object_manager_traits { BOOST_STATIC_CONSTANT( bool, is_specialized = python::detail::is_borrowed_ptr
::value ); }; template
struct object_manager_traits : mpl::if_c< is_handle
::value , handle_object_manager_traits
, default_object_manager_traits
>::type { }; // // Traits for detecting whether a type is an object manager or a // (cv-qualified) reference to an object manager. // template
struct is_object_manager : mpl::bool_
::is_specialized> { }; # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct is_reference_to_object_manager : mpl::false_ { }; template
struct is_reference_to_object_manager
: is_object_manager
{ }; template
struct is_reference_to_object_manager
: is_object_manager
{ }; template
struct is_reference_to_object_manager
: is_object_manager
{ }; template
struct is_reference_to_object_manager
: is_object_manager
{ }; # else namespace detail { typedef char (&yes_reference_to_object_manager)[1]; typedef char (&no_reference_to_object_manager)[2]; // A number of nastinesses go on here in order to work around MSVC6 // bugs. template
struct is_object_manager_help { typedef typename mpl::if_< is_object_manager
, yes_reference_to_object_manager , no_reference_to_object_manager >::type type; // If we just use the type instead of the result of calling this // function, VC6 will ICE. static type call(); }; // A set of overloads for each cv-qualification. The same argument // is passed twice: the first one is used to unwind the cv*, and the // second one is used to avoid relying on partial ordering for // overload resolution. template
typename is_object_manager_help
is_object_manager_helper(U*, void*); template
typename is_object_manager_help
is_object_manager_helper(U const*, void const*); template
typename is_object_manager_help
is_object_manager_helper(U volatile*, void volatile*); template
typename is_object_manager_help
is_object_manager_helper(U const volatile*, void const volatile*); template
struct is_reference_to_object_manager_nonref : mpl::false_ { }; template
struct is_reference_to_object_manager_ref { static T sample_object; BOOST_STATIC_CONSTANT( bool, value = (sizeof(is_object_manager_helper(&sample_object, &sample_object).call()) == sizeof(detail::yes_reference_to_object_manager) ) ); typedef mpl::bool_
type; }; } template
struct is_reference_to_object_manager : mpl::if_< is_reference
, detail::is_reference_to_object_manager_ref
, detail::is_reference_to_object_manager_nonref
>::type { }; # endif }}} // namespace boost::python::converter #endif // OBJECT_MANAGER_DWA2002614_HPP
object_manager.hpp
网页地址
文件地址
上一页
12/27
下一页
下载
( 6 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.