14 PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
15 PYBIND11_NAMESPACE_BEGIN(detail)
17 #if !defined(_MSC_VER)
18 # define PYBIND11_DESCR_CONSTEXPR static constexpr
20 # define PYBIND11_DESCR_CONSTEXPR const
24 template <
size_t N,
typename... Ts>
28 constexpr
descr() : text{
'\0'} { }
29 constexpr descr(
char const (&s)[N+1]) : descr(s, make_index_sequence<N>()) { }
31 template <
size_t... Is>
34 template <
typename... Chars>
35 constexpr descr(
char c, Chars... cs) : text{c,
static_cast<char>(cs)...,
'\0'} { }
37 static constexpr std::array<
const std::type_info *,
sizeof...(Ts) + 1> types() {
38 return {{&
typeid(Ts)...,
nullptr}};
42 template <
size_t N1,
size_t N2,
typename... Ts1,
typename... Ts2,
size_t... Is1,
size_t... Is2>
45 return {a.text[Is1]..., b.text[Is2]...};
48 template <
size_t N1,
size_t N2,
typename... Ts1,
typename... Ts2>
50 return plus_impl(a, b, make_index_sequence<N1>(), make_index_sequence<N2>());
54 constexpr descr<N - 1> _(
char const(&text)[N]) {
return descr<N - 1>(text); }
55 constexpr
descr<0> _(
char const(&)[1]) {
return {}; }
58 template <
size_t...Digits>
struct int_to_str<0, Digits...> {
59 static constexpr
auto digits = descr<
sizeof...(Digits)>((
'0' + Digits)...);
63 template <
bool B,
size_t N1,
size_t N2>
64 constexpr enable_if_t<B, descr<N1 - 1>> _(
char const(&text1)[N1],
char const(&)[N2]) {
67 template <
bool B,
size_t N1,
size_t N2>
68 constexpr enable_if_t<!B, descr<N2 - 1>> _(
char const(&)[N1],
char const(&text2)[N2]) {
72 template <
bool B,
typename T1,
typename T2>
73 constexpr enable_if_t<B, T1> _(
const T1 &d,
const T2 &) {
return d; }
74 template <
bool B,
typename T1,
typename T2>
75 constexpr enable_if_t<!B, T2> _(
const T1 &,
const T2 &d) {
return d; }
78 return int_to_str<Size / 10, Size % 10>::digits;
81 template <
typename Type> constexpr
descr<1, Type> _() {
return {
'%'}; }
83 constexpr
descr<0> concat() {
return {}; }
85 template <
size_t N,
typename... Ts>
86 constexpr descr<N, Ts...> concat(
const descr<N, Ts...> &descr) {
return descr; }
88 template <
size_t N,
typename... Ts,
typename... Args>
91 return d + _(
", ") + concat(
args...);
94 template <
size_t N,
typename... Ts>
95 constexpr descr<N + 2, Ts...> type_descr(
const descr<N, Ts...> &descr) {
96 return _(
"{") + descr + _(
"}");
99 PYBIND11_NAMESPACE_END(detail)
100 PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)