liuxiaolong
2021-07-20 58d904a328c0d849769b483e901a0be9426b8209
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#ifndef BOOST_LEAF_DETAIL_PRINT_HPP_INCLUDED
#define BOOST_LEAF_DETAIL_PRINT_HPP_INCLUDED
 
// Copyright (c) 2018-2020 Emil Dotchevski and Reverge Studios, Inc.
 
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
#ifndef BOOST_LEAF_ENABLE_WARNINGS
#   if defined(__clang__)
#       pragma clang system_header
#   elif (__GNUC__*100+__GNUC_MINOR__>301)
#       pragma GCC system_header
#   elif defined(_MSC_VER)
#       pragma warning(push,1)
#   endif
#endif
 
#include <boost/leaf/detail/optional.hpp>
#include <iosfwd>
#include <cstring>
 
namespace boost { namespace leaf {
 
    namespace leaf_detail
    {
        template <int N>
        BOOST_LEAF_CONSTEXPR inline char const * check_prefix( char const * t, char const (&prefix)[N] )
        {
            return std::strncmp(t,prefix,sizeof(prefix)-1)==0 ? t+sizeof(prefix)-1 : t;
        }
    }
 
    template <class Name>
    inline char const * type()
    {
        using leaf_detail::check_prefix;
    char const * t =
#ifdef __FUNCSIG__
        __FUNCSIG__;
#else
        __PRETTY_FUNCTION__;
#endif
#if defined(__clang__)
        BOOST_LEAF_ASSERT(check_prefix(t,"const char *boost::leaf::type() ")==t+32);
        return t+32;
#elif defined(__GNUC__)
        BOOST_LEAF_ASSERT(check_prefix(t,"const char* boost::leaf::type() ")==t+32);
        return t+32;
#else
        char const * clang_style = check_prefix(t,"const char *boost::leaf::type() ");
        if( clang_style!=t )
            return clang_style;
        char const * gcc_style = check_prefix(t,"const char* boost::leaf::type() ");
        if( gcc_style!=t )
            return gcc_style;
#endif
        return t;
    }
 
    namespace leaf_detail
    {
        template <class T, class E = void>
        struct is_printable: std::false_type
        {
        };
 
        template <class T>
        struct is_printable<T, decltype(std::declval<std::ostream&>()<<std::declval<T const &>(), void())>: std::true_type
        {
        };
 
        ////////////////////////////////////////
 
        template <class T, class E = void>
        struct has_printable_member_value: std::false_type
        {
        };
 
        template <class T>
        struct has_printable_member_value<T, decltype(std::declval<std::ostream&>()<<std::declval<T const &>().value, void())>: std::true_type
        {
        };
 
        ////////////////////////////////////////
 
        template <class Wrapper, bool WrapperPrintable=is_printable<Wrapper>::value, bool ValuePrintable=has_printable_member_value<Wrapper>::value>
        struct diagnostic;
 
        template <class Wrapper, bool ValuePrintable>
        struct diagnostic<Wrapper, true, ValuePrintable>
        {
            static constexpr bool is_invisible = false;
            static void print( std::ostream & os, Wrapper const & x )
            {
                os << x;
            }
        };
 
        template <class Wrapper>
        struct diagnostic<Wrapper, false, true>
        {
            static constexpr bool is_invisible = false;
            static void print( std::ostream & os, Wrapper const & x )
            {
                os << type<Wrapper>() << ": " << x.value;
            }
        };
 
        template <class Wrapper>
        struct diagnostic<Wrapper, false, false>
        {
            static constexpr bool is_invisible = false;
            static void print( std::ostream & os, Wrapper const & )
            {
                os << type<Wrapper>() << ": {Non-Printable}";
            }
        };
 
#ifndef BOOST_LEAF_NO_EXCEPTIONS
        template <>
        struct diagnostic<std::exception_ptr, false, false>
        {
            static constexpr bool is_invisible = true;
            BOOST_LEAF_CONSTEXPR static void print( std::ostream &, std::exception_ptr const & )
            {
            }
        };
#endif
    }
 
} }
 
#endif