FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
python/include/boost/python/object/make_instance.hpp at python313 · boostorg/python · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
boostorg
/
python
Public
Notifications
You must be signed in to change notification settings
Fork
223
Star
537
Code
Issues
173
Pull requests
34
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
python
/
include
/
boost
/
python
/
object
/
make_instance.hpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
85 lines (67 loc) · 2.91 KB
Breadcrumbs
python
/
include
/
boost
/
python
/
object
/
make_instance.hpp
Copy path
File metadata and controls
85 lines (67 loc) · 2.91 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//
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
MAKE_INSTANCE_DWA200296_HPP
#
define
MAKE_INSTANCE_DWA200296_HPP
#
include
<
boost/python/detail/prefix.hpp
>
#
include
<
boost/python/object/instance.hpp
>
#
include
<
boost/python/converter/registered.hpp
>
#
include
<
boost/python/detail/decref_guard.hpp
>
#
include
<
boost/python/detail/type_traits.hpp
>
#
include
<
boost/python/detail/none.hpp
>
#
include
<
boost/mpl/assert.hpp
>
#
include
<
boost/mpl/or.hpp
>
namespace
boost
{
namespace
python
{
namespace
objects
{
template
<
class
T
,
class
Holder
,
class
Derived
>
struct
make_instance_impl
{
typedef
objects::instance<Holder>
instance_t
;
template
<
class
Arg
>
static
inline
PyObject*
execute
(Arg& x)
{
BOOST_MPL_ASSERT
((mpl::or_<boost::python::detail::is_class<T>,
boost::python::detail::is_union<T> >));
PyTypeObject* type =
Derived::get_class_object
(x);
if
(type ==
0
)
return
python::detail::none
();
PyObject* raw_result = type->
tp_alloc
(
type, objects::additional_instance_size<Holder>::value);
if
(raw_result !=
0
)
{
python::detail::decref_guard
protect
(raw_result);
instance_t
* instance = (
instance_t
*)raw_result;
//
construct the new C++ object and install the pointer
//
in the Python object.
Holder *holder =
Derived::construct
(instance->
storage
.
bytes
, (PyObject*)instance, x);
holder->
install
(raw_result);
//
Note the position of the internally-stored Holder,
//
for the sake of destruction
const
size_t
offset =
reinterpret_cast
<
size_t
>(holder) -
reinterpret_cast
<
size_t
>(instance->
storage
.
bytes
) +
offsetof
(
instance_t
, storage);
Py_SET_SIZE
(instance, offset);
//
Release ownership of the python object
protect.
cancel
();
}
return
raw_result;
}
};
template
<
class
T
,
class
Holder
>
struct
make_instance
: make_instance_impl<T, Holder, make_instance<T,Holder> >
{
template
<
class
U
>
static
inline
PyTypeObject*
get_class_object
(U&)
{
return
converter::registered<T>::converters.
get_class_object
();
}
static
inline
Holder*
construct
(
void
* storage, PyObject* instance, reference_wrapper<T
const
> x)
{
size_t
allocated = objects::additional_instance_size<Holder>::value;
void
* aligned_storage = ::
boost::alignment::align
(boost::python::detail::alignment_of<Holder>::value,
sizeof
(Holder), storage, allocated);
return
new
(aligned_storage)
Holder
(instance, x);
}
};
}}}
//
namespace boost::python::object
#
endif
//
MAKE_INSTANCE_DWA200296_HPP
Back
|
FazBrowse Home
|
New Git URL