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
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
156 additions
and
152 deletions
+156
-152
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
+0
-0
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
+30
-32
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
+0
-0
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:
...
@@ -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
[
reported
](
http://graylab.jhu.edu/RosettaCon2016/PyRosetta-4.pdf
)
a binary
size reduction of
**5.4x**
and compile time reduction by
**5.8x**
.
size reduction of
**5.4x**
and compile time reduction by
**5.8x**
.
-
Function signatures are precomputed at compile time (using
``constexpr``
),
-
When supported by the compiler, two new C++14 features (relaxed constexpr and
leading to smaller binaries.
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
-
With little extra effort, C++ types can be pickled and unpickled similar to
regular Python objects.
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
...
@@ -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
{
template
<
typename
type
>
class
type_caster_base
:
public
type_caster_generic
{
using
itype
=
intrinsic_t
<
type
>
;
using
itype
=
intrinsic_t
<
type
>
;
public
:
public
:
static
constexpr
auto
name
=
_
<
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
))
{
}
explicit
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
)
{
}
...
@@ -835,7 +835,7 @@ public:
...
@@ -835,7 +835,7 @@ public:
nullptr
,
nullptr
,
holder
);
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
*
()
{
return
(
type
*
)
value
;
}
operator
itype
&
()
{
if
(
!
value
)
throw
reference_cast_error
();
return
*
((
itype
*
)
value
);
}
operator
itype
&
()
{
if
(
!
value
)
throw
reference_cast_error
();
return
*
((
itype
*
)
value
);
}
...
@@ -885,7 +885,7 @@ private:
...
@@ -885,7 +885,7 @@ private:
"std::reference_wrapper<T> caster requires T to have a caster with an `T &` operator"
);
"std::reference_wrapper<T> caster requires T to have a caster with an `T &` operator"
);
public
:
public
:
bool
load
(
handle
src
,
bool
convert
)
{
return
subcaster
.
load
(
src
,
convert
);
}
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
)
{
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
// 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
)
if
(
policy
==
return_value_policy
::
take_ownership
||
policy
==
return_value_policy
::
automatic
)
...
@@ -900,7 +900,7 @@ public:
...
@@ -900,7 +900,7 @@ public:
protected: \
protected: \
type value; \
type value; \
public: \
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> \
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) { \
static handle cast(T_ *src, return_value_policy policy, handle parent) { \
if (!src) return none().release(); \
if (!src) return none().release(); \
...
@@ -980,12 +980,11 @@ public:
...
@@ -980,12 +980,11 @@ public:
static
handle
cast
(
T
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
static
handle
cast
(
T
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
if
(
std
::
is_floating_point
<
T
>::
value
)
{
if
(
std
::
is_floating_point
<
T
>::
value
)
{
return
PyFloat_FromDouble
((
double
)
src
);
return
PyFloat_FromDouble
((
double
)
src
);
}
else
if
(
sizeof
(
T
)
<=
sizeof
(
ssize_t
))
{
}
else
if
(
sizeof
(
T
)
<=
sizeof
(
long
))
{
// This returns a long automatically if needed
if
(
std
::
is_signed
<
T
>::
value
)
if
(
std
::
is_signed
<
T
>::
value
)
return
P
YBIND11_LONG_FROM_SIGNED
(
src
);
return
P
yLong_FromLong
((
long
)
src
);
else
else
return
P
YBIND11_LONG_FROM_UNSIGNED
(
src
);
return
P
yLong_FromUnsignedLong
((
unsigned
long
)
src
);
}
else
{
}
else
{
if
(
std
::
is_signed
<
T
>::
value
)
if
(
std
::
is_signed
<
T
>::
value
)
return
PyLong_FromLongLong
((
long
long
)
src
);
return
PyLong_FromLongLong
((
long
long
)
src
);
...
@@ -1050,7 +1049,7 @@ public:
...
@@ -1050,7 +1049,7 @@ public:
template
<
typename
T
>
using
cast_op_type
=
void
*&
;
template
<
typename
T
>
using
cast_op_type
=
void
*&
;
operator
void
*&
()
{
return
value
;
}
operator
void
*&
()
{
return
value
;
}
static
constexpr
auto
name
=
_
(
"capsule"
);
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
(
"capsule"
));
}
private
:
private
:
void
*
value
=
nullptr
;
void
*
value
=
nullptr
;
};
};
...
@@ -1293,7 +1292,7 @@ public:
...
@@ -1293,7 +1292,7 @@ public:
return
one_char
;
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
>
;
template
<
typename
_T
>
using
cast_op_type
=
pybind11
::
detail
::
cast_op_type
<
_T
>
;
};
};
...
@@ -1318,7 +1317,9 @@ public:
...
@@ -1318,7 +1317,9 @@ public:
return
cast_impl
(
std
::
forward
<
T
>
(
src
),
policy
,
parent
,
indices
{});
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
;
template
<
typename
T
>
using
cast_op_type
=
type
;
...
@@ -1463,7 +1464,7 @@ struct move_only_holder_caster {
...
@@ -1463,7 +1464,7 @@ struct move_only_holder_caster {
auto
*
ptr
=
holder_helper
<
holder_type
>::
get
(
src
);
auto
*
ptr
=
holder_helper
<
holder_type
>::
get
(
src
);
return
type_caster_base
<
type
>::
cast_holder
(
ptr
,
&
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
>
template
<
typename
type
,
typename
deleter
>
...
@@ -1494,10 +1495,10 @@ template <typename base, typename holder> struct is_holder_type :
...
@@ -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
>>
:
template
<
typename
base
,
typename
deleter
>
struct
is_holder_type
<
base
,
std
::
unique_ptr
<
base
,
deleter
>>
:
std
::
true_type
{};
std
::
true_type
{};
template
<
typename
T
>
struct
handle_type_name
{
static
constexpr
auto
name
=
_
<
T
>
();
};
template
<
typename
T
>
struct
handle_type_name
{
static
PYBIND11_DESCR
name
()
{
return
_
<
T
>
();
}
};
template
<>
struct
handle_type_name
<
bytes
>
{
static
constexpr
auto
name
=
_
(
PYBIND11_BYTES_NAME
);
};
template
<>
struct
handle_type_name
<
bytes
>
{
static
PYBIND11_DESCR
name
()
{
return
_
(
PYBIND11_BYTES_NAME
);
}
};
template
<>
struct
handle_type_name
<
args
>
{
static
constexpr
auto
name
=
_
(
"*args"
);
};
template
<>
struct
handle_type_name
<
args
>
{
static
PYBIND11_DESCR
name
()
{
return
_
(
"*args"
);
}
};
template
<>
struct
handle_type_name
<
kwargs
>
{
static
constexpr
auto
name
=
_
(
"**kwargs"
);
};
template
<>
struct
handle_type_name
<
kwargs
>
{
static
PYBIND11_DESCR
name
()
{
return
_
(
"**kwargs"
);
}
};
template
<
typename
type
>
template
<
typename
type
>
struct
pyobject_caster
{
struct
pyobject_caster
{
...
@@ -1515,7 +1516,7 @@ struct pyobject_caster {
...
@@ -1515,7 +1516,7 @@ struct pyobject_caster {
static
handle
cast
(
const
handle
&
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
static
handle
cast
(
const
handle
&
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
return
src
.
inc_ref
();
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
>
template
<
typename
T
>
...
@@ -1685,6 +1686,9 @@ template <> inline void cast_safe<void>(object &&) {}
...
@@ -1685,6 +1686,9 @@ template <> inline void cast_safe<void>(object &&) {}
NAMESPACE_END
(
detail
)
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
,
template
<
return_value_policy
policy
=
return_value_policy
::
automatic_reference
,
typename
...
Args
>
tuple
make_tuple
(
Args
&&
...
args_
)
{
typename
...
Args
>
tuple
make_tuple
(
Args
&&
...
args_
)
{
constexpr
size_t
size
=
sizeof
...(
Args
);
constexpr
size_t
size
=
sizeof
...(
Args
);
...
@@ -1801,6 +1805,10 @@ struct function_call {
...
@@ -1801,6 +1805,10 @@ struct function_call {
/// The `convert` value the arguments should be loaded with
/// The `convert` value the arguments should be loaded with
std
::
vector
<
bool
>
args_convert
;
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
/// The parent, if any
handle
parent
;
handle
parent
;
...
@@ -1828,7 +1836,7 @@ public:
...
@@ -1828,7 +1836,7 @@ public:
static
constexpr
bool
has_kwargs
=
kwargs_pos
<
0
;
static
constexpr
bool
has_kwargs
=
kwargs_pos
<
0
;
static
constexpr
bool
has_args
=
args_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
)
{
bool
load_args
(
function_call
&
call
)
{
return
load_impl_sequence
(
call
,
indices
{});
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
...
@@ -25,13 +25,9 @@ template <typename T> struct format_descriptor<std::complex<T>, detail::enable_i
static
std
::
string
format
()
{
return
std
::
string
(
value
);
}
static
std
::
string
format
()
{
return
std
::
string
(
value
);
}
};
};
#ifndef PYBIND11_CPP17
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
std
::
complex
<
T
>
,
detail
::
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>::
value
[
3
];
std
::
complex
<
T
>
,
detail
::
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>::
value
[
3
];
#endif
NAMESPACE_BEGIN
(
detail
)
NAMESPACE_BEGIN
(
detail
)
template
<
typename
T
>
struct
is_fmt_numeric
<
std
::
complex
<
T
>
,
detail
::
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>
{
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
...
@@ -289,9 +289,13 @@ extern "C" inline int pybind11_object_init(PyObject *self, PyObject *, PyObject
inline
void
add_patient
(
PyObject
*
nurse
,
PyObject
*
patient
)
{
inline
void
add_patient
(
PyObject
*
nurse
,
PyObject
*
patient
)
{
auto
&
internals
=
get_internals
();
auto
&
internals
=
get_internals
();
auto
instance
=
reinterpret_cast
<
detail
::
instance
*>
(
nurse
);
auto
instance
=
reinterpret_cast
<
detail
::
instance
*>
(
nurse
);
auto
&
current_patients
=
internals
.
patients
[
nurse
];
instance
->
has_patients
=
true
;
instance
->
has_patients
=
true
;
for
(
auto
&
p
:
current_patients
)
if
(
p
==
patient
)
return
;
Py_INCREF
(
patient
);
Py_INCREF
(
patient
);
internals
.
patients
[
nurse
]
.
push_back
(
patient
);
current_patients
.
push_back
(
patient
);
}
}
inline
void
clear_patients
(
PyObject
*
self
)
{
inline
void
clear_patients
(
PyObject
*
self
)
{
...
...
dlib/external/pybind11/include/pybind11/detail/common.h
View file @
beece207
...
@@ -92,8 +92,8 @@
...
@@ -92,8 +92,8 @@
#endif
#endif
#define PYBIND11_VERSION_MAJOR 2
#define PYBIND11_VERSION_MAJOR 2
#define PYBIND11_VERSION_MINOR
3
#define PYBIND11_VERSION_MINOR
2
#define PYBIND11_VERSION_PATCH
dev0
#define PYBIND11_VERSION_PATCH
2
/// Include Python header, disable linking to pythonX_d.lib on Windows in debug mode
/// Include Python header, disable linking to pythonX_d.lib on Windows in debug mode
#if defined(_MSC_VER)
#if defined(_MSC_VER)
...
@@ -158,8 +158,6 @@
...
@@ -158,8 +158,6 @@
#define PYBIND11_BYTES_SIZE PyBytes_Size
#define PYBIND11_BYTES_SIZE PyBytes_Size
#define PYBIND11_LONG_CHECK(o) PyLong_Check(o)
#define PYBIND11_LONG_CHECK(o) PyLong_Check(o)
#define PYBIND11_LONG_AS_LONGLONG(o) PyLong_AsLongLong(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_BYTES_NAME "bytes"
#define PYBIND11_STRING_NAME "str"
#define PYBIND11_STRING_NAME "str"
#define PYBIND11_SLICE_OBJECT PyObject
#define PYBIND11_SLICE_OBJECT PyObject
...
@@ -182,8 +180,6 @@
...
@@ -182,8 +180,6 @@
#define PYBIND11_BYTES_SIZE PyString_Size
#define PYBIND11_BYTES_SIZE PyString_Size
#define PYBIND11_LONG_CHECK(o) (PyInt_Check(o) || PyLong_Check(o))
#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_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_BYTES_NAME "str"
#define PYBIND11_STRING_NAME "unicode"
#define PYBIND11_STRING_NAME "unicode"
#define PYBIND11_SLICE_OBJECT PySliceObject
#define PYBIND11_SLICE_OBJECT PySliceObject
...
@@ -381,18 +377,20 @@ constexpr size_t instance_simple_holder_in_ptrs() {
...
@@ -381,18 +377,20 @@ constexpr size_t instance_simple_holder_in_ptrs() {
struct
type_info
;
struct
type_info
;
struct
value_and_holder
;
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')
/// The 'instance' type which needs to be standard layout (need to be able to use 'offsetof')
struct
instance
{
struct
instance
{
PyObject_HEAD
PyObject_HEAD
/// Storage for pointers and holder; see simple_layout, below, for a description
/// Storage for pointers and holder; see simple_layout, below, for a description
union
{
union
{
void
*
simple_value_holder
[
1
+
instance_simple_holder_in_ptrs
()];
void
*
simple_value_holder
[
1
+
instance_simple_holder_in_ptrs
()];
struct
{
nonsimple_values_and_holders
nonsimple
;
void
**
values_and_holders
;
uint8_t
*
status
;
}
nonsimple
;
};
};
/// Weak references
/// Weak references
(needed for keep alive):
PyObject
*
weakrefs
;
PyObject
*
weakrefs
;
/// If true, the pointer is owned which means we're free to manage it with a holder.
/// If true, the pointer is owned which means we're free to manage it with a holder.
bool
owned
:
1
;
bool
owned
:
1
;
...
@@ -409,10 +407,10 @@ struct instance {
...
@@ -409,10 +407,10 @@ struct instance {
* (which is typically the size of two pointers), or when multiple inheritance is used on the
* (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
* 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
* 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.
* 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
* [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).
* beginning of the [bb...] block (but not independently allocated).
*
*
* Status bits indicate whether the associated holder is constructed (&
* Status bits indicate whether the associated holder is constructed (&
...
@@ -585,11 +583,6 @@ template <typename T, typename... Us> using deferred_t = typename deferred_type<
...
@@ -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
<
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
>
;
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
>
template
<
template
<
typename
...
>
class
Base
>
struct
is_template_base_of_impl
{
struct
is_template_base_of_impl
{
template
<
typename
...
Us
>
static
std
::
true_type
check
(
Base
<
Us
...
>
*
);
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
...
@@ -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
);
}
static
std
::
string
format
()
{
return
std
::
string
(
1
,
c
);
}
};
};
#if !defined(PYBIND11_CPP17)
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
T
,
detail
::
enable_if_t
<
std
::
is_arithmetic
<
T
>::
value
>>::
value
[
2
];
T
,
detail
::
enable_if_t
<
std
::
is_arithmetic
<
T
>::
value
>>::
value
[
2
];
#endif
/// RAII wrapper that temporarily clears any Python error state
/// RAII wrapper that temporarily clears any Python error state
struct
error_scope
{
struct
error_scope
{
PyObject
*
type
,
*
value
,
*
trace
;
PyObject
*
type
,
*
value
,
*
trace
;
...
...
dlib/external/pybind11/include/pybind11/detail/descr.h
View file @
beece207
This diff is collapsed.
Click to expand it.
dlib/external/pybind11/include/pybind11/detail/init.h
View file @
beece207
...
@@ -24,7 +24,7 @@ public:
...
@@ -24,7 +24,7 @@ public:
template
<
typename
>
using
cast_op_type
=
value_and_holder
&
;
template
<
typename
>
using
cast_op_type
=
value_and_holder
&
;
operator
value_and_holder
&
()
{
return
*
value
;
}
operator
value_and_holder
&
()
{
return
*
value
;
}
static
constexpr
auto
name
=
_
<
value_and_holder
>
();
static
PYBIND11_DESCR
name
()
{
return
type_descr
(
_
<
value_and_holder
>
());
}
private
:
private
:
value_and_holder
*
value
=
nullptr
;
value_and_holder
*
value
=
nullptr
;
...
@@ -52,6 +52,16 @@ bool is_alias(Cpp<Class> *ptr) {
...
@@ -52,6 +52,16 @@ bool is_alias(Cpp<Class> *ptr) {
template
<
typename
/*Class*/
>
template
<
typename
/*Class*/
>
constexpr
bool
is_alias
(
void
*
)
{
return
false
;
}
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
// 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
// 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
// constructed from an rvalue reference of the base Cpp type. This means that Alias classes
...
@@ -161,7 +171,7 @@ struct constructor {
...
@@ -161,7 +171,7 @@ struct constructor {
template
<
typename
Class
,
typename
...
Extra
,
enable_if_t
<!
Class
::
has_alias
,
int
>
=
0
>
template
<
typename
Class
,
typename
...
Extra
,
enable_if_t
<!
Class
::
has_alias
,
int
>
=
0
>
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
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
...);
},
is_new_style_constructor
(),
extra
...);
}
}
...
@@ -171,9 +181,9 @@ struct constructor {
...
@@ -171,9 +181,9 @@ struct constructor {
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
if
(
Py_TYPE
(
v_h
.
inst
)
==
v_h
.
type
->
type
)
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
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
...);
},
is_new_style_constructor
(),
extra
...);
}
}
...
@@ -182,7 +192,7 @@ struct constructor {
...
@@ -182,7 +192,7 @@ struct constructor {
!
std
::
is_constructible
<
Cpp
<
Class
>
,
Args
...
>::
value
,
int
>
=
0
>
!
std
::
is_constructible
<
Cpp
<
Class
>
,
Args
...
>::
value
,
int
>
=
0
>
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
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
...);
},
is_new_style_constructor
(),
extra
...);
}
}
};
};
...
@@ -193,7 +203,7 @@ template <typename... Args> struct alias_constructor {
...
@@ -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
>
enable_if_t
<
Class
::
has_alias
&&
std
::
is_constructible
<
Alias
<
Class
>
,
Args
...
>::
value
,
int
>
=
0
>
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
static
void
execute
(
Class
&
cl
,
const
Extra
&
...
extra
)
{
cl
.
def
(
"__init__"
,
[](
value_and_holder
&
v_h
,
Args
...
args
)
{
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
...);
},
is_new_style_constructor
(),
extra
...);
}
}
};
};
...
...
dlib/external/pybind11/include/pybind11/detail/internals.h
View file @
beece207
...
@@ -127,21 +127,21 @@ struct type_info {
...
@@ -127,21 +127,21 @@ struct type_info {
/// Each module locally stores a pointer to the `internals` data. The data
/// Each module locally stores a pointer to the `internals` data. The data
/// itself is shared among modules with the same `PYBIND11_INTERNALS_ID`.
/// itself is shared among modules with the same `PYBIND11_INTERNALS_ID`.
inline
internals
*
&
get_internals_ptr
()
{
inline
internals
*
*&
get_internals_pp
()
{
static
internals
*
internals_ptr
=
nullptr
;
static
internals
*
*
internals_pp
=
nullptr
;
return
internals_p
tr
;
return
internals_p
p
;
}
}
/// Return a reference to the current `internals` data
/// Return a reference to the current `internals` data
PYBIND11_NOINLINE
inline
internals
&
get_internals
()
{
PYBIND11_NOINLINE
inline
internals
&
get_internals
()
{
auto
*
&
internals_ptr
=
get_internals_ptr
();
auto
*
*&
internals_pp
=
get_internals_pp
();
if
(
internals_p
tr
)
if
(
internals_p
p
&&
*
internals_pp
)
return
*
internals_ptr
;
return
*
*
internals_pp
;
constexpr
auto
*
id
=
PYBIND11_INTERNALS_ID
;
constexpr
auto
*
id
=
PYBIND11_INTERNALS_ID
;
auto
builtins
=
handle
(
PyEval_GetBuiltins
());
auto
builtins
=
handle
(
PyEval_GetBuiltins
());
if
(
builtins
.
contains
(
id
)
&&
isinstance
<
capsule
>
(
builtins
[
id
]))
{
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`
// 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
// 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() {
...
@@ -149,7 +149,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
//
//
// libstdc++ doesn't require this (types there are identified only by name)
// libstdc++ doesn't require this (types there are identified only by name)
#if !defined(__GLIBCXX__)
#if !defined(__GLIBCXX__)
internals_ptr
->
registered_exception_translators
.
push_front
(
(
*
internals_pp
)
->
registered_exception_translators
.
push_front
(
[](
std
::
exception_ptr
p
)
->
void
{
[](
std
::
exception_ptr
p
)
->
void
{
try
{
try
{
if
(
p
)
std
::
rethrow_exception
(
p
);
if
(
p
)
std
::
rethrow_exception
(
p
);
...
@@ -160,6 +160,8 @@ PYBIND11_NOINLINE inline internals &get_internals() {
...
@@ -160,6 +160,8 @@ PYBIND11_NOINLINE inline internals &get_internals() {
);
);
#endif
#endif
}
else
{
}
else
{
if
(
!
internals_pp
)
internals_pp
=
new
internals
*
();
auto
*&
internals_ptr
=
*
internals_pp
;
internals_ptr
=
new
internals
();
internals_ptr
=
new
internals
();
#if defined(WITH_THREAD)
#if defined(WITH_THREAD)
PyEval_InitThreads
();
PyEval_InitThreads
();
...
@@ -168,7 +170,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
...
@@ -168,7 +170,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
PyThread_set_key_value
(
internals_ptr
->
tstate
,
tstate
);
PyThread_set_key_value
(
internals_ptr
->
tstate
,
tstate
);
internals_ptr
->
istate
=
tstate
->
interp
;
internals_ptr
->
istate
=
tstate
->
interp
;
#endif
#endif
builtins
[
id
]
=
capsule
(
&
internals_ptr
);
builtins
[
id
]
=
capsule
(
internals_pp
);
internals_ptr
->
registered_exception_translators
.
push_front
(
internals_ptr
->
registered_exception_translators
.
push_front
(
[](
std
::
exception_ptr
p
)
->
void
{
[](
std
::
exception_ptr
p
)
->
void
{
try
{
try
{
...
@@ -192,7 +194,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
...
@@ -192,7 +194,7 @@ PYBIND11_NOINLINE inline internals &get_internals() {
internals_ptr
->
default_metaclass
=
make_default_metaclass
();
internals_ptr
->
default_metaclass
=
make_default_metaclass
();
internals_ptr
->
instance_base
=
make_object_base_type
(
internals_ptr
->
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:
/// 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 @@
...
@@ -17,24 +17,20 @@
# pragma GCC diagnostic push
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
# pragma GCC diagnostic ignored "-Wconversion"
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
# 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
# if __GNUC__ >= 7
# pragma GCC diagnostic ignored "-Wint-in-bool-context"
# pragma GCC diagnostic ignored "-Wint-in-bool-context"
# endif
# endif
#endif
#endif
#include <Eigen/Core>
#include <Eigen/SparseCore>
#if defined(_MSC_VER)
#if defined(_MSC_VER)
# pragma warning(push)
# pragma warning(push)
# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
# 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
#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
// 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
// move constructors that break things. We could detect this an explicitly copy, but an extra copy
// of matrices seems highly undesirable.
// of matrices seems highly undesirable.
...
@@ -185,26 +181,28 @@ template <typename Type_> struct EigenProps {
...
@@ -185,26 +181,28 @@ template <typename Type_> struct EigenProps {
}
}
}
}
static
constexpr
bool
show_writeable
=
is_eigen_dense_map
<
Type
>::
value
&&
is_eigen_mutable_map
<
Type
>::
value
;
static
PYBIND11_DESCR
descriptor
()
{
static
constexpr
bool
show_order
=
is_eigen_dense_map
<
Type
>::
value
;
constexpr
bool
show_writeable
=
is_eigen_dense_map
<
Type
>::
value
&&
is_eigen_mutable_map
<
Type
>::
value
;
static
constexpr
bool
show_c_contiguous
=
show_order
&&
requires_row_major
;
constexpr
bool
show_order
=
is_eigen_dense_map
<
Type
>::
value
;
static
constexpr
bool
show_f_contiguous
=
!
show_c_contiguous
&&
show_order
&&
requires_col_major
;
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_rows
>
(
_
<
(
size_t
)
rows
>
(),
_
(
"m"
))
+
_
(
", "
)
+
_
<
fixed_cols
>
(
_
<
(
size_t
)
cols
>
(),
_
(
"n"
))
+
_
(
", "
)
+
_
<
fixed_cols
>
(
_
<
(
size_t
)
cols
>
(),
_
(
"n"
))
+
_
(
"]"
)
+
_
(
"]"
)
+
// For a reference type (e.g. Ref<MatrixXd>) we have other constraints that might need to be
// For a reference type (e.g. Ref<MatrixXd>) we have other constraints that might need to be
// satisfied: writeable=True (for a mutable reference), and, depending on the map's stride
// satisfied: writeable=True (for a mutable reference), and, depending on the map's stride
// options, possibly f_contiguous or c_contiguous. We include them in the descriptor output
// options, possibly f_contiguous or c_contiguous. We include them in the descriptor output
// to provide some hint as to why a TypeError is occurring (otherwise it can be confusing to
// to provide some hint as to why a TypeError is occurring (otherwise it can be confusing to
// see that a function accepts a 'numpy.ndarray[float64[3,2]]' and an error message that you
// see that a function accepts a 'numpy.ndarray[float64[3,2]]' and an error message that you
// *gave* a numpy.ndarray of the right type and dimensions.
// *gave* a numpy.ndarray of the right type and dimensions.
_
<
show_writeable
>
(
", flags.writeable"
,
""
)
+
_
<
show_writeable
>
(
", flags.writeable"
,
""
)
+
_
<
show_c_contiguous
>
(
", flags.c_contiguous"
,
""
)
+
_
<
show_c_contiguous
>
(
", flags.c_contiguous"
,
""
)
+
_
<
show_f_contiguous
>
(
", flags.f_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,
// Casts an Eigen type to numpy array. If given a base, the numpy array references the src data,
...
@@ -341,7 +339,7 @@ public:
...
@@ -341,7 +339,7 @@ public:
return
cast_impl
(
src
,
policy
,
parent
);
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
;
}
operator
Type
&
()
{
return
value
;
}
operator
Type
&
()
{
return
value
;
}
...
@@ -389,7 +387,7 @@ public:
...
@@ -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
// 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
// types but not bound arguments). We still provide them (with an explicitly delete) so that
...
@@ -534,7 +532,7 @@ public:
...
@@ -534,7 +532,7 @@ public:
}
}
static
handle
cast
(
const
Type
*
src
,
return_value_policy
policy
,
handle
parent
)
{
return
cast
(
*
src
,
policy
,
parent
);
}
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
// 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
// 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>> {
...
@@ -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["
)
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
)
NAMESPACE_END
(
detail
)
...
...
dlib/external/pybind11/include/pybind11/embed.h
View file @
beece207
...
@@ -145,7 +145,7 @@ inline void finalize_interpreter() {
...
@@ -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
// 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()`
// 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().
// 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:
// It could also be stashed in builtins, so look there too:
if
(
builtins
.
contains
(
id
)
&&
isinstance
<
capsule
>
(
builtins
[
id
]))
if
(
builtins
.
contains
(
id
)
&&
isinstance
<
capsule
>
(
builtins
[
id
]))
internals_ptr_ptr
=
capsule
(
builtins
[
id
]);
internals_ptr_ptr
=
capsule
(
builtins
[
id
]);
...
...
dlib/external/pybind11/include/pybind11/functional.h
View file @
beece207
...
@@ -75,8 +75,10 @@ public:
...
@@ -75,8 +75,10 @@ public:
return
cpp_function
(
std
::
forward
<
Func
>
(
f_
),
policy
).
release
();
return
cpp_function
(
std
::
forward
<
Func
>
(
f_
),
policy
).
release
();
}
}
PYBIND11_TYPE_CASTER
(
type
,
_
(
"Callable[["
)
+
concat
(
make_caster
<
Args
>::
name
...)
+
_
(
"], "
)
PYBIND11_TYPE_CASTER
(
type
,
_
(
"Callable[["
)
+
+
make_caster
<
retval_type
>::
name
+
_
(
"]"
));
argument_loader
<
Args
...
>::
arg_names
()
+
_
(
"], "
)
+
make_caster
<
retval_type
>::
name
()
+
_
(
"]"
));
};
};
NAMESPACE_END
(
detail
)
NAMESPACE_END
(
detail
)
...
...
dlib/external/pybind11/include/pybind11/numpy.h
View file @
beece207
...
@@ -250,7 +250,7 @@ template <typename T> struct array_info_scalar {
...
@@ -250,7 +250,7 @@ template <typename T> struct array_info_scalar {
typedef
T
type
;
typedef
T
type
;
static
constexpr
bool
is_array
=
false
;
static
constexpr
bool
is_array
=
false
;
static
constexpr
bool
is_empty
=
false
;
static
constexpr
bool
is_empty
=
false
;
static
constexpr
auto
extents
=
_
(
""
);
static
PYBIND11_DESCR
extents
()
{
return
_
(
""
);
}
static
void
append_extents
(
list
&
/* shape */
)
{
}
static
void
append_extents
(
list
&
/* shape */
)
{
}
};
};
// Computes underlying type and a comma-separated list of extents for array
// 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>> {
...
@@ -269,9 +269,15 @@ template <typename T, size_t N> struct array_info<std::array<T, N>> {
array_info
<
T
>::
append_extents
(
shape
);
array_info
<
T
>::
append_extents
(
shape
);
}
}
static
constexpr
auto
extents
=
_
<
array_info
<
T
>::
is_array
>
(
template
<
typename
T2
=
T
,
enable_if_t
<!
array_info
<
T2
>::
is_array
,
int
>
=
0
>
concat
(
_
<
N
>
(),
array_info
<
T
>::
extents
),
_
<
N
>
()
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
// For numpy we have special handling for arrays of characters, so we don't include
// the size in the array extents.
// the size in the array extents.
...
@@ -440,7 +446,7 @@ public:
...
@@ -440,7 +446,7 @@ public:
/// This is essentially the same as calling numpy.dtype(args) in Python.
/// This is essentially the same as calling numpy.dtype(args) in Python.
static
dtype
from_args
(
object
args
)
{
static
dtype
from_args
(
object
args
)
{
PyObject
*
ptr
=
nullptr
;
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
();
throw
error_already_set
();
return
reinterpret_steal
<
dtype
>
(
ptr
);
return
reinterpret_steal
<
dtype
>
(
ptr
);
}
}
...
@@ -940,9 +946,9 @@ struct format_descriptor<T, detail::enable_if_t<std::is_enum<T>::value>> {
...
@@ -940,9 +946,9 @@ struct format_descriptor<T, detail::enable_if_t<std::is_enum<T>::value>> {
template
<
typename
T
>
template
<
typename
T
>
struct
format_descriptor
<
T
,
detail
::
enable_if_t
<
detail
::
array_info
<
T
>::
is_array
>>
{
struct
format_descriptor
<
T
,
detail
::
enable_if_t
<
detail
::
array_info
<
T
>::
is_array
>>
{
static
std
::
string
format
()
{
static
std
::
string
format
()
{
using
detail
::
_
;
using
namespace
detail
;
static
constexpr
auto
extents
=
_
(
"("
)
+
detail
::
array_info
<
T
>::
extents
+
_
(
")"
);
PYBIND11_DESCR
extents
=
_
(
"("
)
+
array_info
<
T
>::
extents
()
+
_
(
")"
);
return
extents
.
text
+
format_descriptor
<
detail
::
remove_all_extents_t
<
T
>>::
format
();
return
extents
.
text
()
+
format_descriptor
<
remove_all_extents_t
<
T
>>::
format
();
}
}
};
};
...
@@ -961,7 +967,7 @@ struct pyobject_caster<array_t<T, ExtraFlags>> {
...
@@ -961,7 +967,7 @@ struct pyobject_caster<array_t<T, ExtraFlags>> {
static
handle
cast
(
const
handle
&
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
static
handle
cast
(
const
handle
&
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
return
src
.
inc_ref
();
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
>
template
<
typename
T
>
...
@@ -971,34 +977,7 @@ struct compare_buffer_info<T, detail::enable_if_t<detail::is_pod_struct<T>::valu
...
@@ -971,34 +977,7 @@ struct compare_buffer_info<T, detail::enable_if_t<detail::is_pod_struct<T>::valu
}
}
};
};
template
<
typename
T
,
typename
=
void
>
template
<
typename
T
>
struct
npy_format_descriptor
<
T
,
enable_if_t
<
satisfies_any_of
<
T
,
std
::
is_arithmetic
,
is_complex
>::
value
>>
{
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
>
{
private
:
private
:
// NB: the order here must match the one in common.h
// NB: the order here must match the one in common.h
constexpr
static
const
int
values
[
15
]
=
{
constexpr
static
const
int
values
[
15
]
=
{
...
@@ -1017,10 +996,25 @@ public:
...
@@ -1017,10 +996,25 @@ public:
return
reinterpret_borrow
<
pybind11
::
dtype
>
(
ptr
);
return
reinterpret_borrow
<
pybind11
::
dtype
>
(
ptr
);
pybind11_fail
(
"Unsupported buffer format!"
);
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 \
#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)); }
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
<
char
[
N
]
>
{
PYBIND11_DECL_CHAR_FMT
};
template
<
size_t
N
>
struct
npy_format_descriptor
<
std
::
array
<
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:
...
@@ -1032,7 +1026,7 @@ private:
public
:
public
:
static_assert
(
!
array_info
<
T
>::
is_empty
,
"Zero-sized arrays are not supported"
);
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
()
{
static
pybind11
::
dtype
dtype
()
{
list
shape
;
list
shape
;
array_info
<
T
>::
append_extents
(
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>
...
@@ -1044,7 +1038,7 @@ template<typename T> struct npy_format_descriptor<T, enable_if_t<std::is_enum<T>
private
:
private
:
using
base_descr
=
npy_format_descriptor
<
typename
std
::
underlying_type
<
T
>::
type
>
;
using
base_descr
=
npy_format_descriptor
<
typename
std
::
underlying_type
<
T
>::
type
>
;
public
:
public
:
static
constexpr
auto
name
=
base_descr
::
name
;
static
PYBIND11_DESCR
name
()
{
return
base_descr
::
name
();
}
static
pybind11
::
dtype
dtype
()
{
return
base_descr
::
dtype
();
}
static
pybind11
::
dtype
dtype
()
{
return
base_descr
::
dtype
();
}
};
};
...
@@ -1119,7 +1113,7 @@ inline PYBIND11_NOINLINE void register_structured_dtype(
...
@@ -1119,7 +1113,7 @@ inline PYBIND11_NOINLINE void register_structured_dtype(
template
<
typename
T
,
typename
SFINAE
>
struct
npy_format_descriptor
{
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_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
()
{
static
pybind11
::
dtype
dtype
()
{
return
reinterpret_borrow
<
pybind11
::
dtype
>
(
dtype_ptr
());
return
reinterpret_borrow
<
pybind11
::
dtype
>
(
dtype_ptr
());
...
@@ -1564,7 +1558,9 @@ vectorize_extractor(const Func &f, Return (*) (Args ...)) {
...
@@ -1564,7 +1558,9 @@ vectorize_extractor(const Func &f, Return (*) (Args ...)) {
}
}
template
<
typename
T
,
int
Flags
>
struct
handle_type_name
<
array_t
<
T
,
Flags
>>
{
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
)
NAMESPACE_END
(
detail
)
...
...
dlib/external/pybind11/include/pybind11/pybind11.h
View file @
beece207
This diff is collapsed.
Click to expand it.
dlib/external/pybind11/include/pybind11/pytypes.h
View file @
beece207
...
@@ -295,9 +295,6 @@ public:
...
@@ -295,9 +295,6 @@ public:
PyErr_Fetch
(
&
type
.
ptr
(),
&
value
.
ptr
(),
&
trace
.
ptr
());
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
();
inline
~
error_already_set
();
/// Give the currently-held error back to Python, if any. If there is currently a Python error
/// 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 @@
...
@@ -30,7 +30,8 @@
# define PYBIND11_HAS_OPTIONAL 1
# define PYBIND11_HAS_OPTIONAL 1
# endif
# endif
// std::experimental::optional (but not allowed in c++11 mode)
// 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>
# include <experimental/optional>
# define PYBIND11_HAS_EXP_OPTIONAL 1
# define PYBIND11_HAS_EXP_OPTIONAL 1
# endif
# endif
...
@@ -91,7 +92,7 @@ template <typename Type, typename Key> struct set_caster {
...
@@ -91,7 +92,7 @@ template <typename Type, typename Key> struct set_caster {
return
s
.
release
();
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
{
template
<
typename
Type
,
typename
Key
,
typename
Value
>
struct
map_caster
{
...
@@ -127,7 +128,7 @@ 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
();
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
{
template
<
typename
Type
,
typename
Value
>
struct
list_caster
{
...
@@ -168,7 +169,7 @@ public:
...
@@ -168,7 +169,7 @@ public:
return
l
.
release
();
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
>>
template
<
typename
Type
,
typename
Alloc
>
struct
type_caster
<
std
::
vector
<
Type
,
Alloc
>>
...
@@ -222,7 +223,7 @@ public:
...
@@ -222,7 +223,7 @@ public:
return
l
.
release
();
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
>>
template
<
typename
Type
,
size_t
Size
>
struct
type_caster
<
std
::
array
<
Type
,
Size
>>
...
@@ -268,7 +269,7 @@ template<typename T> struct optional_caster {
...
@@ -268,7 +269,7 @@ template<typename T> struct optional_caster {
return
true
;
return
true
;
}
}
PYBIND11_TYPE_CASTER
(
T
,
_
(
"Optional["
)
+
value_conv
::
name
+
_
(
"]"
));
PYBIND11_TYPE_CASTER
(
T
,
_
(
"Optional["
)
+
value_conv
::
name
()
+
_
(
"]"
));
};
};
#if PYBIND11_HAS_OPTIONAL
#if PYBIND11_HAS_OPTIONAL
...
@@ -348,7 +349,7 @@ struct variant_caster<V<Ts...>> {
...
@@ -348,7 +349,7 @@ struct variant_caster<V<Ts...>> {
}
}
using
Type
=
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
#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&&.
...
@@ -587,7 +587,7 @@ class_<Map, holder_type> bind_map(handle scope, const std::string &name, Args&&.
auto
it
=
m
.
find
(
k
);
auto
it
=
m
.
find
(
k
);
if
(
it
==
m
.
end
())
if
(
it
==
m
.
end
())
throw
key_error
();
throw
key_error
();
return
m
.
erase
(
it
);
m
.
erase
(
it
);
}
}
);
);
...
...
dlib/external/pybind11/tools/FindPythonLibsNew.cmake
View file @
beece207
# - Find python libraries
# - 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.
# FindPythonInterp provides.
# This code sets the following variables:
# 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