Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
pybind11
Commits
356bf94a
Commit
356bf94a
authored
Sep 09, 2016
by
Wenzel Jakob
Committed by
GitHub
Sep 09, 2016
Browse files
Merge pull request #401 from jagerman/templates-simplification
Small template simplifications
parents
260b26b3
5aa2cd5e
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
12 additions
and
17 deletions
+12
-17
include/pybind11/common.h
include/pybind11/common.h
+12
-17
No files found.
include/pybind11/common.h
View file @
356bf94a
...
@@ -342,22 +342,24 @@ constexpr size_t constexpr_sum() { return 0; }
...
@@ -342,22 +342,24 @@ constexpr size_t constexpr_sum() { return 0; }
template
<
typename
T
,
typename
...
Ts
>
template
<
typename
T
,
typename
...
Ts
>
constexpr
size_t
constexpr_sum
(
T
n
,
Ts
...
ns
)
{
return
size_t
{
n
}
+
constexpr_sum
(
ns
...);
}
constexpr
size_t
constexpr_sum
(
T
n
,
Ts
...
ns
)
{
return
size_t
{
n
}
+
constexpr_sum
(
ns
...);
}
//
/ Return true if all/any Ts satify P
redicate
<T>
//
Counts the number of types in the template parameter pack matching the p
redicate
#if !defined(_MSC_VER)
#if !defined(_MSC_VER)
template
<
template
<
typename
>
class
Predicate
,
typename
...
Ts
>
template
<
template
<
typename
>
class
Predicate
,
typename
...
Ts
>
using
all_of_t
=
bool_constant
<
(
constexpr_sum
(
Predicate
<
Ts
>::
value
...)
==
sizeof
...(
Ts
))
>
;
using
count_t
=
std
::
integral_constant
<
size_t
,
constexpr_sum
(
Predicate
<
Ts
>::
value
...)
>
;
template
<
template
<
typename
>
class
Predicate
,
typename
...
Ts
>
using
any_of_t
=
bool_constant
<
(
constexpr_sum
(
Predicate
<
Ts
>::
value
...)
>
0
)
>
;
#else
#else
// MSVC workaround (2015 Update 3 has issues with some member type aliases and constexpr)
// MSVC workaround (2015 Update 3 has issues with some member type aliases and constexpr)
template
<
template
<
typename
>
class
P
,
typename
...
>
struct
all_of_t
:
std
::
true_type
{
};
template
<
template
<
typename
>
class
Predicate
,
typename
...
Ts
>
struct
count_t
;
template
<
template
<
typename
>
class
P
,
typename
T
,
typename
...
Ts
>
template
<
template
<
typename
>
class
Predicate
>
struct
count_t
<
Predicate
>
:
std
::
integral_constant
<
size_t
,
0
>
{};
struct
all_of_t
<
P
,
T
,
Ts
...
>
:
conditional_t
<
P
<
T
>::
value
,
all_of_t
<
P
,
Ts
...
>
,
std
::
false_type
>
{
};
template
<
template
<
typename
>
class
Predicate
,
class
T
,
class
...
Ts
>
template
<
template
<
typename
>
class
P
,
typename
...
>
struct
any_of_t
:
std
::
false_type
{
};
struct
count_t
<
Predicate
,
T
,
Ts
...
>
:
std
::
integral_constant
<
size_t
,
Predicate
<
T
>::
value
+
count_t
<
Predicate
,
Ts
...
>::
value
>
{};
template
<
template
<
typename
>
class
P
,
typename
T
,
typename
...
Ts
>
struct
any_of_t
<
P
,
T
,
Ts
...
>
:
conditional_t
<
P
<
T
>::
value
,
std
::
true_type
,
any_of_t
<
P
,
Ts
...
>>
{
};
#endif
#endif
/// Return true if all/any Ts satify Predicate<T>
template
<
template
<
typename
>
class
Predicate
,
typename
...
Ts
>
using
all_of_t
=
bool_constant
<
(
count_t
<
Predicate
,
Ts
...
>::
value
==
sizeof
...(
Ts
))
>
;
template
<
template
<
typename
>
class
Predicate
,
typename
...
Ts
>
using
any_of_t
=
bool_constant
<
(
count_t
<
Predicate
,
Ts
...
>::
value
>
0
)
>
;
// Extracts the first type from the template parameter pack matching the predicate, or Default if none match.
// Extracts the first type from the template parameter pack matching the predicate, or Default if none match.
template
<
template
<
class
>
class
Predicate
,
class
Default
,
class
...
Ts
>
struct
first_of
;
template
<
template
<
class
>
class
Predicate
,
class
Default
,
class
...
Ts
>
struct
first_of
;
template
<
template
<
class
>
class
Predicate
,
class
Default
>
struct
first_of
<
Predicate
,
Default
>
{
template
<
template
<
class
>
class
Predicate
,
class
Default
>
struct
first_of
<
Predicate
,
Default
>
{
...
@@ -373,13 +375,6 @@ struct first_of<Predicate, Default, T, Ts...> {
...
@@ -373,13 +375,6 @@ struct first_of<Predicate, Default, T, Ts...> {
};
};
template
<
template
<
class
>
class
Predicate
,
class
Default
,
class
...
T
>
using
first_of_t
=
typename
first_of
<
Predicate
,
Default
,
T
...
>::
type
;
template
<
template
<
class
>
class
Predicate
,
class
Default
,
class
...
T
>
using
first_of_t
=
typename
first_of
<
Predicate
,
Default
,
T
...
>::
type
;
// Counts the number of types in the template parameter pack matching the predicate
template
<
template
<
typename
>
class
Predicate
,
typename
...
Ts
>
struct
count_t
;
template
<
template
<
typename
>
class
Predicate
>
struct
count_t
<
Predicate
>
:
std
::
integral_constant
<
size_t
,
0
>
{};
template
<
template
<
typename
>
class
Predicate
,
class
T
,
class
...
Ts
>
struct
count_t
<
Predicate
,
T
,
Ts
...
>
:
std
::
integral_constant
<
size_t
,
Predicate
<
T
>::
value
+
count_t
<
Predicate
,
Ts
...
>::
value
>
{};
/// Defer the evaluation of type T until types Us are instantiated
/// Defer the evaluation of type T until types Us are instantiated
template
<
typename
T
,
typename
...
/*Us*/
>
struct
deferred_type
{
using
type
=
T
;
};
template
<
typename
T
,
typename
...
/*Us*/
>
struct
deferred_type
{
using
type
=
T
;
};
template
<
typename
T
,
typename
...
Us
>
using
deferred_t
=
typename
deferred_type
<
T
,
Us
...
>::
type
;
template
<
typename
T
,
typename
...
Us
>
using
deferred_t
=
typename
deferred_type
<
T
,
Us
...
>::
type
;
...
...
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