Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
D
dlib
Project
Project
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
钟尚武
dlib
Commits
beece207
Commit
beece207
authored
Feb 11, 2018
by
Davis King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated to pybind11 2.2.2
parent
5bde5c52
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
340 additions
and
269 deletions
+340
-269
README.md
dlib/external/pybind11/README.md
+3
-2
cast.h
dlib/external/pybind11/include/pybind11/cast.h
+26
-18
complex.h
dlib/external/pybind11/include/pybind11/complex.h
+0
-4
class.h
dlib/external/pybind11/include/pybind11/detail/class.h
+5
-1
common.h
dlib/external/pybind11/include/pybind11/detail/common.h
+11
-22
descr.h
dlib/external/pybind11/include/pybind11/detail/descr.h
+141
-56
init.h
dlib/external/pybind11/include/pybind11/detail/init.h
+16
-6
internals.h
dlib/external/pybind11/include/pybind11/detail/internals.h
+12
-10
eigen.h
dlib/external/pybind11/include/pybind11/eigen.h
+17
-19
embed.h
dlib/external/pybind11/include/pybind11/embed.h
+1
-1
functional.h
dlib/external/pybind11/include/pybind11/functional.h
+4
-2
numpy.h
dlib/external/pybind11/include/pybind11/numpy.h
+38
-42
pybind11.h
dlib/external/pybind11/include/pybind11/pybind11.h
+56
-74
pytypes.h
dlib/external/pybind11/include/pybind11/pytypes.h
+0
-3
stl.h
dlib/external/pybind11/include/pybind11/stl.h
+8
-7
stl_bind.h
dlib/external/pybind11/include/pybind11/stl_bind.h
+1
-1
FindPythonLibsNew.cmake
dlib/external/pybind11/tools/FindPythonLibsNew.cmake
+1
-1
No files found.
dlib/external/pybind11/README.md
View file @
beece207
...
...
@@ -87,8 +87,9 @@ In addition to the core functionality, pybind11 provides some extra goodies:
[
reported
](
http://graylab.jhu.edu/RosettaCon2016/PyRosetta-4.pdf
)
a binary
size reduction of
**5.4x**
and compile time reduction by
**5.8x**
.
-
Function signatures are precomputed at compile time (using
``constexpr``
),
leading to smaller binaries.
-
When supported by the compiler, two new C++14 features (relaxed constexpr and
return value deduction) are used to precompute function signatures at compile
time, leading to smaller binaries.
-
With little extra effort, C++ types can be pickled and unpickled similar to
regular Python objects.
...
...
dlib/external/pybind11/include/pybind11/cast.h
View file @
beece207
...
...
@@ -778,7 +778,7 @@ template <typename T1, typename T2> struct is_copy_constructible<std::pair<T1, T
template
<
typename
type
>
class
type_caster_base
:
public
type_caster_generic
{
using
itype
=
intrinsic_t
<
type
>
;
public
:
static
constexpr
auto
name
=
_
<
type
>
();
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
<
type
>
());
}
type_caster_base
()
:
type_caster_base
(
typeid
(
type
))
{
}
explicit
type_caster_base
(
const
std
::
type_info
&
info
)
:
type_caster_generic
(
info
)
{
}
...
...
@@ -835,7 +835,7 @@ public:
nullptr
,
nullptr
,
holder
);
}
template
<
typename
T
>
using
cast_op_type
=
detail
::
cast_op_type
<
T
>
;
template
<
typename
T
>
using
cast_op_type
=
cast_op_type
<
T
>
;
operator
itype
*
()
{
return
(
type
*
)
value
;
}
operator
itype
&
()
{
if
(
!
value
)
throw
reference_cast_error
();
return
*
((
itype
*
)
value
);
}
...
...
@@ -885,7 +885,7 @@ private:
"std::reference_wrapper<T> caster requires T to have a caster with an `T &` operator"
);
public
:
bool
load
(
handle
src
,
bool
convert
)
{
return
subcaster
.
load
(
src
,
convert
);
}
static
constexpr
auto
name
=
caster_t
::
name
;
static
PYBIND11_DESCR
name
()
{
return
caster_t
::
name
();
}
static
handle
cast
(
const
std
::
reference_wrapper
<
type
>
&
src
,
return_value_policy
policy
,
handle
parent
)
{
// It is definitely wrong to take ownership of this pointer, so mask that rvp
if
(
policy
==
return_value_policy
::
take_ownership
||
policy
==
return_value_policy
::
automatic
)
...
...
@@ -900,7 +900,7 @@ public:
protected: \
type value; \
public: \
static
constexpr auto name = py_name;
\
static
PYBIND11_DESCR name() { return type_descr(py_name); }
\
template <typename T_, enable_if_t<std::is_same<type, remove_cv_t<T_>>::value, int> = 0> \
static handle cast(T_ *src, return_value_policy policy, handle parent) { \
if (!src) return none().release(); \
...
...
@@ -980,12 +980,11 @@ public:
static
handle
cast
(
T
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
if
(
std
::
is_floating_point
<
T
>::
value
)
{
return
PyFloat_FromDouble
((
double
)
src
);
}
else
if
(
sizeof
(
T
)
<=
sizeof
(
ssize_t
))
{
// This returns a long automatically if needed
}
else
if
(
sizeof
(
T
)
<=
sizeof
(
long
))
{
if
(
std
::
is_signed
<
T
>::
value
)
return
P
YBIND11_LONG_FROM_SIGNED
(
src
);
return
P
yLong_FromLong
((
long
)
src
);
else
return
P
YBIND11_LONG_FROM_UNSIGNED
(
src
);
return
P
yLong_FromUnsignedLong
((
unsigned
long
)
src
);
}
else
{
if
(
std
::
is_signed
<
T
>::
value
)
return
PyLong_FromLongLong
((
long
long
)
src
);
...
...
@@ -1050,7 +1049,7 @@ public:
template
<
typename
T
>
using
cast_op_type
=
void
*&
;
operator
void
*&
()
{
return
value
;
}
static
constexpr
auto
name
=
_
(
"capsule"
);
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
(
"capsule"
));
}
private
:
void
*
value
=
nullptr
;
};
...
...
@@ -1293,7 +1292,7 @@ public:
return
one_char
;
}
static
constexpr
auto
name
=
_
(
PYBIND11_STRING_NAME
);
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
(
PYBIND11_STRING_NAME
));
}
template
<
typename
_T
>
using
cast_op_type
=
pybind11
::
detail
::
cast_op_type
<
_T
>
;
};
...
...
@@ -1318,7 +1317,9 @@ public:
return
cast_impl
(
std
::
forward
<
T
>
(
src
),
policy
,
parent
,
indices
{});
}
static
constexpr
auto
name
=
_
(
"Tuple["
)
+
concat
(
make_caster
<
Ts
>::
name
...)
+
_
(
"]"
);
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
(
"Tuple["
)
+
detail
::
concat
(
make_caster
<
Ts
>::
name
()...)
+
_
(
"]"
));
}
template
<
typename
T
>
using
cast_op_type
=
type
;
...
...
@@ -1463,7 +1464,7 @@ struct move_only_holder_caster {
auto
*
ptr
=
holder_helper
<
holder_type
>::
get
(
src
);
return
type_caster_base
<
type
>::
cast_holder
(
ptr
,
&
src
);
}
static
constexpr
auto
name
=
type_caster_base
<
type
>::
name
;
static
PYBIND11_DESCR
name
()
{
return
type_caster_base
<
type
>::
name
();
}
};
template
<
typename
type
,
typename
deleter
>
...
...
@@ -1494,10 +1495,10 @@ template <typename base, typename holder> struct is_holder_type :
template
<
typename
base
,
typename
deleter
>
struct
is_holder_type
<
base
,
std
::
unique_ptr
<
base
,
deleter
>>
:
std
::
true_type
{};
template
<
typename
T
>
struct
handle_type_name
{
static
constexpr
auto
name
=
_
<
T
>
();
};
template
<>
struct
handle_type_name
<
bytes
>
{
static
constexpr
auto
name
=
_
(
PYBIND11_BYTES_NAME
);
};
template
<>
struct
handle_type_name
<
args
>
{
static
constexpr
auto
name
=
_
(
"*args"
);
};
template
<>
struct
handle_type_name
<
kwargs
>
{
static
constexpr
auto
name
=
_
(
"**kwargs"
);
};
template
<
typename
T
>
struct
handle_type_name
{
static
PYBIND11_DESCR
name
()
{
return
_
<
T
>
();
}
};
template
<>
struct
handle_type_name
<
bytes
>
{
static
PYBIND11_DESCR
name
()
{
return
_
(
PYBIND11_BYTES_NAME
);
}
};
template
<>
struct
handle_type_name
<
args
>
{
static
PYBIND11_DESCR
name
()
{
return
_
(
"*args"
);
}
};
template
<>
struct
handle_type_name
<
kwargs
>
{
static
PYBIND11_DESCR
name
()
{
return
_
(
"**kwargs"
);
}
};
template
<
typename
type
>
struct
pyobject_caster
{
...
...
@@ -1515,7 +1516,7 @@ struct pyobject_caster {
static
handle
cast
(
const
handle
&
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
return
src
.
inc_ref
();
}
PYBIND11_TYPE_CASTER
(
type
,
handle_type_name
<
type
>::
name
);
PYBIND11_TYPE_CASTER
(
type
,
handle_type_name
<
type
>::
name
()
);
};
template
<
typename
T
>
...
...
@@ -1685,6 +1686,9 @@ template <> inline void cast_safe<void>(object &&) {}
NAMESPACE_END
(
detail
)
template
<
return_value_policy
policy
=
return_value_policy
::
automatic_reference
>
tuple
make_tuple
()
{
return
tuple
(
0
);
}
template
<
return_value_policy
policy
=
return_value_policy
::
automatic_reference
,
typename
...
Args
>
tuple
make_tuple
(
Args
&&
...
args_
)
{
constexpr
size_t
size
=
sizeof
...(
Args
);
...
...
@@ -1801,6 +1805,10 @@ struct function_call {
/// The `convert` value the arguments should be loaded with
std
::
vector
<
bool
>
args_convert
;
/// Extra references for the optional `py::args` and/or `py::kwargs` arguments (which, if
/// present, are also in `args` but without a reference).
object
args_ref
,
kwargs_ref
;
/// The parent, if any
handle
parent
;
...
...
@@ -1828,7 +1836,7 @@ public:
static
constexpr
bool
has_kwargs
=
kwargs_pos
<
0
;
static
constexpr
bool
has_args
=
args_pos
<
0
;
static
constexpr
auto
arg_names
=
concat
(
type_descr
(
make_caster
<
Args
>::
name
)...);
static
PYBIND11_DESCR
arg_names
()
{
return
detail
::
concat
(
make_caster
<
Args
>::
name
()...);
}
bool
load_args
(
function_call
&
call
)
{
return
load_impl_sequence
(
call
,
indices
{});
...
...
dlib/external/pybind11/include/pybind11/complex.h
View file @
beece207
...
...
@@ -25,13 +25,9 @@ template <typename T> struct format_descriptor<std::complex<T>, detail::enable_i
static
std
::
string
format
()
{
return
std
::
string
(
value
);
}
};
#ifndef PYBIND11_CPP17
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
std
::
complex
<
T
>
,
detail
::
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>::
value
[
3
];
#endif
NAMESPACE_BEGIN
(
detail
)
template
<
typename
T
>
struct
is_fmt_numeric
<
std
::
complex
<
T
>
,
detail
::
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>
{
...
...
dlib/external/pybind11/include/pybind11/detail/class.h
View file @
beece207
...
...
@@ -289,9 +289,13 @@ extern "C" inline int pybind11_object_init(PyObject *self, PyObject *, PyObject
inline
void
add_patient
(
PyObject
*
nurse
,
PyObject
*
patient
)
{
auto
&
internals
=
get_internals
();
auto
instance
=
reinterpret_cast
<
detail
::
instance
*>
(
nurse
);
auto
&
current_patients
=
internals
.
patients
[
nurse
];
instance
->
has_patients
=
true
;
for
(
auto
&
p
:
current_patients
)
if
(
p
==
patient
)
return
;
Py_INCREF
(
patient
);
internals
.
patients
[
nurse
]
.
push_back
(
patient
);
current_patients
.
push_back
(
patient
);
}
inline
void
clear_patients
(
PyObject
*
self
)
{
...
...
dlib/external/pybind11/include/pybind11/detail/common.h
View file @
beece207
...
...
@@ -92,8 +92,8 @@
#endif
#define PYBIND11_VERSION_MAJOR 2
#define PYBIND11_VERSION_MINOR
3
#define PYBIND11_VERSION_PATCH
dev0
#define PYBIND11_VERSION_MINOR
2
#define PYBIND11_VERSION_PATCH
2
/// Include Python header, disable linking to pythonX_d.lib on Windows in debug mode
#if defined(_MSC_VER)
...
...
@@ -158,8 +158,6 @@
#define PYBIND11_BYTES_SIZE PyBytes_Size
#define PYBIND11_LONG_CHECK(o) PyLong_Check(o)
#define PYBIND11_LONG_AS_LONGLONG(o) PyLong_AsLongLong(o)
#define PYBIND11_LONG_FROM_SIGNED(o) PyLong_FromSsize_t((ssize_t) o)
#define PYBIND11_LONG_FROM_UNSIGNED(o) PyLong_FromSize_t((size_t) o)
#define PYBIND11_BYTES_NAME "bytes"
#define PYBIND11_STRING_NAME "str"
#define PYBIND11_SLICE_OBJECT PyObject
...
...
@@ -182,8 +180,6 @@
#define PYBIND11_BYTES_SIZE PyString_Size
#define PYBIND11_LONG_CHECK(o) (PyInt_Check(o) || PyLong_Check(o))
#define PYBIND11_LONG_AS_LONGLONG(o) (PyInt_Check(o) ? (long long) PyLong_AsLong(o) : PyLong_AsLongLong(o))
#define PYBIND11_LONG_FROM_SIGNED(o) PyInt_FromSsize_t((ssize_t) o) // Returns long if needed.
#define PYBIND11_LONG_FROM_UNSIGNED(o) PyInt_FromSize_t((size_t) o) // Returns long if needed.
#define PYBIND11_BYTES_NAME "str"
#define PYBIND11_STRING_NAME "unicode"
#define PYBIND11_SLICE_OBJECT PySliceObject
...
...
@@ -381,18 +377,20 @@ constexpr size_t instance_simple_holder_in_ptrs() {
struct
type_info
;
struct
value_and_holder
;
struct
nonsimple_values_and_holders
{
void
**
values_and_holders
;
uint8_t
*
status
;
};
/// The 'instance' type which needs to be standard layout (need to be able to use 'offsetof')
struct
instance
{
PyObject_HEAD
/// Storage for pointers and holder; see simple_layout, below, for a description
union
{
void
*
simple_value_holder
[
1
+
instance_simple_holder_in_ptrs
()];
struct
{
void
**
values_and_holders
;
uint8_t
*
status
;
}
nonsimple
;
nonsimple_values_and_holders
nonsimple
;
};
/// Weak references
/// Weak references
(needed for keep alive):
PyObject
*
weakrefs
;
/// If true, the pointer is owned which means we're free to manage it with a holder.
bool
owned
:
1
;
...
...
@@ -409,10 +407,10 @@ struct instance {
* (which is typically the size of two pointers), or when multiple inheritance is used on the
* python side. Non-simple layout allocates the required amount of memory to have multiple
* bound C++ classes as parents. Under this layout, `nonsimple.values_and_holders` is set to a
* pointer to allocated space of the required space to hold a sequence of value pointers and
* pointer to allocated space of the required space to hold a
a
sequence of value pointers and
* holders followed `status`, a set of bit flags (1 byte each), i.e.
* [val1*][holder1][val2*][holder2]...[bb...] where each [block] is rounded up to a multiple of
* `sizeof(void *)`. `nonsimple.
status
` is, for convenience, a pointer to the
* `sizeof(void *)`. `nonsimple.
holder_constructed
` is, for convenience, a pointer to the
* beginning of the [bb...] block (but not independently allocated).
*
* Status bits indicate whether the associated holder is constructed (&
...
...
@@ -585,11 +583,6 @@ template <typename T, typename... Us> using deferred_t = typename deferred_type<
template
<
typename
Base
,
typename
Derived
>
using
is_strict_base_of
=
bool_constant
<
std
::
is_base_of
<
Base
,
Derived
>::
value
&&
!
std
::
is_same
<
Base
,
Derived
>::
value
>
;
/// Like is_base_of, but also requires that the base type is accessible (i.e. that a Derived pointer
/// can be converted to a Base pointer)
template
<
typename
Base
,
typename
Derived
>
using
is_accessible_base_of
=
bool_constant
<
std
::
is_base_of
<
Base
,
Derived
>::
value
&&
std
::
is_convertible
<
Derived
*
,
Base
*>::
value
>
;
template
<
template
<
typename
...
>
class
Base
>
struct
is_template_base_of_impl
{
template
<
typename
...
Us
>
static
std
::
true_type
check
(
Base
<
Us
...
>
*
);
...
...
@@ -708,13 +701,9 @@ template <typename T> struct format_descriptor<T, detail::enable_if_t<std::is_ar
static
std
::
string
format
()
{
return
std
::
string
(
1
,
c
);
}
};
#if !defined(PYBIND11_CPP17)
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
T
,
detail
::
enable_if_t
<
std
::
is_arithmetic
<
T
>::
value
>>::
value
[
2
];
#endif
/// RAII wrapper that temporarily clears any Python error state
struct
error_scope
{
PyObject
*
type
,
*
value
,
*
trace
;
...
...
dlib/external/pybind11/include/pybind11/detail/descr.h
View file @
beece207
/*
pybind11/detail/descr.h: Helper type for concatenating type signatures at compile time
pybind11/detail/descr.h: Helper type for concatenating type signatures
either at runtime (C++11) or compile time (C++14)
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
...
...
@@ -14,87 +15,171 @@
NAMESPACE_BEGIN
(
PYBIND11_NAMESPACE
)
NAMESPACE_BEGIN
(
detail
)
#if !defined(_MSC_VER)
# define PYBIND11_DESCR_CONSTEXPR static constexpr
#else
# define PYBIND11_DESCR_CONSTEXPR const
#endif
/* Concatenate type signatures at compile time */
template
<
size_t
N
,
typename
...
Ts
>
struct
descr
{
char
text
[
N
+
1
];
constexpr
descr
()
:
text
{
'\0'
}
{
}
constexpr
descr
(
char
const
(
&
s
)[
N
+
1
])
:
descr
(
s
,
make_index_sequence
<
N
>
())
{
}
template
<
size_t
...
Is
>
constexpr
descr
(
char
const
(
&
s
)[
N
+
1
],
index_sequence
<
Is
...
>
)
:
text
{
s
[
Is
]...,
'\0'
}
{
}
template
<
typename
...
Chars
>
constexpr
descr
(
char
c
,
Chars
...
cs
)
:
text
{
c
,
static_cast
<
char
>
(
cs
)...,
'\0'
}
{
}
/* Concatenate type signatures at compile time using C++14 */
#if defined(PYBIND11_CPP14) && !defined(_MSC_VER)
#define PYBIND11_CONSTEXPR_DESCR
template
<
size_t
Size1
,
size_t
Size2
>
class
descr
{
template
<
size_t
Size1_
,
size_t
Size2_
>
friend
class
descr
;
public
:
constexpr
descr
(
char
const
(
&
text
)
[
Size1
+
1
],
const
std
::
type_info
*
const
(
&
types
)[
Size2
+
1
])
:
descr
(
text
,
types
,
make_index_sequence
<
Size1
>
(),
make_index_sequence
<
Size2
>
())
{
}
constexpr
const
char
*
text
()
const
{
return
m_text
;
}
constexpr
const
std
::
type_info
*
const
*
types
()
const
{
return
m_types
;
}
template
<
size_t
OtherSize1
,
size_t
OtherSize2
>
constexpr
descr
<
Size1
+
OtherSize1
,
Size2
+
OtherSize2
>
operator
+
(
const
descr
<
OtherSize1
,
OtherSize2
>
&
other
)
const
{
return
concat
(
other
,
make_index_sequence
<
Size1
>
(),
make_index_sequence
<
Size2
>
(),
make_index_sequence
<
OtherSize1
>
(),
make_index_sequence
<
OtherSize2
>
());
}
static
constexpr
std
::
array
<
const
std
::
type_info
*
,
sizeof
...(
Ts
)
+
1
>
types
()
{
return
{{
&
typeid
(
Ts
)...,
nullptr
}};
protected
:
template
<
size_t
...
Indices1
,
size_t
...
Indices2
>
constexpr
descr
(
char
const
(
&
text
)
[
Size1
+
1
],
const
std
::
type_info
*
const
(
&
types
)
[
Size2
+
1
],
index_sequence
<
Indices1
...
>
,
index_sequence
<
Indices2
...
>
)
:
m_text
{
text
[
Indices1
]...,
'\0'
},
m_types
{
types
[
Indices2
]...,
nullptr
}
{}
template
<
size_t
OtherSize1
,
size_t
OtherSize2
,
size_t
...
Indices1
,
size_t
...
Indices2
,
size_t
...
OtherIndices1
,
size_t
...
OtherIndices2
>
constexpr
descr
<
Size1
+
OtherSize1
,
Size2
+
OtherSize2
>
concat
(
const
descr
<
OtherSize1
,
OtherSize2
>
&
other
,
index_sequence
<
Indices1
...
>
,
index_sequence
<
Indices2
...
>
,
index_sequence
<
OtherIndices1
...
>
,
index_sequence
<
OtherIndices2
...
>
)
const
{
return
descr
<
Size1
+
OtherSize1
,
Size2
+
OtherSize2
>
(
{
m_text
[
Indices1
]...,
other
.
m_text
[
OtherIndices1
]...,
'\0'
},
{
m_types
[
Indices2
]...,
other
.
m_types
[
OtherIndices2
]...,
nullptr
}
);
}
};
template
<
size_t
N1
,
size_t
N2
,
typename
...
Ts1
,
typename
...
Ts2
,
size_t
...
Is1
,
size_t
...
Is2
>
constexpr
descr
<
N1
+
N2
,
Ts1
...,
Ts2
...
>
plus_impl
(
const
descr
<
N1
,
Ts1
...
>
&
a
,
const
descr
<
N2
,
Ts2
...
>
&
b
,
index_sequence
<
Is1
...
>
,
index_sequence
<
Is2
...
>
)
{
return
{
a
.
text
[
Is1
]...,
b
.
text
[
Is2
]...};
}
protected
:
char
m_text
[
Size1
+
1
];
const
std
::
type_info
*
m_types
[
Size2
+
1
];
};
template
<
size_t
N1
,
size_t
N2
,
typename
...
Ts1
,
typename
...
Ts2
>
constexpr
descr
<
N1
+
N2
,
Ts1
...,
Ts2
...
>
operator
+
(
const
descr
<
N1
,
Ts1
...
>
&
a
,
const
descr
<
N2
,
Ts2
...
>
&
b
)
{
return
plus_impl
(
a
,
b
,
make_index_sequence
<
N1
>
(),
make_index_sequence
<
N2
>
());
template
<
size_t
Size
>
constexpr
descr
<
Size
-
1
,
0
>
_
(
char
const
(
&
text
)[
Size
])
{
return
descr
<
Size
-
1
,
0
>
(
text
,
{
nullptr
});
}
template
<
size_t
N
>
constexpr
descr
<
N
-
1
>
_
(
char
const
(
&
text
)[
N
])
{
return
descr
<
N
-
1
>
(
text
);
}
constexpr
descr
<
0
>
_
(
char
const
(
&
)[
1
])
{
return
{};
}
template
<
size_t
Rem
,
size_t
...
Digits
>
struct
int_to_str
:
int_to_str
<
Rem
/
10
,
Rem
%
10
,
Digits
...
>
{
};
template
<
size_t
...
Digits
>
struct
int_to_str
<
0
,
Digits
...
>
{
static
constexpr
auto
digits
=
descr
<
sizeof
...(
Digits
)
>
((
'0'
+
Digits
)...
);
static
constexpr
auto
digits
=
descr
<
sizeof
...(
Digits
)
,
0
>
({
(
'0'
+
Digits
)...,
'\0'
},
{
nullptr
}
);
};
// Ternary description (like std::conditional)
template
<
bool
B
,
size_t
N1
,
size_t
N
2
>
constexpr
enable_if_t
<
B
,
descr
<
N1
-
1
>>
_
(
char
const
(
&
text1
)[
N1
],
char
const
(
&
)[
N
2
])
{
template
<
bool
B
,
size_t
Size1
,
size_t
Size
2
>
constexpr
enable_if_t
<
B
,
descr
<
Size1
-
1
,
0
>>
_
(
char
const
(
&
text1
)[
Size1
],
char
const
(
&
)[
Size
2
])
{
return
_
(
text1
);
}
template
<
bool
B
,
size_t
N1
,
size_t
N
2
>
constexpr
enable_if_t
<!
B
,
descr
<
N2
-
1
>>
_
(
char
const
(
&
)[
N1
],
char
const
(
&
text2
)[
N
2
])
{
template
<
bool
B
,
size_t
Size1
,
size_t
Size
2
>
constexpr
enable_if_t
<!
B
,
descr
<
Size2
-
1
,
0
>>
_
(
char
const
(
&
)[
Size1
],
char
const
(
&
text2
)[
Size
2
])
{
return
_
(
text2
);
}
template
<
bool
B
,
typename
T1
,
typename
T2
>
constexpr
enable_if_t
<
B
,
T1
>
_
(
const
T1
&
d
,
const
T2
&
)
{
return
d
;
}
template
<
bool
B
,
typename
T1
,
typename
T2
>
constexpr
enable_if_t
<!
B
,
T2
>
_
(
const
T1
&
,
const
T2
&
d
)
{
return
d
;
}
template
<
bool
B
,
size_t
SizeA1
,
size_t
SizeA2
,
size_t
SizeB1
,
size_t
SizeB2
>
constexpr
enable_if_t
<
B
,
descr
<
SizeA1
,
SizeA2
>>
_
(
descr
<
SizeA1
,
SizeA2
>
d
,
descr
<
SizeB1
,
SizeB2
>
)
{
return
d
;
}
template
<
bool
B
,
size_t
SizeA1
,
size_t
SizeA2
,
size_t
SizeB1
,
size_t
SizeB2
>
constexpr
enable_if_t
<!
B
,
descr
<
SizeB1
,
SizeB2
>>
_
(
descr
<
SizeA1
,
SizeA2
>
,
descr
<
SizeB1
,
SizeB2
>
d
)
{
return
d
;
}
template
<
size_t
Size
>
auto
constexpr
_
()
->
decltype
(
int_to_str
<
Size
/
10
,
Size
%
10
>::
digits
)
{
return
int_to_str
<
Size
/
10
,
Size
%
10
>::
digits
;
}
template
<
typename
Type
>
constexpr
descr
<
1
,
Type
>
_
()
{
return
{
'%'
};
}
template
<
typename
Type
>
constexpr
descr
<
1
,
1
>
_
()
{
return
descr
<
1
,
1
>
({
'%'
,
'\0'
},
{
&
typeid
(
Type
),
nullptr
});
}
inline
constexpr
descr
<
0
,
0
>
concat
()
{
return
_
(
""
);
}
template
<
size_t
Size1
,
size_t
Size2
,
typename
...
Args
>
auto
constexpr
concat
(
descr
<
Size1
,
Size2
>
descr
)
{
return
descr
;
}
template
<
size_t
Size1
,
size_t
Size2
,
typename
...
Args
>
auto
constexpr
concat
(
descr
<
Size1
,
Size2
>
descr
,
Args
&&
...
args
)
{
return
descr
+
_
(
", "
)
+
concat
(
args
...);
}
template
<
size_t
Size1
,
size_t
Size2
>
auto
constexpr
type_descr
(
descr
<
Size1
,
Size2
>
descr
)
{
return
_
(
"{"
)
+
descr
+
_
(
"}"
);
}
#define PYBIND11_DESCR constexpr auto
#else
/* Simpler C++11 implementation based on run-time memory allocation and copying */
class
descr
{
public
:
PYBIND11_NOINLINE
descr
(
const
char
*
text
,
const
std
::
type_info
*
const
*
types
)
{
size_t
nChars
=
len
(
text
),
nTypes
=
len
(
types
);
m_text
=
new
char
[
nChars
];
m_types
=
new
const
std
::
type_info
*
[
nTypes
];
memcpy
(
m_text
,
text
,
nChars
*
sizeof
(
char
));
memcpy
(
m_types
,
types
,
nTypes
*
sizeof
(
const
std
::
type_info
*
));
}
PYBIND11_NOINLINE
descr
operator
+
(
descr
&&
d2
)
&&
{
descr
r
;
size_t
nChars1
=
len
(
m_text
),
nTypes1
=
len
(
m_types
);
size_t
nChars2
=
len
(
d2
.
m_text
),
nTypes2
=
len
(
d2
.
m_types
);
r
.
m_text
=
new
char
[
nChars1
+
nChars2
-
1
];
r
.
m_types
=
new
const
std
::
type_info
*
[
nTypes1
+
nTypes2
-
1
];
memcpy
(
r
.
m_text
,
m_text
,
(
nChars1
-
1
)
*
sizeof
(
char
));
memcpy
(
r
.
m_text
+
nChars1
-
1
,
d2
.
m_text
,
nChars2
*
sizeof
(
char
));
memcpy
(
r
.
m_types
,
m_types
,
(
nTypes1
-
1
)
*
sizeof
(
std
::
type_info
*
));
memcpy
(
r
.
m_types
+
nTypes1
-
1
,
d2
.
m_types
,
nTypes2
*
sizeof
(
std
::
type_info
*
));
constexpr
descr
<
0
>
concat
()
{
return
{};
}
delete
[]
m_text
;
delete
[]
m_types
;
delete
[]
d2
.
m_text
;
delete
[]
d2
.
m_types
;
return
r
;
}
template
<
size_t
N
,
typename
...
Ts
>
constexpr
descr
<
N
,
Ts
...
>
concat
(
const
descr
<
N
,
Ts
...
>
&
descr
)
{
return
descr
;
}
char
*
text
()
{
return
m_text
;
}
const
std
::
type_info
*
*
types
()
{
return
m_types
;
}
template
<
size_t
N
,
typename
...
Ts
,
typename
...
Args
>
constexpr
auto
concat
(
const
descr
<
N
,
Ts
...
>
&
d
,
const
Args
&
...
args
)
->
decltype
(
std
::
declval
<
descr
<
N
+
2
,
Ts
...
>>
()
+
concat
(
args
...))
{
return
d
+
_
(
", "
)
+
concat
(
args
...);
protected
:
PYBIND11_NOINLINE
descr
()
{
}
template
<
typename
T
>
static
size_t
len
(
const
T
*
ptr
)
{
// return length including null termination
const
T
*
it
=
ptr
;
while
(
*
it
++
!=
(
T
)
0
)
;
return
static_cast
<
size_t
>
(
it
-
ptr
);
}
const
std
::
type_info
**
m_types
=
nullptr
;
char
*
m_text
=
nullptr
;
};
/* The 'PYBIND11_NOINLINE inline' combinations below are intentional to get the desired linkage while producing as little object code as possible */
PYBIND11_NOINLINE
inline
descr
_
(
const
char
*
text
)
{
const
std
::
type_info
*
types
[
1
]
=
{
nullptr
};
return
descr
(
text
,
types
);
}
template
<
bool
B
>
PYBIND11_NOINLINE
enable_if_t
<
B
,
descr
>
_
(
const
char
*
text1
,
const
char
*
)
{
return
_
(
text1
);
}
template
<
bool
B
>
PYBIND11_NOINLINE
enable_if_t
<!
B
,
descr
>
_
(
char
const
*
,
const
char
*
text2
)
{
return
_
(
text2
);
}
template
<
bool
B
>
PYBIND11_NOINLINE
enable_if_t
<
B
,
descr
>
_
(
descr
d
,
descr
)
{
return
d
;
}
template
<
bool
B
>
PYBIND11_NOINLINE
enable_if_t
<!
B
,
descr
>
_
(
descr
,
descr
d
)
{
return
d
;
}
template
<
typename
Type
>
PYBIND11_NOINLINE
descr
_
()
{
const
std
::
type_info
*
types
[
2
]
=
{
&
typeid
(
Type
),
nullptr
};
return
descr
(
"%"
,
types
);
}
template
<
size_t
N
,
typename
...
Ts
>
constexpr
descr
<
N
+
2
,
Ts
...
>
type_descr
(
const
descr
<
N
,
Ts
...
>
&
descr
)
{
return
_
(
"{"
)
+
descr
+
_
(
"}"
);
template
<
size_t
Size
>
PYBIND11_NOINLINE
descr
_
()
{
const
std
::
type_info
*
types
[
1
]
=
{
nullptr
};
return
descr
(
std
::
to_string
(
Size
).
c_str
(),
types
);
}
PYBIND11_NOINLINE
inline
descr
concat
()
{
return
_
(
""
);
}
PYBIND11_NOINLINE
inline
descr
concat
(
descr
&&
d
)
{
return
d
;
}
template
<
typename
...
Args
>
PYBIND11_NOINLINE
descr
concat
(
descr
&&
d
,
Args
&&
...
args
)
{
return
std
::
move
(
d
)
+
_
(
", "
)
+
concat
(
std
::
forward
<
Args
>
(
args
)...);
}
PYBIND11_NOINLINE
inline
descr
type_descr
(
descr
&&
d
)
{
return
_
(
"{"
)
+
std
::
move
(
d
)
+
_
(
"}"
);
}
#define PYBIND11_DESCR ::pybind11::detail::descr
#endif
NAMESPACE_END
(
detail
)
NAMESPACE_END
(
PYBIND11_NAMESPACE
)
dlib/external/pybind11/include/pybind11/detail/init.h
View file @
beece207
...
...
@@ -24,7 +24,7 @@ public:
template
<
typename
>
using
cast_op_type
=
value_and_holder
&
;
operator
value_and_holder
&
()
{
return
*
value
;
}
static
constexpr
auto
name
=
_
<
value_and_holder
>
();
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
<
value_and_holder
>
());
}
private
:
value_and_holder
*
value
=
nullptr
;
...
...
@@ -52,6 +52,16 @@ bool is_alias(Cpp<Class> *ptr) {
template
<
typename
/*Class*/
>
constexpr
bool
is_alias
(
void
*
)
{
return
false
;
}
// Constructs and returns a new object; if the given arguments don't map to a constructor, we fall
// back to brace aggregate initiailization so that for aggregate initialization can be used with
// py::init, e.g. `py::init<int, int>` to initialize a `struct T { int a; int b; }`. For
// non-aggregate types, we need to use an ordinary T(...) constructor (invoking as `T{...}` usually
// works, but will not do the expected thing when `T` has an `initializer_list<T>` constructor).
template
<
typename
Class
,
typename
...
Args
,
detail
::
enable_if_t
<
std
::
is_constructible
<
Class
,
Args
...
>::
value
,
int
>
=
0
>
inline
Class
*
construct_or_initialize
(
Args
&&
...
args
)
{
return
new
Class
(
std
::
forward
<
Args
>
(
args
)...);
}
template
<
typename
Class
,
typename
...
Args
,
detail
::
enable_if_t
<!
std
::
is_constructible
<
Class
,
Args
...
>::
value
,
int
>
=
0
>
inline
Class
*
construct_or_initialize
(
Args
&&
...
args
)
{
return
new
Class
{
std
::
forward
<
Args
>
(
args
)...};
}
// Attempts to constructs an alias using a `Alias(Cpp &&)` constructor. This allows types with
// an alias to provide only a single Cpp factory function as long as the Alias can be
// constructed from an rvalue reference of the base Cpp type. This means that Alias classes
...
...
@@ -161,7 +171,7 @@ struct constructor {
template
<
typename
Class
,
typename
...
Extra
,
enable_if_t
<!
Class
::
has_alias
,
int
>
=
0
>
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
v_h
.
value_ptr
()
=
new
Cpp
<
Class
>
{
std
::
forward
<
Args
>
(
args
)...}
;
v_h
.
value_ptr
()
=
construct_or_initialize
<
Cpp
<
Class
>>
(
std
::
forward
<
Args
>
(
args
)...)
;
},
is_new_style_constructor
(),
extra
...);
}
...
...
@@ -171,9 +181,9 @@ struct constructor {
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
if
(
Py_TYPE
(
v_h
.
inst
)
==
v_h
.
type
->
type
)
v_h
.
value_ptr
()
=
new
Cpp
<
Class
>
{
std
::
forward
<
Args
>
(
args
)...}
;
v_h
.
value_ptr
()
=
construct_or_initialize
<
Cpp
<
Class
>>
(
std
::
forward
<
Args
>
(
args
)...)
;
else
v_h
.
value_ptr
()
=
new
Alias
<
Class
>
{
std
::
forward
<
Args
>
(
args
)...}
;
v_h
.
value_ptr
()
=
construct_or_initialize
<
Alias
<
Class
>>
(
std
::
forward
<
Args
>
(
args
)...)
;
},
is_new_style_constructor
(),
extra
...);
}
...
...
@@ -182,7 +192,7 @@ struct constructor {
!
std
::
is_constructible
<
Cpp
<
Class
>
,
Args
...
>::
value
,
int
>
=
0
>
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
v_h
.
value_ptr
()
=
new
Alias
<
Class
>
{
std
::
forward
<
Args
>
(
args
)...}
;
v_h
.
value_ptr
()
=
construct_or_initialize
<
Alias
<
Class
>>
(
std
::
forward
<
Args
>
(
args
)...)
;
},
is_new_style_constructor
(),
extra
...);
}
};
...
...
@@ -193,7 +203,7 @@ template <typename... Args> struct alias_constructor {
enable_if_t
<
Class
::
has_alias
&&
std
::
is_constructible
<
Alias
<
Class
>
,
Args
...
>::
value
,
int
>
=
0
>
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
v_h
.
value_ptr
()
=
new
Alias
<
Class
>
{
std
::
forward
<
Args
>
(
args
)...}
;
v_h
.
value_ptr
()
=
construct_or_initialize
<
Alias
<
Class
>>
(
std
::
forward
<
Args
>
(
args
)...)
;
},
is_new_style_constructor
(),
extra
...);
}
};
...
...
dlib/external/pybind11/include/pybind11/detail/internals.h
View file @
beece207
...
...
@@ -127,21 +127,21 @@ struct type_info {
/// Each module locally stores a pointer to the `internals` data. The data
/// itself is shared among modules with the same `PYBIND11_INTERNALS_ID`.
inline
internals
*
&
get_internals_ptr
()
{
static
internals
*
internals_ptr
=
nullptr
;
return
internals_p
tr
;
inline
internals
*
*&
get_internals_pp
()
{
static
internals
*
*
internals_pp
=
nullptr
;
return
internals_p
p
;
}
/// Return a reference to the current `internals` data
PYBIND11_NOINLINE
inline
internals
&
get_internals
()
{
auto
*
&
internals_ptr
=
get_internals_ptr
();
if
(
internals_p
tr
)
return
*
internals_ptr
;
auto
*
*&
internals_pp
=
get_internals_pp
();
if
(
internals_p
p
&&
*
internals_pp
)
return
*
*
internals_pp
;
constexpr
auto
*
id
=
PYBIND11_INTERNALS_ID
;
auto
builtins
=
handle
(
PyEval_GetBuiltins
());
if
(
builtins
.
contains
(
id
)
&&
isinstance
<
capsule
>
(
builtins
[
id
]))
{
internals_p
tr
=
*
static_cast
<
internals
**>
(
capsule
(
builtins
[
id
]));
internals_p
p
=
static_cast
<
internals
**>
(
capsule
(
builtins
[
id
]));
// We loaded builtins through python's builtins, which means that our `error_already_set`
// and `builtin_exception` may be different local classes than the ones set up in the
...
...
@@ -149,7 +149,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
//
// libstdc++ doesn't require this (types there are identified only by name)
#if !defined(__GLIBCXX__)
internals_ptr
->
registered_exception_translators
.
push_front
(
(
*
internals_pp
)
->
registered_exception_translators
.
push_front
(
[](
std
::
exception_ptr
p
)
->
void
{
try
{
if
(
p
)
std
::
rethrow_exception
(
p
);
...
...
@@ -160,6 +160,8 @@ PYBIND11_NOINLINE inline internals &get_internals() {
);
#endif
}
else
{
if
(
!
internals_pp
)
internals_pp
=
new
internals
*
();
auto
*&
internals_ptr
=
*
internals_pp
;
internals_ptr
=
new
internals
();
#if defined(WITH_THREAD)
PyEval_InitThreads
();
...
...
@@ -168,7 +170,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
PyThread_set_key_value
(
internals_ptr
->
tstate
,
tstate
);
internals_ptr
->
istate
=
tstate
->
interp
;
#endif
builtins
[
id
]
=
capsule
(
&
internals_ptr
);
builtins
[
id
]
=
capsule
(
internals_pp
);
internals_ptr
->
registered_exception_translators
.
push_front
(
[](
std
::
exception_ptr
p
)
->
void
{
try
{
...
...
@@ -192,7 +194,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
internals_ptr
->
default_metaclass
=
make_default_metaclass
();
internals_ptr
->
instance_base
=
make_object_base_type
(
internals_ptr
->
default_metaclass
);
}
return
*
internals_ptr
;
return
*
*
internals_pp
;
}
/// Works like `internals.registered_types_cpp`, but for module-local registered types:
...
...
dlib/external/pybind11/include/pybind11/eigen.h
View file @
beece207
...
...
@@ -17,24 +17,20 @@
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
# ifdef __clang__
// Eigen generates a bunch of implicit-copy-constructor-is-deprecated warnings with -Wdeprecated
// under Clang, so disable that warning here:
# pragma GCC diagnostic ignored "-Wdeprecated"
# endif
# if __GNUC__ >= 7
# pragma GCC diagnostic ignored "-Wint-in-bool-context"
# endif
#endif
#include <Eigen/Core>
#include <Eigen/SparseCore>
#if defined(_MSC_VER)
# pragma warning(push)
# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
# pragma warning(disable: 4996) // warning C4996: std::unary_negate is deprecated in C++17
#endif
#include <Eigen/Core>
#include <Eigen/SparseCore>
// Eigen prior to 3.2.7 doesn't have proper move constructors--but worse, some classes get implicit
// move constructors that break things. We could detect this an explicitly copy, but an extra copy
// of matrices seems highly undesirable.
...
...
@@ -185,13 +181,13 @@ template <typename Type_> struct EigenProps {
}
}
static
constexpr
bool
show_writeable
=
is_eigen_dense_map
<
Type
>::
value
&&
is_eigen_mutable_map
<
Type
>::
value
;
static
constexpr
bool
show_order
=
is_eigen_dense_map
<
Type
>::
value
;
static
constexpr
bool
show_c_contiguous
=
show_order
&&
requires_row_major
;
static
constexpr
bool
show_f_contiguous
=
!
show_c_contiguous
&&
show_order
&&
requires_col_major
;
static
PYBIND11_DESCR
descriptor
()
{
constexpr
bool
show_writeable
=
is_eigen_dense_map
<
Type
>::
value
&&
is_eigen_mutable_map
<
Type
>::
value
;
constexpr
bool
show_order
=
is_eigen_dense_map
<
Type
>::
value
;
constexpr
bool
show_c_contiguous
=
show_order
&&
requires_row_major
;
constexpr
bool
show_f_contiguous
=
!
show_c_contiguous
&&
show_order
&&
requires_col_major
;
static
constexpr
auto
descriptor
=
_
(
"numpy.ndarray["
)
+
npy_format_descriptor
<
Scalar
>::
name
+
return
type_descr
(
_
(
"numpy.ndarray["
)
+
npy_format_descriptor
<
Scalar
>::
name
()
+
_
(
"["
)
+
_
<
fixed_rows
>
(
_
<
(
size_t
)
rows
>
(),
_
(
"m"
))
+
_
(
", "
)
+
_
<
fixed_cols
>
(
_
<
(
size_t
)
cols
>
(),
_
(
"n"
))
+
_
(
"]"
)
+
...
...
@@ -204,7 +200,9 @@ template <typename Type_> struct EigenProps {
_
<
show_writeable
>
(
", flags.writeable"
,
""
)
+
_
<
show_c_contiguous
>
(
", flags.c_contiguous"
,
""
)
+
_
<
show_f_contiguous
>
(
", flags.f_contiguous"
,
""
)
+
_
(
"]"
);
_
(
"]"
)
);
}
};
// Casts an Eigen type to numpy array. If given a base, the numpy array references the src data,
...
...
@@ -341,7 +339,7 @@ public:
return
cast_impl
(
src
,
policy
,
parent
);
}
static
constexpr
auto
name
=
props
::
descriptor
;
static
PYBIND11_DESCR
name
()
{
return
props
::
descriptor
();
}
operator
Type
*
()
{
return
&
value
;
}
operator
Type
&
()
{
return
value
;
}
...
...
@@ -389,7 +387,7 @@ public:
}
}
static
constexpr
auto
name
=
props
::
descriptor
;
static
PYBIND11_DESCR
name
()
{
return
props
::
descriptor
();
}
// Explicitly delete these: support python -> C++ conversion on these (i.e. these can be return
// types but not bound arguments). We still provide them (with an explicitly delete) so that
...
...
@@ -534,7 +532,7 @@ public:
}
static
handle
cast
(
const
Type
*
src
,
return_value_policy
policy
,
handle
parent
)
{
return
cast
(
*
src
,
policy
,
parent
);
}
static
constexpr
auto
name
=
props
::
descriptor
;
static
PYBIND11_DESCR
name
()
{
return
props
::
descriptor
();
}
// Explicitly delete these: support python -> C++ conversion on these (i.e. these can be return
// types but not bound arguments). We still provide them (with an explicitly delete) so that
...
...
@@ -601,7 +599,7 @@ struct type_caster<Type, enable_if_t<is_eigen_sparse<Type>::value>> {
}
PYBIND11_TYPE_CASTER
(
Type
,
_
<
(
Type
::
IsRowMajor
)
!=
0
>
(
"scipy.sparse.csr_matrix["
,
"scipy.sparse.csc_matrix["
)
+
npy_format_descriptor
<
Scalar
>::
name
+
_
(
"]"
));
+
npy_format_descriptor
<
Scalar
>::
name
()
+
_
(
"]"
));
};
NAMESPACE_END
(
detail
)
...
...
dlib/external/pybind11/include/pybind11/embed.h
View file @
beece207
...
...
@@ -145,7 +145,7 @@ inline void finalize_interpreter() {
// Get the internals pointer (without creating it if it doesn't exist). It's possible for the
// internals to be created during Py_Finalize() (e.g. if a py::capsule calls `get_internals()`
// during destruction), so we get the pointer-pointer here and check it after Py_Finalize().
detail
::
internals
**
internals_ptr_ptr
=
&
detail
::
get_internals_ptr
();
detail
::
internals
**
internals_ptr_ptr
=
detail
::
get_internals_pp
();
// It could also be stashed in builtins, so look there too:
if
(
builtins
.
contains
(
id
)
&&
isinstance
<
capsule
>
(
builtins
[
id
]))
internals_ptr_ptr
=
capsule
(
builtins
[
id
]);
...
...
dlib/external/pybind11/include/pybind11/functional.h
View file @
beece207
...
...
@@ -75,8 +75,10 @@ public:
return
cpp_function
(
std
::
forward
<
Func
>
(
f_
),
policy
).
release
();
}
PYBIND11_TYPE_CASTER
(
type
,
_
(
"Callable[["
)
+
concat
(
make_caster
<
Args
>::
name
...)
+
_
(
"], "
)
+
make_caster
<
retval_type
>::
name
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
type
,
_
(
"Callable[["
)
+
argument_loader
<
Args
...
>::
arg_names
()
+
_
(
"], "
)
+
make_caster
<
retval_type
>::
name
()
+
_
(
"]"
));
};
NAMESPACE_END
(
detail
)
...
...
dlib/external/pybind11/include/pybind11/numpy.h
View file @
beece207
...
...
@@ -250,7 +250,7 @@ template <typename T> struct array_info_scalar {
typedef
T
type
;
static
constexpr
bool
is_array
=
false
;
static
constexpr
bool
is_empty
=
false
;
static
constexpr
auto
extents
=
_
(
""
);
static
PYBIND11_DESCR
extents
()
{
return
_
(
""
);
}
static
void
append_extents
(
list
&
/* shape */
)
{
}
};
// Computes underlying type and a comma-separated list of extents for array
...
...
@@ -269,9 +269,15 @@ template <typename T, size_t N> struct array_info<std::array<T, N>> {
array_info
<
T
>::
append_extents
(
shape
);
}
static
constexpr
auto
extents
=
_
<
array_info
<
T
>::
is_array
>
(
concat
(
_
<
N
>
(),
array_info
<
T
>::
extents
),
_
<
N
>
()
);
template
<
typename
T2
=
T
,
enable_if_t
<!
array_info
<
T2
>::
is_array
,
int
>
=
0
>
static
PYBIND11_DESCR
extents
()
{
return
_
<
N
>
();
}
template
<
typename
T2
=
T
,
enable_if_t
<
array_info
<
T2
>::
is_array
,
int
>
=
0
>
static
PYBIND11_DESCR
extents
()
{
return
concat
(
_
<
N
>
(),
array_info
<
T
>::
extents
());
}
};
// For numpy we have special handling for arrays of characters, so we don't include
// the size in the array extents.
...
...
@@ -440,7 +446,7 @@ public:
/// This is essentially the same as calling numpy.dtype(args) in Python.
static
dtype
from_args
(
object
args
)
{
PyObject
*
ptr
=
nullptr
;
if
(
!
detail
::
npy_api
::
get
().
PyArray_DescrConverter_
(
args
.
ptr
(),
&
ptr
)
||
!
ptr
)
if
(
!
detail
::
npy_api
::
get
().
PyArray_DescrConverter_
(
args
.
release
().
ptr
(),
&
ptr
)
||
!
ptr
)
throw
error_already_set
();
return
reinterpret_steal
<
dtype
>
(
ptr
);
}
...
...
@@ -940,9 +946,9 @@ struct format_descriptor<T, detail::enable_if_t<std::is_enum<T>::value>> {
template
<
typename
T
>
struct
format_descriptor
<
T
,
detail
::
enable_if_t
<
detail
::
array_info
<
T
>::
is_array
>>
{
static
std
::
string
format
()
{
using
detail
::
_
;
static
constexpr
auto
extents
=
_
(
"("
)
+
detail
::
array_info
<
T
>::
extents
+
_
(
")"
);
return
extents
.
text
+
format_descriptor
<
detail
::
remove_all_extents_t
<
T
>>::
format
();
using
namespace
detail
;
PYBIND11_DESCR
extents
=
_
(
"("
)
+
array_info
<
T
>::
extents
()
+
_
(
")"
);
return
extents
.
text
()
+
format_descriptor
<
remove_all_extents_t
<
T
>>::
format
();
}
};
...
...
@@ -961,7 +967,7 @@ struct pyobject_caster<array_t<T, ExtraFlags>> {
static
handle
cast
(
const
handle
&
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
return
src
.
inc_ref
();
}
PYBIND11_TYPE_CASTER
(
type
,
handle_type_name
<
type
>::
name
);
PYBIND11_TYPE_CASTER
(
type
,
handle_type_name
<
type
>::
name
()
);
};
template
<
typename
T
>
...
...
@@ -971,34 +977,7 @@ struct compare_buffer_info<T, detail::enable_if_t<detail::is_pod_struct<T>::valu
}
};
template
<
typename
T
,
typename
=
void
>
struct
npy_format_descriptor_name
;
template
<
typename
T
>
struct
npy_format_descriptor_name
<
T
,
enable_if_t
<
std
::
is_integral
<
T
>::
value
>>
{
static
constexpr
auto
name
=
_
<
std
::
is_same
<
T
,
bool
>::
value
>
(
_
(
"bool"
),
_
<
std
::
is_signed
<
T
>::
value
>
(
"int"
,
"uint"
)
+
_
<
sizeof
(
T
)
*
8
>
()
);
};
template
<
typename
T
>
struct
npy_format_descriptor_name
<
T
,
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>
{
static
constexpr
auto
name
=
_
<
std
::
is_same
<
T
,
float
>::
value
||
std
::
is_same
<
T
,
double
>::
value
>
(
_
(
"float"
)
+
_
<
sizeof
(
T
)
*
8
>
(),
_
(
"longdouble"
)
);
};
template
<
typename
T
>
struct
npy_format_descriptor_name
<
T
,
enable_if_t
<
is_complex
<
T
>::
value
>>
{
static
constexpr
auto
name
=
_
<
std
::
is_same
<
typename
T
::
value_type
,
float
>::
value
||
std
::
is_same
<
typename
T
::
value_type
,
double
>::
value
>
(
_
(
"complex"
)
+
_
<
sizeof
(
typename
T
::
value_type
)
*
16
>
(),
_
(
"longcomplex"
)
);
};
template
<
typename
T
>
struct
npy_format_descriptor
<
T
,
enable_if_t
<
satisfies_any_of
<
T
,
std
::
is_arithmetic
,
is_complex
>::
value
>>
:
npy_format_descriptor_name
<
T
>
{
template
<
typename
T
>
struct
npy_format_descriptor
<
T
,
enable_if_t
<
satisfies_any_of
<
T
,
std
::
is_arithmetic
,
is_complex
>::
value
>>
{
private
:
// NB: the order here must match the one in common.h
constexpr
static
const
int
values
[
15
]
=
{
...
...
@@ -1017,10 +996,25 @@ public:
return
reinterpret_borrow
<
pybind11
::
dtype
>
(
ptr
);
pybind11_fail
(
"Unsupported buffer format!"
);
}
template
<
typename
T2
=
T
,
enable_if_t
<
std
::
is_integral
<
T2
>::
value
,
int
>
=
0
>
static
PYBIND11_DESCR
name
()
{
return
_
<
std
::
is_same
<
T
,
bool
>::
value
>
(
_
(
"bool"
),
_
<
std
::
is_signed
<
T
>::
value
>
(
"int"
,
"uint"
)
+
_
<
sizeof
(
T
)
*
8
>
());
}
template
<
typename
T2
=
T
,
enable_if_t
<
std
::
is_floating_point
<
T2
>::
value
,
int
>
=
0
>
static
PYBIND11_DESCR
name
()
{
return
_
<
std
::
is_same
<
T
,
float
>::
value
||
std
::
is_same
<
T
,
double
>::
value
>
(
_
(
"float"
)
+
_
<
sizeof
(
T
)
*
8
>
(),
_
(
"longdouble"
));
}
template
<
typename
T2
=
T
,
enable_if_t
<
is_complex
<
T2
>::
value
,
int
>
=
0
>
static
PYBIND11_DESCR
name
()
{
return
_
<
std
::
is_same
<
typename
T2
::
value_type
,
float
>::
value
||
std
::
is_same
<
typename
T2
::
value_type
,
double
>::
value
>
(
_
(
"complex"
)
+
_
<
sizeof
(
typename
T2
::
value_type
)
*
16
>
(),
_
(
"longcomplex"
));
}
};
#define PYBIND11_DECL_CHAR_FMT \
static
constexpr auto name = _("S") + _<N>();
\
static
PYBIND11_DESCR name() { return _("S") + _<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
]
>
{
PYBIND11_DECL_CHAR_FMT
};
template
<
size_t
N
>
struct
npy_format_descriptor
<
std
::
array
<
char
,
N
>>
{
PYBIND11_DECL_CHAR_FMT
};
...
...
@@ -1032,7 +1026,7 @@ private:
public
:
static_assert
(
!
array_info
<
T
>::
is_empty
,
"Zero-sized arrays are not supported"
);
static
constexpr
auto
name
=
_
(
"("
)
+
array_info
<
T
>::
extents
+
_
(
")"
)
+
base_descr
::
name
;
static
PYBIND11_DESCR
name
()
{
return
_
(
"("
)
+
array_info
<
T
>::
extents
()
+
_
(
")"
)
+
base_descr
::
name
();
}
static
pybind11
::
dtype
dtype
()
{
list
shape
;
array_info
<
T
>::
append_extents
(
shape
);
...
...
@@ -1044,7 +1038,7 @@ template<typename T> struct npy_format_descriptor<T, enable_if_t<std::is_enum<T>
private
:
using
base_descr
=
npy_format_descriptor
<
typename
std
::
underlying_type
<
T
>::
type
>
;
public
:
static
constexpr
auto
name
=
base_descr
::
name
;
static
PYBIND11_DESCR
name
()
{
return
base_descr
::
name
();
}
static
pybind11
::
dtype
dtype
()
{
return
base_descr
::
dtype
();
}
};
...
...
@@ -1119,7 +1113,7 @@ inline PYBIND11_NOINLINE void register_structured_dtype(
template
<
typename
T
,
typename
SFINAE
>
struct
npy_format_descriptor
{
static_assert
(
is_pod_struct
<
T
>::
value
,
"Attempt to use a non-POD or unimplemented POD type as a numpy dtype"
);
static
constexpr
auto
name
=
make_caster
<
T
>::
name
;
static
PYBIND11_DESCR
name
()
{
return
make_caster
<
T
>::
name
();
}
static
pybind11
::
dtype
dtype
()
{
return
reinterpret_borrow
<
pybind11
::
dtype
>
(
dtype_ptr
());
...
...
@@ -1564,7 +1558,9 @@ vectorize_extractor(const Func &f, Return (*) (Args ...)) {
}
template
<
typename
T
,
int
Flags
>
struct
handle_type_name
<
array_t
<
T
,
Flags
>>
{
static
constexpr
auto
name
=
_
(
"numpy.ndarray["
)
+
npy_format_descriptor
<
T
>::
name
+
_
(
"]"
);
static
PYBIND11_DESCR
name
()
{
return
_
(
"numpy.ndarray["
)
+
npy_format_descriptor
<
T
>::
name
()
+
_
(
"]"
);
}
};
NAMESPACE_END
(
detail
)
...
...
dlib/external/pybind11/include/pybind11/pybind11.h
View file @
beece207
...
...
@@ -51,7 +51,6 @@ NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
class
cpp_function
:
public
function
{
public
:
cpp_function
()
{
}
cpp_function
(
std
::
nullptr_t
)
{
}
/// Construct a cpp_function from a vanilla function pointer
template
<
typename
Return
,
typename
...
Args
,
typename
...
Extra
>
...
...
@@ -94,7 +93,8 @@ protected:
template
<
typename
Func
,
typename
Return
,
typename
...
Args
,
typename
...
Extra
>
void
initialize
(
Func
&&
f
,
Return
(
*
)(
Args
...),
const
Extra
&
...
extra
)
{
using
namespace
detail
;
struct
capture
{
detail
::
remove_reference_t
<
Func
>
f
;
};
struct
capture
{
remove_reference_t
<
Func
>
f
;
};
/* Store the function including any extra state it might have (e.g. a lambda capture object) */
auto
rec
=
make_function_record
();
...
...
@@ -113,23 +113,23 @@ protected:
# pragma GCC diagnostic pop
#endif
if
(
!
std
::
is_trivially_destructible
<
Func
>::
value
)
rec
->
free_data
=
[](
detail
::
function_record
*
r
)
{
((
capture
*
)
&
r
->
data
)
->~
capture
();
};
rec
->
free_data
=
[](
function_record
*
r
)
{
((
capture
*
)
&
r
->
data
)
->~
capture
();
};
}
else
{
rec
->
data
[
0
]
=
new
capture
{
std
::
forward
<
Func
>
(
f
)
};
rec
->
free_data
=
[](
detail
::
function_record
*
r
)
{
delete
((
capture
*
)
r
->
data
[
0
]);
};
rec
->
free_data
=
[](
function_record
*
r
)
{
delete
((
capture
*
)
r
->
data
[
0
]);
};
}
/* Type casters for the function arguments and return value */
using
cast_in
=
detail
::
argument_loader
<
Args
...
>
;
using
cast_out
=
detail
::
make_caster
<
detail
::
conditional_t
<
std
::
is_void
<
Return
>::
value
,
detail
::
void_type
,
Return
>
using
cast_in
=
argument_loader
<
Args
...
>
;
using
cast_out
=
make_caster
<
conditional_t
<
std
::
is_void
<
Return
>::
value
,
void_type
,
Return
>
>
;
static_assert
(
detail
::
expected_num_args
<
Extra
...
>
(
sizeof
...(
Args
),
cast_in
::
has_args
,
cast_in
::
has_kwargs
),
static_assert
(
expected_num_args
<
Extra
...
>
(
sizeof
...(
Args
),
cast_in
::
has_args
,
cast_in
::
has_kwargs
),
"The number of argument annotations does not match the number of function arguments"
);
/* Dispatch code which converts function arguments and performs the actual function call */
rec
->
impl
=
[](
detail
::
function_call
&
call
)
->
handle
{
rec
->
impl
=
[](
function_call
&
call
)
->
handle
{
cast_in
args_converter
;
/* Try to cast the function arguments into the C++ domain */
...
...
@@ -137,7 +137,7 @@ protected:
return
PYBIND11_TRY_NEXT_OVERLOAD
;
/* Invoke call policy pre-call hook */
detail
::
process_attributes
<
Extra
...
>::
precall
(
call
);
process_attributes
<
Extra
...
>::
precall
(
call
);
/* Get a pointer to the capture object */
auto
data
=
(
sizeof
(
capture
)
<=
sizeof
(
call
.
func
.
data
)
...
...
@@ -145,30 +145,29 @@ protected:
capture
*
cap
=
const_cast
<
capture
*>
(
reinterpret_cast
<
const
capture
*>
(
data
));
/* Override policy for rvalues -- usually to enforce rvp::move on an rvalue */
const
auto
policy
=
detail
::
return_value_policy_override
<
Return
>::
policy
(
call
.
func
.
policy
);
const
auto
policy
=
return_value_policy_override
<
Return
>::
policy
(
call
.
func
.
policy
);
/* Function scope guard -- defaults to the compile-to-nothing `void_type` */
using
Guard
=
detail
::
extract_guard_t
<
Extra
...
>
;
using
Guard
=
extract_guard_t
<
Extra
...
>
;
/* Perform the function call */
handle
result
=
cast_out
::
cast
(
std
::
move
(
args_converter
).
template
call
<
Return
,
Guard
>
(
cap
->
f
),
policy
,
call
.
parent
);
/* Invoke call policy post-call hook */
detail
::
process_attributes
<
Extra
...
>::
postcall
(
call
,
result
);
process_attributes
<
Extra
...
>::
postcall
(
call
,
result
);
return
result
;
};
/* Process any user-provided function attributes */
detail
::
process_attributes
<
Extra
...
>::
init
(
extra
...,
rec
);
process_attributes
<
Extra
...
>::
init
(
extra
...,
rec
);
/* Generate a readable signature describing the function's arguments and return value types */
static
constexpr
auto
signature
=
_
(
"("
)
+
cast_in
::
arg_names
+
_
(
") -> "
)
+
cast_out
::
name
;
PYBIND11_DESCR_CONSTEXPR
auto
types
=
decltype
(
signature
)
::
types
();
PYBIND11_DESCR
signature
=
_
(
"("
)
+
cast_in
::
arg_names
()
+
_
(
") -> "
)
+
cast_out
::
name
();
/* Register the function with Python from generic (non-templated) code */
initialize_generic
(
rec
,
signature
.
text
,
types
.
data
(),
sizeof
...(
Args
));
initialize_generic
(
rec
,
signature
.
text
(),
signature
.
types
(),
sizeof
...(
Args
));
if
(
cast_in
::
has_args
)
rec
->
has_args
=
true
;
if
(
cast_in
::
has_kwargs
)
rec
->
has_kwargs
=
true
;
...
...
@@ -218,16 +217,16 @@ protected:
/* Generate a proper function signature */
std
::
string
signature
;
size_t
type_index
=
0
,
arg_index
=
0
;
for
(
auto
*
pc
=
text
;
*
pc
!=
'\0'
;
++
pc
)
{
const
auto
c
=
*
pc
;
size_t
type_depth
=
0
,
char_index
=
0
,
type_index
=
0
,
arg_index
=
0
;
while
(
true
)
{
char
c
=
text
[
char_index
++
];
if
(
c
==
'\0'
)
break
;
if
(
c
==
'{'
)
{
// Write arg name for everything except *args and **kwargs.
if
(
*
(
pc
+
1
)
==
'*'
)
continue
;
if
(
arg_index
<
rec
->
args
.
size
()
&&
rec
->
args
[
arg_index
].
name
)
{
// Write arg name for everything except *args, **kwargs and return type.
if
(
type_depth
==
0
&&
text
[
char_index
]
!=
'*'
&&
arg_index
<
args
)
{
if
(
!
rec
->
args
.
empty
()
&&
rec
->
args
[
arg_index
].
name
)
{
signature
+=
rec
->
args
[
arg_index
].
name
;
}
else
if
(
arg_index
==
0
&&
rec
->
is_method
)
{
signature
+=
"self"
;
...
...
@@ -235,13 +234,17 @@ protected:
signature
+=
"arg"
+
std
::
to_string
(
arg_index
-
(
rec
->
is_method
?
1
:
0
));
}
signature
+=
": "
;
}
++
type_depth
;
}
else
if
(
c
==
'}'
)
{
// Write default value if available.
--
type_depth
;
if
(
type_depth
==
0
)
{
if
(
arg_index
<
rec
->
args
.
size
()
&&
rec
->
args
[
arg_index
].
descr
)
{
signature
+=
"="
;
signature
+=
rec
->
args
[
arg_index
].
descr
;
}
arg_index
++
;
}
}
else
if
(
c
==
'%'
)
{
const
std
::
type_info
*
t
=
types
[
type_index
++
];
if
(
!
t
)
...
...
@@ -266,9 +269,14 @@ protected:
signature
+=
c
;
}
}
if
(
arg_index
!=
args
||
types
[
type_index
]
!=
nullptr
)
if
(
type_depth
!=
0
||
types
[
type_index
]
!=
nullptr
)
pybind11_fail
(
"Internal error while parsing type signature (2)"
);
#if !defined(PYBIND11_CONSTEXPR_DESCR)
delete
[]
types
;
delete
[]
text
;
#endif
#if PY_MAJOR_VERSION < 3
if
(
strcmp
(
rec
->
name
,
"__next__"
)
==
0
)
{
std
::
free
(
rec
->
name
);
...
...
@@ -568,8 +576,8 @@ protected:
continue
;
// Unconsumed kwargs, but no py::kwargs argument to accept them
// 4a. If we have a py::args argument, create a new tuple with leftovers
tuple
extra_args
;
if
(
func
.
has_args
)
{
tuple
extra_args
;
if
(
args_to_copy
==
0
)
{
// We didn't copy out any position arguments from the args_in tuple, so we
// can reuse it directly without copying:
...
...
@@ -580,12 +588,12 @@ protected:
size_t
args_size
=
n_args_in
-
args_copied
;
extra_args
=
tuple
(
args_size
);
for
(
size_t
i
=
0
;
i
<
args_size
;
++
i
)
{
handle
item
=
PyTuple_GET_ITEM
(
args_in
,
args_copied
+
i
);
extra_args
[
i
]
=
item
.
inc_ref
().
ptr
();
extra_args
[
i
]
=
PyTuple_GET_ITEM
(
args_in
,
args_copied
+
i
);
}
}
call
.
args
.
push_back
(
extra_args
);
call
.
args_convert
.
push_back
(
false
);
call
.
args_ref
=
std
::
move
(
extra_args
);
}
// 4b. If we have a py::kwargs, pass on any remaining kwargs
...
...
@@ -594,6 +602,7 @@ protected:
kwargs
=
dict
();
// If we didn't get one, send an empty one
call
.
args
.
push_back
(
kwargs
);
call
.
args_convert
.
push_back
(
false
);
call
.
kwargs_ref
=
std
::
move
(
kwargs
);
}
// 5. Put everything in a vector. Not technically step 5, we've been building it
...
...
@@ -952,18 +961,18 @@ protected:
tinfo
->
get_buffer_data
=
get_buffer_data
;
}
// rec_func must be set for either fget or fset.
void
def_property_static_impl
(
const
char
*
name
,
handle
fget
,
handle
fset
,
detail
::
function_record
*
rec_func
)
{
const
auto
is_static
=
rec_func
&&
!
(
rec_func
->
is_method
&&
rec_func
->
scope
);
const
auto
has_doc
=
rec_func
&&
rec_func
->
doc
&&
pybind11
::
options
::
show_user_defined_docstrings
();
detail
::
function_record
*
rec_fget
)
{
const
auto
is_static
=
!
(
rec_fget
->
is_method
&&
rec_fget
->
scope
);
const
auto
has_doc
=
rec_fget
->
doc
&&
pybind11
::
options
::
show_user_defined_docstrings
();
auto
property
=
handle
((
PyObject
*
)
(
is_static
?
get_internals
().
static_property_type
:
&
PyProperty_Type
));
attr
(
name
)
=
property
(
fget
.
ptr
()
?
fget
:
none
(),
fset
.
ptr
()
?
fset
:
none
(),
/*deleter*/
none
(),
pybind11
::
str
(
has_doc
?
rec_f
unc
->
doc
:
""
));
pybind11
::
str
(
has_doc
?
rec_f
get
->
doc
:
""
));
}
};
...
...
@@ -995,18 +1004,10 @@ template <typename /*Derived*/, typename F>
auto
method_adaptor
(
F
&&
f
)
->
decltype
(
std
::
forward
<
F
>
(
f
))
{
return
std
::
forward
<
F
>
(
f
);
}
template
<
typename
Derived
,
typename
Return
,
typename
Class
,
typename
...
Args
>
auto
method_adaptor
(
Return
(
Class
::*
pmf
)(
Args
...))
->
Return
(
Derived
::*
)(
Args
...)
{
static_assert
(
detail
::
is_accessible_base_of
<
Class
,
Derived
>::
value
,
"Cannot bind an inaccessible base class method; use a lambda definition instead"
);
return
pmf
;
}
auto
method_adaptor
(
Return
(
Class
::*
pmf
)(
Args
...))
->
Return
(
Derived
::*
)(
Args
...)
{
return
pmf
;
}
template
<
typename
Derived
,
typename
Return
,
typename
Class
,
typename
...
Args
>
auto
method_adaptor
(
Return
(
Class
::*
pmf
)(
Args
...)
const
)
->
Return
(
Derived
::*
)(
Args
...)
const
{
static_assert
(
detail
::
is_accessible_base_of
<
Class
,
Derived
>::
value
,
"Cannot bind an inaccessible base class method; use a lambda definition instead"
);
return
pmf
;
}
auto
method_adaptor
(
Return
(
Class
::*
pmf
)(
Args
...)
const
)
->
Return
(
Derived
::*
)(
Args
...)
const
{
return
pmf
;
}
template
<
typename
type_
,
typename
...
options
>
class
class_
:
public
detail
::
generic_type
{
...
...
@@ -1197,7 +1198,7 @@ public:
/// Uses cpp_function's return_value_policy by default
template
<
typename
...
Extra
>
class_
&
def_property_readonly
(
const
char
*
name
,
const
cpp_function
&
fget
,
const
Extra
&
...
extra
)
{
return
def_property
(
name
,
fget
,
nullptr
,
extra
...);
return
def_property
(
name
,
fget
,
cpp_function
()
,
extra
...);
}
/// Uses return_value_policy::reference by default
...
...
@@ -1209,7 +1210,7 @@ public:
/// Uses cpp_function's return_value_policy by default
template
<
typename
...
Extra
>
class_
&
def_property_readonly_static
(
const
char
*
name
,
const
cpp_function
&
fget
,
const
Extra
&
...
extra
)
{
return
def_property_static
(
name
,
fget
,
nullptr
,
extra
...);
return
def_property_static
(
name
,
fget
,
cpp_function
()
,
extra
...);
}
/// Uses return_value_policy::reference_internal by default
...
...
@@ -1239,25 +1240,21 @@ public:
template
<
typename
...
Extra
>
class_
&
def_property_static
(
const
char
*
name
,
const
cpp_function
&
fget
,
const
cpp_function
&
fset
,
const
Extra
&
...
extra
)
{
auto
rec_fget
=
get_function_record
(
fget
),
rec_fset
=
get_function_record
(
fset
);
auto
*
rec_active
=
rec_fget
;
if
(
rec_fget
)
{
char
*
doc_prev
=
rec_fget
->
doc
;
/* 'extra' field may include a property-specific documentation string */
detail
::
process_attributes
<
Extra
...
>::
init
(
extra
...,
rec_fget
);
if
(
rec_fget
->
doc
&&
rec_fget
->
doc
!=
doc_prev
)
{
free
(
doc_prev
);
rec_fget
->
doc
=
strdup
(
rec_fget
->
doc
);
}
}
if
(
rec_fset
)
{
char
*
doc_prev
=
rec_fset
->
doc
;
doc_prev
=
rec_fset
->
doc
;
detail
::
process_attributes
<
Extra
...
>::
init
(
extra
...,
rec_fset
);
if
(
rec_fset
->
doc
&&
rec_fset
->
doc
!=
doc_prev
)
{
free
(
doc_prev
);
rec_fset
->
doc
=
strdup
(
rec_fset
->
doc
);
}
if
(
!
rec_active
)
rec_active
=
rec_fset
;
}
def_property_static_impl
(
name
,
fget
,
fset
,
rec_
active
);
def_property_static_impl
(
name
,
fget
,
fset
,
rec_
fget
);
return
*
this
;
}
...
...
@@ -1375,30 +1372,15 @@ public:
auto
m_entries_ptr
=
m_entries
.
inc_ref
().
ptr
();
def
(
"__repr__"
,
[
name
,
m_entries_ptr
](
Type
value
)
->
pybind11
::
str
{
for
(
const
auto
&
kv
:
reinterpret_borrow
<
dict
>
(
m_entries_ptr
))
{
if
(
pybind11
::
cast
<
Type
>
(
kv
.
second
[
int_
(
0
)]
)
==
value
)
if
(
pybind11
::
cast
<
Type
>
(
kv
.
second
)
==
value
)
return
pybind11
::
str
(
"{}.{}"
).
format
(
name
,
kv
.
first
);
}
return
pybind11
::
str
(
"{}.???"
).
format
(
name
);
});
def_property_readonly_static
(
"__doc__"
,
[
m_entries_ptr
](
handle
self
)
{
std
::
string
docstring
;
const
char
*
tp_doc
=
((
PyTypeObject
*
)
self
.
ptr
())
->
tp_doc
;
if
(
tp_doc
)
docstring
+=
std
::
string
(
tp_doc
)
+
"
\n\n
"
;
docstring
+=
"Members:"
;
for
(
const
auto
&
kv
:
reinterpret_borrow
<
dict
>
(
m_entries_ptr
))
{
auto
key
=
std
::
string
(
pybind11
::
str
(
kv
.
first
));
auto
comment
=
kv
.
second
[
int_
(
1
)];
docstring
+=
"
\n\n
"
+
key
;
if
(
!
comment
.
is_none
())
docstring
+=
" : "
+
(
std
::
string
)
pybind11
::
str
(
comment
);
}
return
docstring
;
});
def_property_readonly_static
(
"__members__"
,
[
m_entries_ptr
](
handle
/* self */
)
{
def_property_readonly_static
(
"__members__"
,
[
m_entries_ptr
](
object
/* self */
)
{
dict
m
;
for
(
const
auto
&
kv
:
reinterpret_borrow
<
dict
>
(
m_entries_ptr
))
m
[
kv
.
first
]
=
kv
.
second
[
int_
(
0
)]
;
m
[
kv
.
first
]
=
kv
.
second
;
return
m
;
},
return_value_policy
::
copy
);
def
(
init
([](
Scalar
i
)
{
return
static_cast
<
Type
>
(
i
);
}));
...
...
@@ -1446,15 +1428,15 @@ public:
/// Export enumeration entries into the parent scope
enum_
&
export_values
()
{
for
(
const
auto
&
kv
:
m_entries
)
m_parent
.
attr
(
kv
.
first
)
=
kv
.
second
[
int_
(
0
)]
;
m_parent
.
attr
(
kv
.
first
)
=
kv
.
second
;
return
*
this
;
}
/// Add an enumeration entry
enum_
&
value
(
char
const
*
name
,
Type
value
,
const
char
*
doc
=
nullptr
)
{
enum_
&
value
(
char
const
*
name
,
Type
value
)
{
auto
v
=
pybind11
::
cast
(
value
,
return_value_policy
::
copy
);
this
->
attr
(
name
)
=
v
;
m_entries
[
pybind11
::
str
(
name
)]
=
std
::
make_pair
(
v
,
doc
)
;
m_entries
[
pybind11
::
str
(
name
)]
=
v
;
return
*
this
;
}
...
...
dlib/external/pybind11/include/pybind11/pytypes.h
View file @
beece207
...
...
@@ -295,9 +295,6 @@ public:
PyErr_Fetch
(
&
type
.
ptr
(),
&
value
.
ptr
(),
&
trace
.
ptr
());
}
error_already_set
(
const
error_already_set
&
)
=
default
;
error_already_set
(
error_already_set
&&
)
=
default
;
inline
~
error_already_set
();
/// Give the currently-held error back to Python, if any. If there is currently a Python error
...
...
dlib/external/pybind11/include/pybind11/stl.h
View file @
beece207
...
...
@@ -30,7 +30,8 @@
# define PYBIND11_HAS_OPTIONAL 1
# endif
// std::experimental::optional (but not allowed in c++11 mode)
# if defined(PYBIND11_CPP14) && __has_include(<experimental/optional>)
# if defined(PYBIND11_CPP14) && (__has_include(<experimental/optional>) && \
!__has_include(<optional>))
# include <experimental/optional>
# define PYBIND11_HAS_EXP_OPTIONAL 1
# endif
...
...
@@ -91,7 +92,7 @@ template <typename Type, typename Key> struct set_caster {
return
s
.
release
();
}
PYBIND11_TYPE_CASTER
(
type
,
_
(
"Set["
)
+
key_conv
::
name
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
type
,
_
(
"Set["
)
+
key_conv
::
name
()
+
_
(
"]"
));
};
template
<
typename
Type
,
typename
Key
,
typename
Value
>
struct
map_caster
{
...
...
@@ -127,7 +128,7 @@ template <typename Type, typename Key, typename Value> struct map_caster {
return
d
.
release
();
}
PYBIND11_TYPE_CASTER
(
Type
,
_
(
"Dict["
)
+
key_conv
::
name
+
_
(
", "
)
+
value_conv
::
name
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
Type
,
_
(
"Dict["
)
+
key_conv
::
name
()
+
_
(
", "
)
+
value_conv
::
name
()
+
_
(
"]"
));
};
template
<
typename
Type
,
typename
Value
>
struct
list_caster
{
...
...
@@ -168,7 +169,7 @@ public:
return
l
.
release
();
}
PYBIND11_TYPE_CASTER
(
Type
,
_
(
"List["
)
+
value_conv
::
name
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
Type
,
_
(
"List["
)
+
value_conv
::
name
()
+
_
(
"]"
));
};
template
<
typename
Type
,
typename
Alloc
>
struct
type_caster
<
std
::
vector
<
Type
,
Alloc
>>
...
...
@@ -222,7 +223,7 @@ public:
return
l
.
release
();
}
PYBIND11_TYPE_CASTER
(
ArrayType
,
_
(
"List["
)
+
value_conv
::
name
+
_
<
Resizable
>
(
_
(
""
),
_
(
"["
)
+
_
<
Size
>
()
+
_
(
"]"
))
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
ArrayType
,
_
(
"List["
)
+
value_conv
::
name
()
+
_
<
Resizable
>
(
_
(
""
),
_
(
"["
)
+
_
<
Size
>
()
+
_
(
"]"
))
+
_
(
"]"
));
};
template
<
typename
Type
,
size_t
Size
>
struct
type_caster
<
std
::
array
<
Type
,
Size
>>
...
...
@@ -268,7 +269,7 @@ template<typename T> struct optional_caster {
return
true
;
}
PYBIND11_TYPE_CASTER
(
T
,
_
(
"Optional["
)
+
value_conv
::
name
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
T
,
_
(
"Optional["
)
+
value_conv
::
name
()
+
_
(
"]"
));
};
#if PYBIND11_HAS_OPTIONAL
...
...
@@ -348,7 +349,7 @@ struct variant_caster<V<Ts...>> {
}
using
Type
=
V
<
Ts
...
>
;
PYBIND11_TYPE_CASTER
(
Type
,
_
(
"Union["
)
+
detail
::
concat
(
make_caster
<
Ts
>::
name
...)
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
Type
,
_
(
"Union["
)
+
detail
::
concat
(
make_caster
<
Ts
>::
name
()
...)
+
_
(
"]"
));
};
#if PYBIND11_HAS_VARIANT
...
...
dlib/external/pybind11/include/pybind11/stl_bind.h
View file @
beece207
...
...
@@ -587,7 +587,7 @@ class_<Map, holder_type> bind_map(handle scope, const std::string &name, Args&&.
auto
it
=
m
.
find
(
k
);
if
(
it
==
m
.
end
())
throw
key_error
();
return
m
.
erase
(
it
);
m
.
erase
(
it
);
}
);
...
...
dlib/external/pybind11/tools/FindPythonLibsNew.cmake
View file @
beece207
# - Find python libraries
# This module finds the libraries corresponding to the Python interpeter
# This module finds the libraries corresponding to the Python interp
r
eter
# FindPythonInterp provides.
# This code sets the following variables:
#
...
...
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