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
7bf90e80
Commit
7bf90e80
authored
Oct 20, 2016
by
Ivan Smirnov
Browse files
Add a direct converter for numpy scalars
parent
c275ee6b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
26 additions
and
0 deletions
+26
-0
include/pybind11/numpy.h
include/pybind11/numpy.h
+26
-0
No files found.
include/pybind11/numpy.h
View file @
7bf90e80
...
@@ -63,6 +63,14 @@ struct PyArray_Proxy {
...
@@ -63,6 +63,14 @@ struct PyArray_Proxy {
int
flags
;
int
flags
;
};
};
struct
PyVoidScalarObject_Proxy
{
PyObject_VAR_HEAD
char
*
obval
;
PyArrayDescr_Proxy
*
descr
;
int
flags
;
PyObject
*
base
;
};
struct
npy_api
{
struct
npy_api
{
enum
constants
{
enum
constants
{
NPY_C_CONTIGUOUS_
=
0x0001
,
NPY_C_CONTIGUOUS_
=
0x0001
,
...
@@ -702,11 +710,29 @@ struct npy_format_descriptor<T, enable_if_t<is_pod_struct<T>::value>> {
...
@@ -702,11 +710,29 @@ struct npy_format_descriptor<T, enable_if_t<is_pod_struct<T>::value>> {
auto
arr
=
array
(
buffer_info
(
nullptr
,
sizeof
(
T
),
format
(),
1
));
auto
arr
=
array
(
buffer_info
(
nullptr
,
sizeof
(
T
),
format
(),
1
));
if
(
!
api
.
PyArray_EquivTypes_
(
dtype_ptr
,
arr
.
dtype
().
ptr
()))
if
(
!
api
.
PyArray_EquivTypes_
(
dtype_ptr
,
arr
.
dtype
().
ptr
()))
pybind11_fail
(
"NumPy: invalid buffer descriptor!"
);
pybind11_fail
(
"NumPy: invalid buffer descriptor!"
);
register_direct_converter
();
}
}
private:
private:
static
std
::
string
format_str
;
static
std
::
string
format_str
;
static
PyObject
*
dtype_ptr
;
static
PyObject
*
dtype_ptr
;
static
void
register_direct_converter
()
{
auto
converter
=
[
=
](
PyObject
*
obj
,
void
*&
value
)
{
auto
&
api
=
npy_api
::
get
();
if
(
!
PyObject_TypeCheck
(
obj
,
api
.
PyVoidArrType_Type_
))
return
false
;
if
(
auto
descr
=
object
(
api
.
PyArray_DescrFromScalar_
(
obj
),
false
))
{
if
(
api
.
PyArray_EquivTypes_
(
dtype_ptr
,
descr
.
ptr
()))
{
value
=
((
PyVoidScalarObject_Proxy
*
)
obj
)
->
obval
;
return
true
;
}
}
return
false
;
};
get_internals
().
direct_conversions
[
std
::
type_index
(
typeid
(
T
))].
push_back
(
converter
);
}
};
};
template
<
typename
T
>
template
<
typename
T
>
...
...
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