Blame view

3rdparty/boost_1_81_0/boost/describe/enum.hpp 3.92 KB
598bfd3f   Hu Chunming   提交_GLIBCXX_USE_CX...
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
  #ifndef BOOST_DESCRIBE_ENUM_HPP_INCLUDED
  #define BOOST_DESCRIBE_ENUM_HPP_INCLUDED
  
  // Copyright 2020 Peter Dimov
  // Distributed under the Boost Software License, Version 1.0.
  // https://www.boost.org/LICENSE_1_0.txt
  
  #include <boost/describe/detail/config.hpp>
  
  #if !defined(BOOST_DESCRIBE_CXX14)
  
  #define BOOST_DESCRIBE_ENUM(E, ...)
  #define BOOST_DESCRIBE_NESTED_ENUM(E, ...)
  
  #else
  
  #include <boost/describe/detail/pp_for_each.hpp>
  #include <boost/describe/detail/list.hpp>
  #include <type_traits>
  
  namespace boost
  {
  namespace describe
  {
  namespace detail
  {
  
  template<class D> struct enum_descriptor
  {
      // can't use auto here because of the need to supply the definitions below
      static constexpr decltype(D::value()) value = D::value();
      static constexpr decltype(D::name()) name = D::name();
  };
  
  // GCC requires these definitions
  template<class D> constexpr decltype(D::value()) enum_descriptor<D>::value;
  template<class D> constexpr decltype(D::name()) enum_descriptor<D>::name;
  
  template<class... T> auto enum_descriptor_fn_impl( int, T... )
  {
      return list<enum_descriptor<T>...>();
  }
  
  #define BOOST_DESCRIBE_ENUM_BEGIN(E) \
      inline auto boost_enum_descriptor_fn( E** ) \
      { return boost::describe::detail::enum_descriptor_fn_impl( 0
  
  #define BOOST_DESCRIBE_ENUM_ENTRY(E, e) , []{ struct _boost_desc { \
      static constexpr auto value() noexcept { return E::e; } \
      static constexpr auto name() noexcept { return #e; } }; return _boost_desc(); }()
  
  #define BOOST_DESCRIBE_ENUM_END(E) ); }
  
  } // namespace detail
  
  #if defined(_MSC_VER) && !defined(__clang__)
  
  #define BOOST_DESCRIBE_ENUM(E, ...) \
      namespace should_use_BOOST_DESCRIBE_NESTED_ENUM {} \
      static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_ENUM should only be used with enums"); \
      BOOST_DESCRIBE_ENUM_BEGIN(E) \
      BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, __VA_ARGS__) \
      BOOST_DESCRIBE_ENUM_END(E)
  
  #define BOOST_DESCRIBE_NESTED_ENUM(E, ...) \
      static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_NESTED_ENUM should only be used with enums"); \
      friend BOOST_DESCRIBE_ENUM_BEGIN(E) \
      BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, __VA_ARGS__) \
      BOOST_DESCRIBE_ENUM_END(E)
  
  #else
  
  #define BOOST_DESCRIBE_ENUM(E, ...) \
      namespace should_use_BOOST_DESCRIBE_NESTED_ENUM {} \
      static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_ENUM should only be used with enums"); \
      BOOST_DESCRIBE_MAYBE_UNUSED BOOST_DESCRIBE_ENUM_BEGIN(E) \
      BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, ##__VA_ARGS__) \
      BOOST_DESCRIBE_ENUM_END(E)
  
  #define BOOST_DESCRIBE_NESTED_ENUM(E, ...) \
      static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_NESTED_ENUM should only be used with enums"); \
      BOOST_DESCRIBE_MAYBE_UNUSED friend BOOST_DESCRIBE_ENUM_BEGIN(E) \
      BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, ##__VA_ARGS__) \
      BOOST_DESCRIBE_ENUM_END(E)
  
  #endif
  
  } // namespace describe
  } // namespace boost
  
  #endif // defined(BOOST_DESCRIBE_CXX14)
  
  #if defined(_MSC_VER) && !defined(__clang__)
  
  #define BOOST_DEFINE_ENUM(E, ...) enum E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
  #define BOOST_DEFINE_ENUM_CLASS(E, ...) enum class E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
  
  #define BOOST_DEFINE_FIXED_ENUM(E, Base, ...) enum E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
  #define BOOST_DEFINE_FIXED_ENUM_CLASS(E, Base, ...) enum class E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
  
  #else
  
  #define BOOST_DEFINE_ENUM(E, ...) enum E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
  #define BOOST_DEFINE_ENUM_CLASS(E, ...) enum class E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
  
  #define BOOST_DEFINE_FIXED_ENUM(E, Base, ...) enum E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
  #define BOOST_DEFINE_FIXED_ENUM_CLASS(E, Base, ...) enum class E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
  
  #endif
  
  #endif // #ifndef BOOST_DESCRIBE_ENUM_HPP_INCLUDED