Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
pybind11
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open
pybind11
Commits
135fd149
Commit
135fd149
authored
Oct 16, 2016
by
Wenzel Jakob
Committed by
GitHub
Oct 16, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #449 from jagerman/no-implicit-conversions
Disable most implicit conversion constructors
parents
946f897d
12d76600
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
40 additions
and
33 deletions
+40
-33
include/pybind11/cast.h
+5
-5
include/pybind11/common.h
+1
-1
include/pybind11/numpy.h
+9
-9
include/pybind11/pybind11.h
+6
-6
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