Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
pybind11
Commits
135fd149
Commit
135fd149
authored
Oct 16, 2016
by
Wenzel Jakob
Committed by
GitHub
Oct 16, 2016
Browse files
Merge pull request #449 from jagerman/no-implicit-conversions
Disable most implicit conversion constructors
parents
946f897d
12d76600
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
40 additions
and
33 deletions
+40
-33
include/pybind11/cast.h
include/pybind11/cast.h
+5
-5
include/pybind11/common.h
include/pybind11/common.h
+1
-1
include/pybind11/numpy.h
include/pybind11/numpy.h
+9
-9
include/pybind11/pybind11.h
include/pybind11/pybind11.h
+6
-6
include/pybind11/pytypes.h
include/pybind11/pytypes.h
+19
-12
No files found.
include/pybind11/cast.h
View file @
135fd149
...
@@ -311,7 +311,7 @@ public:
...
@@ -311,7 +311,7 @@ public:
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
<
type
>
());
}
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
<
type
>
());
}
type_caster_base
()
:
type_caster_base
(
typeid
(
type
))
{
}
type_caster_base
()
:
type_caster_base
(
typeid
(
type
))
{
}
type_caster_base
(
const
std
::
type_info
&
info
)
:
type_caster_generic
(
info
)
{
}
explicit
type_caster_base
(
const
std
::
type_info
&
info
)
:
type_caster_generic
(
info
)
{
}
static
handle
cast
(
const
itype
&
src
,
return_value_policy
policy
,
handle
parent
)
{
static
handle
cast
(
const
itype
&
src
,
return_value_policy
policy
,
handle
parent
)
{
if
(
policy
==
return_value_policy
::
automatic
||
policy
==
return_value_policy
::
automatic_reference
)
if
(
policy
==
return_value_policy
::
automatic
||
policy
==
return_value_policy
::
automatic_reference
)
...
@@ -1154,7 +1154,7 @@ template <return_value_policy policy>
...
@@ -1154,7 +1154,7 @@ template <return_value_policy policy>
class
simple_collector
{
class
simple_collector
{
public:
public:
template
<
typename
...
Ts
>
template
<
typename
...
Ts
>
simple_collector
(
Ts
&&
...
values
)
explicit
simple_collector
(
Ts
&&
...
values
)
:
m_args
(
pybind11
::
make_tuple
<
policy
>
(
std
::
forward
<
Ts
>
(
values
)...))
{
}
:
m_args
(
pybind11
::
make_tuple
<
policy
>
(
std
::
forward
<
Ts
>
(
values
)...))
{
}
const
tuple
&
args
()
const
&
{
return
m_args
;
}
const
tuple
&
args
()
const
&
{
return
m_args
;
}
...
@@ -1179,7 +1179,7 @@ template <return_value_policy policy>
...
@@ -1179,7 +1179,7 @@ template <return_value_policy policy>
class
unpacking_collector
{
class
unpacking_collector
{
public:
public:
template
<
typename
...
Ts
>
template
<
typename
...
Ts
>
unpacking_collector
(
Ts
&&
...
values
)
{
explicit
unpacking_collector
(
Ts
&&
...
values
)
{
// Tuples aren't (easily) resizable so a list is needed for collection,
// Tuples aren't (easily) resizable so a list is needed for collection,
// but the actual function call strictly requires a tuple.
// but the actual function call strictly requires a tuple.
auto
args_list
=
list
();
auto
args_list
=
list
();
...
@@ -1283,7 +1283,7 @@ private:
...
@@ -1283,7 +1283,7 @@ private:
template
<
return_value_policy
policy
,
typename
...
Args
,
template
<
return_value_policy
policy
,
typename
...
Args
,
typename
=
enable_if_t
<
all_of_t
<
is_positional
,
Args
...>
::
value
>>
typename
=
enable_if_t
<
all_of_t
<
is_positional
,
Args
...>
::
value
>>
simple_collector
<
policy
>
collect_arguments
(
Args
&&
...
args
)
{
simple_collector
<
policy
>
collect_arguments
(
Args
&&
...
args
)
{
return
{
std
::
forward
<
Args
>
(
args
)...
}
;
return
simple_collector
<
policy
>
(
std
::
forward
<
Args
>
(
args
)...
)
;
}
}
/// Collect all arguments, including keywords and unpacking (only instantiated when needed)
/// Collect all arguments, including keywords and unpacking (only instantiated when needed)
...
@@ -1297,7 +1297,7 @@ unpacking_collector<policy> collect_arguments(Args &&...args) {
...
@@ -1297,7 +1297,7 @@ unpacking_collector<policy> collect_arguments(Args &&...args) {
"Invalid function call: positional args must precede keywords and ** unpacking; "
"Invalid function call: positional args must precede keywords and ** unpacking; "
"* unpacking must precede ** unpacking"
"* unpacking must precede ** unpacking"
);
);
return
{
std
::
forward
<
Args
>
(
args
)...
}
;
return
unpacking_collector
<
policy
>
(
std
::
forward
<
Args
>
(
args
)...
)
;
}
}
template
<
typename
Derived
>
template
<
typename
Derived
>
...
...
include/pybind11/common.h
View file @
135fd149
...
@@ -248,7 +248,7 @@ struct buffer_info {
...
@@ -248,7 +248,7 @@ struct buffer_info {
:
buffer_info
(
ptr
,
itemsize
,
format
,
1
,
std
::
vector
<
size_t
>
{
size
},
:
buffer_info
(
ptr
,
itemsize
,
format
,
1
,
std
::
vector
<
size_t
>
{
size
},
std
::
vector
<
size_t
>
{
itemsize
})
{
}
std
::
vector
<
size_t
>
{
itemsize
})
{
}
buffer_info
(
Py_buffer
*
view
,
bool
ownview
=
true
)
explicit
buffer_info
(
Py_buffer
*
view
,
bool
ownview
=
true
)
:
ptr
(
view
->
buf
),
itemsize
((
size_t
)
view
->
itemsize
),
size
(
1
),
format
(
view
->
format
),
:
ptr
(
view
->
buf
),
itemsize
((
size_t
)
view
->
itemsize
),
size
(
1
),
format
(
view
->
format
),
ndim
((
size_t
)
view
->
ndim
),
shape
((
size_t
)
view
->
ndim
),
strides
((
size_t
)
view
->
ndim
),
view
(
view
),
ownview
(
ownview
)
{
ndim
((
size_t
)
view
->
ndim
),
shape
((
size_t
)
view
->
ndim
),
strides
((
size_t
)
view
->
ndim
),
view
(
view
),
ownview
(
ownview
)
{
for
(
size_t
i
=
0
;
i
<
(
size_t
)
view
->
ndim
;
++
i
)
{
for
(
size_t
i
=
0
;
i
<
(
size_t
)
view
->
ndim
;
++
i
)
{
...
...
include/pybind11/numpy.h
View file @
135fd149
...
@@ -165,16 +165,16 @@ class dtype : public object {
...
@@ -165,16 +165,16 @@ class dtype : public object {
public:
public:
PYBIND11_OBJECT_DEFAULT
(
dtype
,
object
,
detail
::
npy_api
::
get
().
PyArrayDescr_Check_
);
PYBIND11_OBJECT_DEFAULT
(
dtype
,
object
,
detail
::
npy_api
::
get
().
PyArrayDescr_Check_
);
dtype
(
const
buffer_info
&
info
)
{
explicit
dtype
(
const
buffer_info
&
info
)
{
dtype
descr
(
_dtype_from_pep3118
()(
PYBIND11_STR_TYPE
(
info
.
format
)));
dtype
descr
(
_dtype_from_pep3118
()(
PYBIND11_STR_TYPE
(
info
.
format
)));
m_ptr
=
descr
.
strip_padding
().
release
().
ptr
();
m_ptr
=
descr
.
strip_padding
().
release
().
ptr
();
}
}
dtype
(
std
::
string
format
)
{
explicit
dtype
(
std
::
string
format
)
{
m_ptr
=
from_args
(
pybind11
::
str
(
format
)).
release
().
ptr
();
m_ptr
=
from_args
(
pybind11
::
str
(
format
)).
release
().
ptr
();
}
}
dtype
(
const
char
*
format
)
:
dtype
(
std
::
string
(
format
))
{
}
explicit
dtype
(
const
char
*
format
)
:
dtype
(
std
::
string
(
format
))
{
}
dtype
(
list
names
,
list
formats
,
list
offsets
,
size_t
itemsize
)
{
dtype
(
list
names
,
list
formats
,
list
offsets
,
size_t
itemsize
)
{
dict
args
;
dict
args
;
...
@@ -317,7 +317,7 @@ public:
...
@@ -317,7 +317,7 @@ public:
array
(
size_t
count
,
const
T
*
ptr
,
handle
base
=
handle
())
array
(
size_t
count
,
const
T
*
ptr
,
handle
base
=
handle
())
:
array
(
std
::
vector
<
size_t
>
{
count
},
ptr
,
base
)
{
}
:
array
(
std
::
vector
<
size_t
>
{
count
},
ptr
,
base
)
{
}
array
(
const
buffer_info
&
info
)
explicit
array
(
const
buffer_info
&
info
)
:
array
(
pybind11
::
dtype
(
info
),
info
.
shape
,
info
.
strides
,
info
.
ptr
)
{
}
:
array
(
pybind11
::
dtype
(
info
),
info
.
shape
,
info
.
strides
,
info
.
ptr
)
{
}
/// Array descriptor (dtype)
/// Array descriptor (dtype)
...
@@ -477,18 +477,18 @@ public:
...
@@ -477,18 +477,18 @@ public:
array_t
()
:
array
()
{
}
array_t
()
:
array
()
{
}
array_t
(
const
buffer_info
&
info
)
:
array
(
info
)
{
}
explicit
array_t
(
const
buffer_info
&
info
)
:
array
(
info
)
{
}
array_t
(
const
std
::
vector
<
size_t
>
&
shape
,
array_t
(
const
std
::
vector
<
size_t
>
&
shape
,
const
std
::
vector
<
size_t
>
&
strides
,
const
T
*
ptr
=
nullptr
,
const
std
::
vector
<
size_t
>
&
strides
,
const
T
*
ptr
=
nullptr
,
handle
base
=
handle
())
handle
base
=
handle
())
:
array
(
shape
,
strides
,
ptr
,
base
)
{
}
:
array
(
shape
,
strides
,
ptr
,
base
)
{
}
array_t
(
const
std
::
vector
<
size_t
>
&
shape
,
const
T
*
ptr
=
nullptr
,
explicit
array_t
(
const
std
::
vector
<
size_t
>
&
shape
,
const
T
*
ptr
=
nullptr
,
handle
base
=
handle
())
handle
base
=
handle
())
:
array
(
shape
,
ptr
,
base
)
{
}
:
array
(
shape
,
ptr
,
base
)
{
}
array_t
(
size_t
count
,
const
T
*
ptr
=
nullptr
,
handle
base
=
handle
())
explicit
array_t
(
size_t
count
,
const
T
*
ptr
=
nullptr
,
handle
base
=
handle
())
:
array
(
count
,
ptr
,
base
)
{
}
:
array
(
count
,
ptr
,
base
)
{
}
constexpr
size_t
itemsize
()
const
{
constexpr
size_t
itemsize
()
const
{
...
@@ -607,7 +607,7 @@ DECL_FMT(std::complex<double>, NPY_CDOUBLE_, "complex128");
...
@@ -607,7 +607,7 @@ DECL_FMT(std::complex<double>, NPY_CDOUBLE_, "complex128");
#define DECL_CHAR_FMT \
#define DECL_CHAR_FMT \
static PYBIND11_DESCR name() { return _("S") + _<N>(); } \
static PYBIND11_DESCR name() { return _("S") + _<N>(); } \
static pybind11::dtype dtype() { return std::string("S") + std::to_string(N); }
static pybind11::dtype dtype() { return
pybind11::dtype(
std::string("S") + std::to_string(N)
)
; }
template
<
size_t
N
>
struct
npy_format_descriptor
<
char
[
N
]
>
{
DECL_CHAR_FMT
};
template
<
size_t
N
>
struct
npy_format_descriptor
<
char
[
N
]
>
{
DECL_CHAR_FMT
};
template
<
size_t
N
>
struct
npy_format_descriptor
<
std
::
array
<
char
,
N
>>
{
DECL_CHAR_FMT
};
template
<
size_t
N
>
struct
npy_format_descriptor
<
std
::
array
<
char
,
N
>>
{
DECL_CHAR_FMT
};
#undef DECL_CHAR_FMT
#undef DECL_CHAR_FMT
...
@@ -883,7 +883,7 @@ struct vectorize_helper {
...
@@ -883,7 +883,7 @@ struct vectorize_helper {
typename
std
::
remove_reference
<
Func
>::
type
f
;
typename
std
::
remove_reference
<
Func
>::
type
f
;
template
<
typename
T
>
template
<
typename
T
>
vectorize_helper
(
T
&&
f
)
:
f
(
std
::
forward
<
T
>
(
f
))
{
}
explicit
vectorize_helper
(
T
&&
f
)
:
f
(
std
::
forward
<
T
>
(
f
))
{
}
object
operator
()(
array_t
<
Args
,
array
::
c_style
|
array
::
forcecast
>
...
args
)
{
object
operator
()(
array_t
<
Args
,
array
::
c_style
|
array
::
forcecast
>
...
args
)
{
return
run
(
args
...,
typename
make_index_sequence
<
sizeof
...(
Args
)
>::
type
());
return
run
(
args
...,
typename
make_index_sequence
<
sizeof
...(
Args
)
>::
type
());
...
...
include/pybind11/pybind11.h
View file @
135fd149
...
@@ -44,12 +44,12 @@ public:
...
@@ -44,12 +44,12 @@ public:
/// Construct a cpp_function from a vanilla function pointer
/// Construct a cpp_function from a vanilla function pointer
template
<
typename
Return
,
typename
...
Args
,
typename
...
Extra
>
template
<
typename
Return
,
typename
...
Args
,
typename
...
Extra
>
cpp_function
(
Return
(
*
f
)(
Args
...),
const
Extra
&
...
extra
)
{
explicit
cpp_function
(
Return
(
*
f
)(
Args
...),
const
Extra
&
...
extra
)
{
initialize
(
f
,
f
,
extra
...);
initialize
(
f
,
f
,
extra
...);
}
}
/// Construct a cpp_function from a lambda function (possibly with internal state)
/// Construct a cpp_function from a lambda function (possibly with internal state)
template
<
typename
Func
,
typename
...
Extra
>
cpp_function
(
Func
&&
f
,
const
Extra
&
...
extra
)
{
template
<
typename
Func
,
typename
...
Extra
>
explicit
cpp_function
(
Func
&&
f
,
const
Extra
&
...
extra
)
{
initialize
(
std
::
forward
<
Func
>
(
f
),
initialize
(
std
::
forward
<
Func
>
(
f
),
(
typename
detail
::
remove_class
<
decltype
(
(
typename
detail
::
remove_class
<
decltype
(
&
std
::
remove_reference
<
Func
>::
type
::
operator
())
>::
type
*
)
nullptr
,
extra
...);
&
std
::
remove_reference
<
Func
>::
type
::
operator
())
>::
type
*
)
nullptr
,
extra
...);
...
@@ -57,14 +57,14 @@ public:
...
@@ -57,14 +57,14 @@ public:
/// Construct a cpp_function from a class method (non-const)
/// Construct a cpp_function from a class method (non-const)
template
<
typename
Return
,
typename
Class
,
typename
...
Arg
,
typename
...
Extra
>
template
<
typename
Return
,
typename
Class
,
typename
...
Arg
,
typename
...
Extra
>
cpp_function
(
Return
(
Class
::*
f
)(
Arg
...),
const
Extra
&
...
extra
)
{
explicit
cpp_function
(
Return
(
Class
::*
f
)(
Arg
...),
const
Extra
&
...
extra
)
{
initialize
([
f
](
Class
*
c
,
Arg
...
args
)
->
Return
{
return
(
c
->*
f
)(
args
...);
},
initialize
([
f
](
Class
*
c
,
Arg
...
args
)
->
Return
{
return
(
c
->*
f
)(
args
...);
},
(
Return
(
*
)
(
Class
*
,
Arg
...))
nullptr
,
extra
...);
(
Return
(
*
)
(
Class
*
,
Arg
...))
nullptr
,
extra
...);
}
}
/// Construct a cpp_function from a class method (const)
/// Construct a cpp_function from a class method (const)
template
<
typename
Return
,
typename
Class
,
typename
...
Arg
,
typename
...
Extra
>
template
<
typename
Return
,
typename
Class
,
typename
...
Arg
,
typename
...
Extra
>
cpp_function
(
Return
(
Class
::*
f
)(
Arg
...)
const
,
const
Extra
&
...
extra
)
{
explicit
cpp_function
(
Return
(
Class
::*
f
)(
Arg
...)
const
,
const
Extra
&
...
extra
)
{
initialize
([
f
](
const
Class
*
c
,
Arg
...
args
)
->
Return
{
return
(
c
->*
f
)(
args
...);
},
initialize
([
f
](
const
Class
*
c
,
Arg
...
args
)
->
Return
{
return
(
c
->*
f
)(
args
...);
},
(
Return
(
*
)(
const
Class
*
,
Arg
...))
nullptr
,
extra
...);
(
Return
(
*
)(
const
Class
*
,
Arg
...))
nullptr
,
extra
...);
}
}
...
@@ -528,7 +528,7 @@ class module : public object {
...
@@ -528,7 +528,7 @@ class module : public object {
public:
public:
PYBIND11_OBJECT_DEFAULT
(
module
,
object
,
PyModule_Check
)
PYBIND11_OBJECT_DEFAULT
(
module
,
object
,
PyModule_Check
)
module
(
const
char
*
name
,
const
char
*
doc
=
nullptr
)
{
explicit
module
(
const
char
*
name
,
const
char
*
doc
=
nullptr
)
{
#if PY_MAJOR_VERSION >= 3
#if PY_MAJOR_VERSION >= 3
PyModuleDef
*
def
=
new
PyModuleDef
();
PyModuleDef
*
def
=
new
PyModuleDef
();
memset
(
def
,
0
,
sizeof
(
PyModuleDef
));
memset
(
def
,
0
,
sizeof
(
PyModuleDef
));
...
@@ -1524,7 +1524,7 @@ private:
...
@@ -1524,7 +1524,7 @@ private:
class
gil_scoped_release
{
class
gil_scoped_release
{
public:
public:
gil_scoped_release
(
bool
disassoc
=
false
)
:
disassoc
(
disassoc
)
{
explicit
gil_scoped_release
(
bool
disassoc
=
false
)
:
disassoc
(
disassoc
)
{
tstate
=
PyEval_SaveThread
();
tstate
=
PyEval_SaveThread
();
if
(
disassoc
)
{
if
(
disassoc
)
{
auto
key
=
detail
::
get_internals
().
tstate
;
auto
key
=
detail
::
get_internals
().
tstate
;
...
...
include/pybind11/pytypes.h
View file @
135fd149
...
@@ -317,7 +317,7 @@ NAMESPACE_END(accessor_policies)
...
@@ -317,7 +317,7 @@ NAMESPACE_END(accessor_policies)
struct
dict_iterator
{
struct
dict_iterator
{
public:
public:
dict_iterator
(
handle
dict
=
handle
(),
ssize_t
pos
=
-
1
)
:
dict
(
dict
),
pos
(
pos
)
{
}
explicit
dict_iterator
(
handle
dict
=
handle
(),
ssize_t
pos
=
-
1
)
:
dict
(
dict
),
pos
(
pos
)
{
}
dict_iterator
&
operator
++
()
{
dict_iterator
&
operator
++
()
{
if
(
!
PyDict_Next
(
dict
.
ptr
(),
&
pos
,
&
key
.
ptr
(),
&
value
.
ptr
()))
if
(
!
PyDict_Next
(
dict
.
ptr
(),
&
pos
,
&
key
.
ptr
(),
&
value
.
ptr
()))
pos
=
-
1
;
pos
=
-
1
;
...
@@ -350,12 +350,12 @@ inline bool PyUnicode_Check_Permissive(PyObject *o) { return PyUnicode_Check(o)
...
@@ -350,12 +350,12 @@ inline bool PyUnicode_Check_Permissive(PyObject *o) { return PyUnicode_Check(o)
class
kwargs_proxy
:
public
handle
{
class
kwargs_proxy
:
public
handle
{
public:
public:
kwargs_proxy
(
handle
h
)
:
handle
(
h
)
{
}
explicit
kwargs_proxy
(
handle
h
)
:
handle
(
h
)
{
}
};
};
class
args_proxy
:
public
handle
{
class
args_proxy
:
public
handle
{
public:
public:
args_proxy
(
handle
h
)
:
handle
(
h
)
{
}
explicit
args_proxy
(
handle
h
)
:
handle
(
h
)
{
}
kwargs_proxy
operator
*
()
const
{
return
kwargs_proxy
(
*
this
);
}
kwargs_proxy
operator
*
()
const
{
return
kwargs_proxy
(
*
this
);
}
};
};
...
@@ -381,6 +381,7 @@ NAMESPACE_END(detail)
...
@@ -381,6 +381,7 @@ NAMESPACE_END(detail)
#define PYBIND11_OBJECT_CVT(Name, Parent, CheckFun, CvtStmt) \
#define PYBIND11_OBJECT_CVT(Name, Parent, CheckFun, CvtStmt) \
public: \
public: \
Name(const handle &h, bool borrowed) : Parent(h, borrowed) { CvtStmt; } \
Name(const handle &h, bool borrowed) : Parent(h, borrowed) { CvtStmt; } \
/* These are deliberately not 'explicit' to allow implicit conversion from object: */
\
Name(const object& o): Parent(o) { CvtStmt; } \
Name(const object& o): Parent(o) { CvtStmt; } \
Name(object&& o) noexcept : Parent(std::move(o)) { CvtStmt; } \
Name(object&& o) noexcept : Parent(std::move(o)) { CvtStmt; } \
Name& operator=(object&& o) noexcept { (void) object::operator=(std::move(o)); CvtStmt; return *this; } \
Name& operator=(object&& o) noexcept { (void) object::operator=(std::move(o)); CvtStmt; return *this; } \
...
@@ -470,6 +471,7 @@ public:
...
@@ -470,6 +471,7 @@ public:
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate string object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate string object!"
);
}
}
// 'explicit' is explicitly omitted from the following constructors to allow implicit conversion to py::str from C++ string-like objects
str
(
const
char
*
c
)
str
(
const
char
*
c
)
:
object
(
PyUnicode_FromString
(
c
),
false
)
{
:
object
(
PyUnicode_FromString
(
c
),
false
)
{
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate string object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate string object!"
);
...
@@ -477,7 +479,7 @@ public:
...
@@ -477,7 +479,7 @@ public:
str
(
const
std
::
string
&
s
)
:
str
(
s
.
data
(),
s
.
size
())
{
}
str
(
const
std
::
string
&
s
)
:
str
(
s
.
data
(),
s
.
size
())
{
}
str
(
const
bytes
&
b
);
explicit
str
(
const
bytes
&
b
);
operator
std
::
string
()
const
{
operator
std
::
string
()
const
{
object
temp
=
*
this
;
object
temp
=
*
this
;
...
@@ -508,6 +510,7 @@ class bytes : public object {
...
@@ -508,6 +510,7 @@ class bytes : public object {
public:
public:
PYBIND11_OBJECT_DEFAULT
(
bytes
,
object
,
PYBIND11_BYTES_CHECK
)
PYBIND11_OBJECT_DEFAULT
(
bytes
,
object
,
PYBIND11_BYTES_CHECK
)
// Allow implicit conversion:
bytes
(
const
char
*
c
)
bytes
(
const
char
*
c
)
:
object
(
PYBIND11_BYTES_FROM_STRING
(
c
),
false
)
{
:
object
(
PYBIND11_BYTES_FROM_STRING
(
c
),
false
)
{
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate bytes object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate bytes object!"
);
...
@@ -518,9 +521,10 @@ public:
...
@@ -518,9 +521,10 @@ public:
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate bytes object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate bytes object!"
);
}
}
// Allow implicit conversion:
bytes
(
const
std
::
string
&
s
)
:
bytes
(
s
.
data
(),
s
.
size
())
{
}
bytes
(
const
std
::
string
&
s
)
:
bytes
(
s
.
data
(),
s
.
size
())
{
}
bytes
(
const
pybind11
::
str
&
s
);
explicit
bytes
(
const
pybind11
::
str
&
s
);
operator
std
::
string
()
const
{
operator
std
::
string
()
const
{
char
*
buffer
;
char
*
buffer
;
...
@@ -568,6 +572,7 @@ public:
...
@@ -568,6 +572,7 @@ public:
class
bool_
:
public
object
{
class
bool_
:
public
object
{
public:
public:
PYBIND11_OBJECT_DEFAULT
(
bool_
,
object
,
PyBool_Check
)
PYBIND11_OBJECT_DEFAULT
(
bool_
,
object
,
PyBool_Check
)
// Allow implicit conversion from `bool`:
bool_
(
bool
value
)
:
object
(
value
?
Py_True
:
Py_False
,
true
)
{
}
bool_
(
bool
value
)
:
object
(
value
?
Py_True
:
Py_False
,
true
)
{
}
operator
bool
()
const
{
return
m_ptr
&&
PyLong_AsLong
(
m_ptr
)
!=
0
;
}
operator
bool
()
const
{
return
m_ptr
&&
PyLong_AsLong
(
m_ptr
)
!=
0
;
}
};
};
...
@@ -575,6 +580,7 @@ public:
...
@@ -575,6 +580,7 @@ public:
class
int_
:
public
object
{
class
int_
:
public
object
{
public:
public:
PYBIND11_OBJECT_DEFAULT
(
int_
,
object
,
PYBIND11_LONG_CHECK
)
PYBIND11_OBJECT_DEFAULT
(
int_
,
object
,
PYBIND11_LONG_CHECK
)
// Allow implicit conversion from C++ integral types:
template
<
typename
T
,
template
<
typename
T
,
detail
::
enable_if_t
<
std
::
is_integral
<
T
>
::
value
,
int
>
=
0
>
detail
::
enable_if_t
<
std
::
is_integral
<
T
>
::
value
,
int
>
=
0
>
int_
(
T
value
)
{
int_
(
T
value
)
{
...
@@ -612,6 +618,7 @@ public:
...
@@ -612,6 +618,7 @@ public:
class
float_
:
public
object
{
class
float_
:
public
object
{
public:
public:
PYBIND11_OBJECT_DEFAULT
(
float_
,
object
,
PyFloat_Check
)
PYBIND11_OBJECT_DEFAULT
(
float_
,
object
,
PyFloat_Check
)
// Allow implicit conversion from float/double:
float_
(
float
value
)
:
object
(
PyFloat_FromDouble
((
double
)
value
),
false
)
{
float_
(
float
value
)
:
object
(
PyFloat_FromDouble
((
double
)
value
),
false
)
{
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate float object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate float object!"
);
}
}
...
@@ -625,7 +632,7 @@ public:
...
@@ -625,7 +632,7 @@ public:
class
weakref
:
public
object
{
class
weakref
:
public
object
{
public:
public:
PYBIND11_OBJECT_DEFAULT
(
weakref
,
object
,
PyWeakref_Check
)
PYBIND11_OBJECT_DEFAULT
(
weakref
,
object
,
PyWeakref_Check
)
weakref
(
handle
obj
,
handle
callback
=
handle
())
:
object
(
PyWeakref_NewRef
(
obj
.
ptr
(),
callback
.
ptr
()),
false
)
{
explicit
weakref
(
handle
obj
,
handle
callback
=
handle
())
:
object
(
PyWeakref_NewRef
(
obj
.
ptr
(),
callback
.
ptr
()),
false
)
{
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate weak reference!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate weak reference!"
);
}
}
};
};
...
@@ -651,7 +658,7 @@ class capsule : public object {
...
@@ -651,7 +658,7 @@ class capsule : public object {
public:
public:
PYBIND11_OBJECT_DEFAULT
(
capsule
,
object
,
PyCapsule_CheckExact
)
PYBIND11_OBJECT_DEFAULT
(
capsule
,
object
,
PyCapsule_CheckExact
)
capsule
(
PyObject
*
obj
,
bool
borrowed
)
:
object
(
obj
,
borrowed
)
{
}
capsule
(
PyObject
*
obj
,
bool
borrowed
)
:
object
(
obj
,
borrowed
)
{
}
capsule
(
const
void
*
value
,
void
(
*
destruct
)(
PyObject
*
)
=
nullptr
)
explicit
capsule
(
const
void
*
value
,
void
(
*
destruct
)(
PyObject
*
)
=
nullptr
)
:
object
(
PyCapsule_New
(
const_cast
<
void
*>
(
value
),
nullptr
,
destruct
),
false
)
{
:
object
(
PyCapsule_New
(
const_cast
<
void
*>
(
value
),
nullptr
,
destruct
),
false
)
{
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate capsule object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate capsule object!"
);
}
}
...
@@ -665,7 +672,7 @@ public:
...
@@ -665,7 +672,7 @@ public:
class
tuple
:
public
object
{
class
tuple
:
public
object
{
public:
public:
PYBIND11_OBJECT
(
tuple
,
object
,
PyTuple_Check
)
PYBIND11_OBJECT
(
tuple
,
object
,
PyTuple_Check
)
tuple
(
size_t
size
=
0
)
:
object
(
PyTuple_New
((
ssize_t
)
size
),
false
)
{
explicit
tuple
(
size_t
size
=
0
)
:
object
(
PyTuple_New
((
ssize_t
)
size
),
false
)
{
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate tuple object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate tuple object!"
);
}
}
size_t
size
()
const
{
return
(
size_t
)
PyTuple_Size
(
m_ptr
);
}
size_t
size
()
const
{
return
(
size_t
)
PyTuple_Size
(
m_ptr
);
}
...
@@ -682,7 +689,7 @@ public:
...
@@ -682,7 +689,7 @@ public:
typename
=
detail
::
enable_if_t
<
detail
::
all_of_t
<
detail
::
is_keyword_or_ds
,
Args
...>
::
value
>
,
typename
=
detail
::
enable_if_t
<
detail
::
all_of_t
<
detail
::
is_keyword_or_ds
,
Args
...>
::
value
>
,
// MSVC workaround: it can't compile an out-of-line definition, so defer the collector
// MSVC workaround: it can't compile an out-of-line definition, so defer the collector
typename
collector
=
detail
::
deferred_t
<
detail
::
unpacking_collector
<>
,
Args
...
>>
typename
collector
=
detail
::
deferred_t
<
detail
::
unpacking_collector
<>
,
Args
...
>>
dict
(
Args
&&
...
args
)
:
dict
(
collector
(
std
::
forward
<
Args
>
(
args
)...).
kwargs
())
{
}
explicit
dict
(
Args
&&
...
args
)
:
dict
(
collector
(
std
::
forward
<
Args
>
(
args
)...).
kwargs
())
{
}
size_t
size
()
const
{
return
(
size_t
)
PyDict_Size
(
m_ptr
);
}
size_t
size
()
const
{
return
(
size_t
)
PyDict_Size
(
m_ptr
);
}
detail
::
dict_iterator
begin
()
const
{
return
(
++
detail
::
dict_iterator
(
*
this
,
0
));
}
detail
::
dict_iterator
begin
()
const
{
return
(
++
detail
::
dict_iterator
(
*
this
,
0
));
}
...
@@ -702,7 +709,7 @@ public:
...
@@ -702,7 +709,7 @@ public:
class
list
:
public
object
{
class
list
:
public
object
{
public:
public:
PYBIND11_OBJECT
(
list
,
object
,
PyList_Check
)
PYBIND11_OBJECT
(
list
,
object
,
PyList_Check
)
list
(
size_t
size
=
0
)
:
object
(
PyList_New
((
ssize_t
)
size
),
false
)
{
explicit
list
(
size_t
size
=
0
)
:
object
(
PyList_New
((
ssize_t
)
size
),
false
)
{
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate list object!"
);
if
(
!
m_ptr
)
pybind11_fail
(
"Could not allocate list object!"
);
}
}
size_t
size
()
const
{
return
(
size_t
)
PyList_Size
(
m_ptr
);
}
size_t
size
()
const
{
return
(
size_t
)
PyList_Size
(
m_ptr
);
}
...
@@ -749,7 +756,7 @@ public:
...
@@ -749,7 +756,7 @@ public:
class
memoryview
:
public
object
{
class
memoryview
:
public
object
{
public:
public:
memoryview
(
const
buffer_info
&
info
)
{
explicit
memoryview
(
const
buffer_info
&
info
)
{
static
Py_buffer
buf
{
};
static
Py_buffer
buf
{
};
// Py_buffer uses signed sizes, strides and shape!..
// Py_buffer uses signed sizes, strides and shape!..
static
std
::
vector
<
Py_ssize_t
>
py_strides
{
};
static
std
::
vector
<
Py_ssize_t
>
py_strides
{
};
...
@@ -793,7 +800,7 @@ template <typename D> item_accessor object_api<D>::operator[](handle key) const
...
@@ -793,7 +800,7 @@ template <typename D> item_accessor object_api<D>::operator[](handle key) const
template
<
typename
D
>
item_accessor
object_api
<
D
>::
operator
[](
const
char
*
key
)
const
{
return
{
derived
(),
pybind11
::
str
(
key
)};
}
template
<
typename
D
>
item_accessor
object_api
<
D
>::
operator
[](
const
char
*
key
)
const
{
return
{
derived
(),
pybind11
::
str
(
key
)};
}
template
<
typename
D
>
obj_attr_accessor
object_api
<
D
>::
attr
(
handle
key
)
const
{
return
{
derived
(),
object
(
key
,
true
)};
}
template
<
typename
D
>
obj_attr_accessor
object_api
<
D
>::
attr
(
handle
key
)
const
{
return
{
derived
(),
object
(
key
,
true
)};
}
template
<
typename
D
>
str_attr_accessor
object_api
<
D
>::
attr
(
const
char
*
key
)
const
{
return
{
derived
(),
key
};
}
template
<
typename
D
>
str_attr_accessor
object_api
<
D
>::
attr
(
const
char
*
key
)
const
{
return
{
derived
(),
key
};
}
template
<
typename
D
>
args_proxy
object_api
<
D
>::
operator
*
()
const
{
return
{
derived
().
ptr
()
}
;
}
template
<
typename
D
>
args_proxy
object_api
<
D
>::
operator
*
()
const
{
return
args_proxy
(
derived
().
ptr
()
)
;
}
template
<
typename
D
>
template
<
typename
T
>
bool
object_api
<
D
>::
contains
(
T
&&
key
)
const
{
template
<
typename
D
>
template
<
typename
T
>
bool
object_api
<
D
>::
contains
(
T
&&
key
)
const
{
return
attr
(
"__contains__"
)(
std
::
forward
<
T
>
(
key
)).
template
cast
<
bool
>();
return
attr
(
"__contains__"
)(
std
::
forward
<
T
>
(
key
)).
template
cast
<
bool
>();
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment