Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
gaoqiong
pybind11
Commits
60c36db1
Commit
60c36db1
authored
Nov 30, 2015
by
Wenzel Jakob
Browse files
generic integer type handling
parent
7f8d1c20
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
161 additions
and
127 deletions
+161
-127
example/example11.ref
example/example11.ref
+10
-10
example/example2.ref
example/example2.ref
+47
-49
include/pybind11/cast.h
include/pybind11/cast.h
+66
-41
include/pybind11/pytypes.h
include/pybind11/pytypes.h
+38
-27
No files found.
example/example11.ref
View file @
60c36db1
Help on built-in function kw_func
kkww__ffuunncc(...)
Signature : (x : int32_t, y : int32_t) -> None
Help on built-in function kw_func2
kkww__ffuunncc22(...)
Signature : (x : int32_t = 100, y : int32_t = 200) -> None
kw_func(x=5, y=10)
kw_func(x=5, y=10)
kw_func(x=5, y=10)
kw_func(x=5, y=10)
kw_func(x=5, y=10)
kw_func(x=5, y=10)
...
@@ -17,3 +7,13 @@ kw_func(x=5, y=200)
...
@@ -17,3 +7,13 @@ kw_func(x=5, y=200)
kw_func(x=100, y=10)
kw_func(x=100, y=10)
kw_func(x=5, y=10)
kw_func(x=5, y=10)
kw_func(x=5, y=10)
kw_func(x=5, y=10)
Help on built-in function kw_func
kkww__ffuunncc(...) method of builtins.PyCapsule instance
Signature : (x : int, y : int) -> None
Help on built-in function kw_func2
kkww__ffuunncc22(...) method of builtins.PyCapsule instance
Signature : (x : int = 100, y : int = 200) -> None
example/example2.ref
View file @
60c36db1
15
5
Example2: No constructor defined!
can't set attribute
key: key2, value=value2
key: key, value=value
key: key, value=value
key: key2, value=value2
key: key, value=value
key: key, value=value
key: key2, value=value2
key: key2, value=value2
key: key3
key: key3
key: key2
key: key1
key: key1
key: key2
key: key1
key: key1
key: key2
key: key2
key: key3
key: key3
...
@@ -17,105 +13,107 @@ list item 0: overwritten
...
@@ -17,105 +13,107 @@ list item 0: overwritten
list item 1: value2
list item 1: value2
list item 0: value
list item 0: value
list item 1: value2
list item 1: value2
15
5
example.Example2: No constructor defined!
can't set attribute
This exception was intentionally thrown.
This exception was intentionally thrown.
(
u
'test', True)
('test', True)
(5
L
,
u
'test', True)
(5, 'test', True)
Help on class Example2 in module example
Help on class Example2 in module example
class EExxaammppllee22(
__
builtin
__
.object)
class EExxaammppllee22(builtin
s
.object)
| Example 2 documentation
| Example 2 documentation
|
|
| Methods defined here:
| Methods defined here:
|
|
| ____iinniitt____(
...
)
| ____iinniitt____(
self, /, *args, **kwargs
)
|
x.__init__(...) initializes x; s
ee help(type(
x
)) for signature
|
Initialize self. S
ee help(type(
self
)) for
accurate
signature
.
|
|
| ggeett__ddiicctt(...)
| ____nneeww____ = <built-in method __new__ of example.Example2_meta object>
| Signature : (Example2) -> dict
| ggeett__ddiicctt(...) from builtins.PyCapsule
| Signature : (example.Example2) -> dict
|
|
| Return a Python dictionary
| Return a Python dictionary
|
|
| ggeett__ddiicctt__22(...)
| ggeett__ddiicctt__22(...)
from builtins.PyCapsule
| Signature : (Example2) -> dict<str, str>
| Signature : (
example.
Example2) -> dict<str, str>
|
|
| Return a C++ dictionary
| Return a C++ dictionary
|
|
| ggeett__lliisstt(...)
| ggeett__lliisstt(...)
from builtins.PyCapsule
| Signature : (Example2) -> list
| Signature : (
example.
Example2) -> list
|
|
| Return a Python list
| Return a Python list
|
|
| ggeett__lliisstt__22(...)
| ggeett__lliisstt__22(...)
from builtins.PyCapsule
| Signature : (Example2) -> list<str>
| Signature : (
example.
Example2) -> list<str>
|
|
| Return a C++ list
| Return a C++ list
|
|
| ggeett__sseett(...)
| ggeett__sseett(...)
from builtins.PyCapsule
| Signature : (Example2) -> set
| Signature : (
example.
Example2) -> set
|
|
| Return a Python set
| Return a Python set
|
|
| ggeett__sseett22(...)
| ggeett__sseett22(...)
from builtins.PyCapsule
| Signature : (Example2) -> set
| Signature : (
example.
Example2) -> set
|
|
| Return a C++ set
| Return a C++ set
|
|
| ppaaiirr__ppaasssstthhrroouugghh(...)
| nneeww__iinnssttaannccee(...) from builtins.PyCapsule
| Signature : (Example2, (bool, str)) -> (str, bool)
| Signature : () -> example.Example2
|
| Return an instance
|
| ppaaiirr__ppaasssstthhrroouugghh(...) from builtins.PyCapsule
| Signature : (example.Example2, (bool, str)) -> (str, bool)
|
|
| Return a pair in reversed order
| Return a pair in reversed order
|
|
| pprriinntt__ddiicctt(...)
| pprriinntt__ddiicctt(...)
from builtins.PyCapsule
| Signature : (Example2, dict) -> None
| Signature : (
example.
Example2, dict) -> None
|
|
| Print entries of a Python dictionary
| Print entries of a Python dictionary
|
|
| pprriinntt__ddiicctt__22(...)
| pprriinntt__ddiicctt__22(...)
from builtins.PyCapsule
| Signature : (Example2, dict<str, str>) -> None
| Signature : (
example.
Example2, dict<str, str>) -> None
|
|
| Print entries of a C++ dictionary
| Print entries of a C++ dictionary
|
|
| pprriinntt__lliisstt(...)
| pprriinntt__lliisstt(...)
from builtins.PyCapsule
| Signature : (Example2, list) -> None
| Signature : (
example.
Example2, list) -> None
|
|
| Print entries of a Python list
| Print entries of a Python list
|
|
| pprriinntt__lliisstt__22(...)
| pprriinntt__lliisstt__22(...)
from builtins.PyCapsule
| Signature : (Example2, list<str>) -> None
| Signature : (
example.
Example2, list<str>) -> None
|
|
| Print entries of a C++ list
| Print entries of a C++ list
|
|
| pprriinntt__sseett(...)
| pprriinntt__sseett(...)
from builtins.PyCapsule
| Signature : (Example2, set) -> None
| Signature : (
example.
Example2, set) -> None
|
|
| Print entries of a Python set
| Print entries of a Python set
|
|
| pprriinntt__sseett__22(...)
| pprriinntt__sseett__22(...)
from builtins.PyCapsule
| Signature : (Example2, set<str>) -> None
| Signature : (
example.
Example2, set<str>) -> None
|
|
| Print entries of a C++ set
| Print entries of a C++ set
|
|
| tthhrrooww__eexxcceeppttiioonn(...)
| tthhrrooww__eexxcceeppttiioonn(...)
from builtins.PyCapsule
| Signature : (Example2) -> None
| Signature : (
example.
Example2) -> None
|
|
| Throw an exception
| Throw an exception
|
|
| ttuuppllee__ppaasssstthhrroouugghh(...)
| ttuuppllee__ppaasssstthhrroouugghh(...)
from builtins.PyCapsule
| Signature : (Example2, (bool, str, int
32_t
)) -> (int
32_t
, str, bool)
| Signature : (
example.
Example2, (bool, str, int)) -> (int, str, bool)
|
|
| Return a triple in reversed order
| Return a triple in reversed order
|
|
| ----------------------------------------------------------------------
| ----------------------------------------------------------------------
| Data and other attributes defined here:
| Data and other attributes defined here:
|
|
| ____nneeww____ = <built-in method __new__ of Example2_meta object>
| T.__new__(S, ...) -> a new object with type S, a subtype of T
|
| ____ppyybbiinndd1111____ = <capsule object NULL>
| ____ppyybbiinndd1111____ = <capsule object NULL>
|
| nneeww__iinnssttaannccee = <built-in method new_instance of PyCapsule object>
| Signature : () -> Example2
|
| Return an instance
Destructing Example2
Destructing Example2
include/pybind11/cast.h
View file @
60c36db1
...
@@ -191,7 +191,7 @@ protected:
...
@@ -191,7 +191,7 @@ protected:
};
};
/// Generic type caster for objects stored on the heap
/// Generic type caster for objects stored on the heap
template
<
typename
type
>
class
type_caster
:
public
type_caster_custom
{
template
<
typename
type
,
typename
Enable
=
void
>
class
type_caster
:
public
type_caster_custom
{
public:
public:
static
descr
name
()
{
return
typeid
(
type
);
}
static
descr
name
()
{
return
typeid
(
type
);
}
...
@@ -229,49 +229,74 @@ protected:
...
@@ -229,49 +229,74 @@ protected:
operator type*() { return &value; } \
operator type*() { return &value; } \
operator type&() { return value; }
operator type&() { return value; }
#define PYBIND11_TYPE_CASTER_NUMBER(type, py_type, from_type, to_pytype) \
template
<
typename
T
>
template <> class type_caster<type> { \
struct
type_caster
<
public: \
T
,
typename
std
::
enable_if
<
std
::
is_integral
<
T
>::
value
||
bool load(PyObject *src, bool) { \
std
::
is_floating_point
<
T
>::
value
>::
type
>
{
py_type py_value = from_type(src); \
typedef
typename
std
::
conditional
<
sizeof
(
T
)
<=
sizeof
(
long
),
long
,
long
long
>::
type
_py_type_0
;
if ((py_value == (py_type) -1 && PyErr_Occurred()) || \
typedef
typename
std
::
conditional
<
std
::
is_signed
<
T
>::
value
,
_py_type_0
,
typename
std
::
make_unsigned
<
_py_type_0
>::
type
>::
type
_py_type_1
;
(std::numeric_limits<type>::is_integer && \
typedef
typename
std
::
conditional
<
std
::
is_floating_point
<
T
>::
value
,
double
,
_py_type_1
>::
type
py_type
;
sizeof(py_type) != sizeof(type) && \
public:
(py_value < (py_type) std::numeric_limits<type>::min() || \
py_value > (py_type) std::numeric_limits<type>::max()))) { \
PyErr_Clear(); \
return false; \
} \
value = (type) py_value; \
return true; \
} \
static PyObject *cast(type src, return_value_policy
/* policy */
, PyObject *
/* parent */
) { \
return to_pytype((py_type) src); \
} \
PYBIND11_TYPE_CASTER(type, #type); \
};
PYBIND11_TYPE_CASTER_NUMBER
(
int8_t
,
long
,
PyLong_AsLong
,
PyLong_FromLong
)
bool
load
(
PyObject
*
src
,
bool
)
{
PYBIND11_TYPE_CASTER_NUMBER
(
uint8_t
,
unsigned
long
,
PyLong_AsUnsignedLong
,
PyLong_FromUnsignedLong
)
py_type
py_value
;
PYBIND11_TYPE_CASTER_NUMBER
(
int16_t
,
long
,
PyLong_AsLong
,
PyLong_FromLong
)
PYBIND11_TYPE_CASTER_NUMBER
(
uint16_t
,
unsigned
long
,
PyLong_AsUnsignedLong
,
PyLong_FromUnsignedLong
)
if
(
std
::
is_floating_point
<
T
>::
value
)
{
PYBIND11_TYPE_CASTER_NUMBER
(
int32_t
,
long
,
PyLong_AsLong
,
PyLong_FromLong
)
py_value
=
(
py_type
)
PyFloat_AsDouble
(
src
);
PYBIND11_TYPE_CASTER_NUMBER
(
uint32_t
,
unsigned
long
,
PyLong_AsUnsignedLong
,
PyLong_FromUnsignedLong
)
}
else
if
(
sizeof
(
T
)
<=
sizeof
(
long
))
{
PYBIND11_TYPE_CASTER_NUMBER
(
int64_t
,
PY_LONG_LONG
,
detail
::
PyLong_AsLongLong
,
PyLong_FromLongLong
)
if
(
std
::
is_signed
<
T
>::
value
)
PYBIND11_TYPE_CASTER_NUMBER
(
uint64_t
,
unsigned
PY_LONG_LONG
,
detail
::
PyLong_AsUnsignedLongLong
,
PyLong_FromUnsignedLongLong
)
py_value
=
(
py_type
)
PyLong_AsLong
(
src
);
else
py_value
=
(
py_type
)
PyLong_AsUnsignedLong
(
src
);
}
else
{
if
(
std
::
is_signed
<
T
>::
value
)
py_value
=
(
py_type
)
detail
::
PyLong_AsLongLong
(
src
);
else
py_value
=
(
py_type
)
detail
::
PyLong_AsUnsignedLongLong
(
src
);
}
#if defined(__APPLE__) // size_t/ssize_t are separate types on Mac OS X
if
((
py_value
==
(
py_type
)
-
1
&&
PyErr_Occurred
())
||
#if PY_MAJOR_VERSION >= 3
(
std
::
is_integral
<
T
>::
value
&&
sizeof
(
py_type
)
!=
sizeof
(
T
)
&&
PYBIND11_TYPE_CASTER_NUMBER
(
ssize_t
,
Py_ssize_t
,
PyLong_AsSsize_t
,
PyLong_FromSsize_t
)
(
py_value
<
(
py_type
)
std
::
numeric_limits
<
T
>::
min
()
||
PYBIND11_TYPE_CASTER_NUMBER
(
size_t
,
size_t
,
PyLong_AsSize_t
,
PyLong_FromSize_t
)
py_value
>
(
py_type
)
std
::
numeric_limits
<
T
>::
max
())))
{
#else
PyErr_Clear
();
PYBIND11_TYPE_CASTER_NUMBER
(
ssize_t
,
PY_LONG_LONG
,
detail
::
PyLong_AsLongLong
,
PyLong_FromLongLong
)
return
false
;
PYBIND11_TYPE_CASTER_NUMBER
(
size_t
,
unsigned
PY_LONG_LONG
,
detail
::
PyLong_AsUnsignedLongLong
,
PyLong_FromUnsignedLongLong
)
}
#endif
#endif
PYBIND11_TYPE_CASTER_NUMBER
(
float
,
double
,
PyFloat_AsDouble
,
PyFloat_FromDouble
)
value
=
(
T
)
py_value
;
PYBIND11_TYPE_CASTER_NUMBER
(
double
,
double
,
PyFloat_AsDouble
,
PyFloat_FromDouble
)
return
true
;
}
static
PyObject
*
cast
(
T
src
,
return_value_policy
/* policy */
,
PyObject
*
/* parent */
)
{
if
(
std
::
is_floating_point
<
T
>::
value
)
{
return
PyFloat_FromDouble
((
double
)
src
);
}
else
if
(
sizeof
(
T
)
<=
sizeof
(
long
))
{
if
(
std
::
is_signed
<
T
>::
value
)
return
PyLong_FromLong
((
long
)
src
);
else
return
PyLong_FromUnsignedLong
((
unsigned
long
)
src
);
}
else
{
if
(
std
::
is_signed
<
T
>::
value
)
return
PyLong_FromLongLong
((
long
long
)
src
);
else
return
PyLong_FromUnsignedLongLong
((
unsigned
long
long
)
src
);
}
}
static
PyObject
*
cast
(
const
T
*
src
,
return_value_policy
policy
,
PyObject
*
parent
)
{
return
cast
(
*
src
,
policy
,
parent
);
}
static
descr
name
()
{
return
std
::
is_floating_point
<
T
>::
value
?
"float"
:
"int"
;
}
operator
T
*
()
{
return
&
value
;
}
operator
T
&
()
{
return
value
;
}
protected:
T
value
;
};
template
<
>
class
type_caster
<
void_type
>
{
template
<
>
class
type_caster
<
void_type
>
{
public:
public:
...
...
include/pybind11/pytypes.h
View file @
60c36db1
...
@@ -11,6 +11,7 @@
...
@@ -11,6 +11,7 @@
#include "common.h"
#include "common.h"
#include <utility>
#include <utility>
#include <type_traits>
NAMESPACE_BEGIN
(
pybind11
)
NAMESPACE_BEGIN
(
pybind11
)
...
@@ -213,16 +214,16 @@ private:
...
@@ -213,16 +214,16 @@ private:
using
::
PyLong_AsUnsignedLongLong
;
using
::
PyLong_AsUnsignedLongLong
;
using
::
PyLong_AsLongLong
;
using
::
PyLong_AsLongLong
;
#else
#else
inline
PY_LONG_LONG
PyLong_AsLongLong
(
PyObject
*
o
)
{
inline
long
long
PyLong_AsLongLong
(
PyObject
*
o
)
{
if
(
PyInt_Check
(
o
))
if
(
PyInt_Check
(
o
))
/// workaround: PyLong_AsLongLong doesn't accept 'int' on Python 2.x
return
(
PY_LONG_LONG
)
PyLong_AsLong
(
o
);
return
(
long
long
)
PyLong_AsLong
(
o
);
else
else
return
::
PyLong_AsLongLong
(
o
);
return
::
PyLong_AsLongLong
(
o
);
}
}
inline
unsigned
PY_LONG_LONG
PyLong_AsUnsignedLongLong
(
PyObject
*
o
)
{
inline
unsigned
long
long
PyLong_AsUnsignedLongLong
(
PyObject
*
o
)
{
if
(
PyInt_Check
(
o
))
if
(
PyInt_Check
(
o
))
/// workaround: PyLong_AsUnsignedLongLong doesn't accept 'int' on Python 2.x
return
(
unsigned
PY_LONG_LONG
)
PyLong_AsUnsignedLong
(
o
);
return
(
unsigned
long
long
)
PyLong_AsUnsignedLong
(
o
);
else
else
return
::
PyLong_AsUnsignedLongLong
(
o
);
return
::
PyLong_AsUnsignedLongLong
(
o
);
}
}
...
@@ -291,27 +292,37 @@ public:
...
@@ -291,27 +292,37 @@ public:
class
int_
:
public
object
{
class
int_
:
public
object
{
public:
public:
PYBIND11_OBJECT_DEFAULT
(
int_
,
object
,
PyLong_Check
)
PYBIND11_OBJECT_DEFAULT
(
int_
,
object
,
PyLong_Check
)
int_
(
int32_t
value
)
:
object
(
PyLong_FromLong
((
long
)
value
),
false
)
{
}
template
<
typename
T
,
int_
(
int64_t
value
)
:
object
(
PyLong_FromLongLong
((
long
long
)
value
),
false
)
{
}
typename
std
::
enable_if
<
std
::
is_integral
<
T
>
::
value
,
int
>::
type
=
0
>
int_
(
uint32_t
value
)
:
object
(
PyLong_FromUnsignedLong
((
unsigned
long
)
value
),
false
)
{
}
int_
(
T
value
)
{
int_
(
uint64_t
value
)
:
object
(
PyLong_FromUnsignedLongLong
((
unsigned
long
long
)
value
),
false
)
{
}
if
(
sizeof
(
T
)
<=
sizeof
(
long
))
{
operator
int32_t
()
const
{
return
(
int32_t
)
PyLong_AsLong
(
m_ptr
);
}
if
(
std
::
is_signed
<
T
>::
value
)
operator
uint32_t
()
const
{
return
(
uint32_t
)
PyLong_AsUnsignedLong
(
m_ptr
);
}
m_ptr
=
PyLong_FromLong
((
long
)
value
);
operator
int64_t
()
const
{
return
(
int64_t
)
detail
::
PyLong_AsLongLong
(
m_ptr
);
}
else
operator
uint64_t
()
const
{
return
(
uint64_t
)
detail
::
PyLong_AsUnsignedLongLong
(
m_ptr
);
}
m_ptr
=
PyLong_FromUnsignedLong
((
unsigned
long
)
value
);
#if defined(__APPLE__) // size_t/ssize_t are separate types on Mac OS X
}
else
{
#if PY_MAJOR_VERSION >= 3
if
(
std
::
is_signed
<
T
>::
value
)
int_
(
size_t
value
)
:
object
(
PyLong_FromSize_t
(
value
),
false
)
{
}
m_ptr
=
PyLong_FromLongLong
((
long
long
)
value
);
int_
(
ssize_t
value
)
:
object
(
PyLong_FromSsize_t
(
value
),
false
)
{
}
else
operator
size_t
()
const
{
return
(
size_t
)
PyLong_AsSize_t
(
m_ptr
);
}
m_ptr
=
PyLong_FromUnsignedLongLong
((
unsigned
long
long
)
value
);
operator
ssize_t
()
const
{
return
(
ssize_t
)
PyLong_AsSsize_t
(
m_ptr
);
}
}
#else
}
int_
(
size_t
value
)
:
object
(
PyLong_FromUnsignedLongLong
((
unsigned
long
long
)
value
),
false
)
{
}
int_
(
ssize_t
value
)
:
object
(
PyLong_FromLongLong
((
long
long
)
value
),
false
)
{
}
template
<
typename
T
,
operator
size_t
()
const
{
return
(
size_t
)
detail
::
PyLong_AsUnsignedLongLong
(
m_ptr
);
}
typename
std
::
enable_if
<
std
::
is_integral
<
T
>
::
value
,
int
>::
type
=
0
>
operator
ssize_t
()
const
{
return
(
ssize_t
)
detail
::
PyLong_AsLongLong
(
m_ptr
);
}
operator
T
()
const
{
#endif
if
(
sizeof
(
T
)
<=
sizeof
(
long
))
{
#endif
if
(
std
::
is_signed
<
T
>::
value
)
return
(
T
)
PyLong_AsLong
(
m_ptr
);
else
return
(
T
)
PyLong_AsUnsignedLong
(
m_ptr
);
}
else
{
if
(
std
::
is_signed
<
T
>::
value
)
return
(
T
)
detail
::
PyLong_AsLongLong
(
m_ptr
);
else
return
(
T
)
detail
::
PyLong_AsUnsignedLongLong
(
m_ptr
);
}
}
};
};
class
float_
:
public
object
{
class
float_
:
public
object
{
...
...
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