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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
 
//  (C) Copyright Edward Diener 2019
//  Use, modification and distribution are subject to 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).
 
#if !defined(BOOST_TTI_HAS_ENUM_HPP)
#define BOOST_TTI_HAS_ENUM_HPP
 
#include <boost/config.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/gen/has_enum_gen.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#include <boost/tti/detail/denum.hpp>
#include <boost/tti/detail/ddeftype.hpp>
 
/*
 
  The succeeding comments in this file are in doxygen format.
 
*/
 
/** \file
*/
 
/// A macro which expands to a metafunction which tests whether an inner enum with a particular name exists.
/**
 
    BOOST_TTI_TRAIT_HAS_ENUM is a macro which expands to a metafunction.
    The metafunction tests whether an inner enum with a particular name exists
    and, optionally, whether an MPL lambda expression invoked with the inner enum
    is true or not. The macro takes the form of BOOST_TTI_TRAIT_HAS_ENUM(trait,name) where
    
    trait = the name of the metafunction <br/>
    name  = the name of the inner enum. The name can be that of an enum or, in C++11 on up, an enum class.
 
    BOOST_TTI_TRAIT_HAS_ENUM generates a metafunction called "trait" where 'trait' is the macro parameter.
    
  @code
  
              template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_U>
              struct trait
                {
                static const value = unspecified;
                typedef mpl::bool_<true-or-false> type;
                };
 
              The metafunction types and return:
    
                BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
                                 The enclosing type can be a class, struct, or union.
                
                BOOST_TTI_TP_U = (optional) An optional template parameter, defaulting to a marker type.
                                   If specified it is an MPL lambda expression which is invoked 
                                   with the inner enum found and must return a constant boolean 
                                   value.
                                   
                returns = 'value' depends on whether or not the optional BOOST_TTI_TP_U is specified.
                
                          If BOOST_TTI_TP_U is not specified, then 'value' is true if the 'name' enum
                          exists within the enclosing type BOOST_TTI_TP_T; otherwise 'value' is false.
                          
                          If BOOST_TTI_TP_U is specified , then 'value' is true if the 'name' enum exists 
                          within the enclosing type BOOST_TTI_TP_T and the MPL lambda expression as specified 
                          by BOOST_TTI_TP_U, invoked by passing the actual inner enum of 'name', returns 
                          a 'value' of true; otherwise 'value' is false.
                             
                          The action taken with BOOST_TTI_TP_U occurs only when the 'name' enum exists 
                          within the enclosing type BOOST_TTI_TP_T.
                             
  @endcode
  
  Example usage:
  
  @code
  
  BOOST_TTI_TRAIT_HAS_ENUM(LookFor,MyType) generates the metafunction LookFor in the current scope
  to look for an inner enum called MyType.
  
  LookFor<EnclosingType>::value is true if MyType is an inner enum of EnclosingType, otherwise false.
  
  LookFor<EnclosingType,ALambdaExpression>::value is true if MyType is an inner enum of EnclosingType
    and invoking ALambdaExpression with the inner enum returns a value of true, otherwise false.
    
  A popular use of the optional MPL lambda expression is to check whether the enum found is the same  
  as another type, when the enum found is a typedef. In that case our example would be:
  
  LookFor<EnclosingType,boost::is_same<_,SomeOtherType> >::value is true if MyType is an inner enum
    of EnclosingType and is the same type as SomeOtherType.
  
  @endcode
  
*/
#define BOOST_TTI_TRAIT_HAS_ENUM(trait,name) \
  BOOST_TTI_DETAIL_TRAIT_HAS_ENUM(trait,name) \
  template \
    < \
    class BOOST_TTI_TP_T, \
    class BOOST_TTI_TP_U = BOOST_TTI_NAMESPACE::detail::deftype \
    > \
  struct trait \
    { \
    typedef typename \
    BOOST_PP_CAT(trait,_detail_enum)<BOOST_TTI_TP_T,BOOST_TTI_TP_U>::type type; \
    BOOST_STATIC_CONSTANT(bool,value=type::value); \
    }; \
/**/
 
/// A macro which expands to a metafunction which tests whether an inner enum with a particular name exists.
/**
 
    BOOST_TTI_HAS_ENUM is a macro which expands to a metafunction.
    The metafunction tests whether an inner enum with a particular name exists
    and, optionally, whether an MPL lambda expression invoked with the inner enum 
    is true or not. The macro takes the form of BOOST_TTI_HAS_ENUM(name) where
    
    name  = the name of the inner enum. The name can be that of an enum or, in C++11 on up, an enum class.
 
    BOOST_TTI_HAS_ENUM generates a metafunction called "has_enum_'name'" where 'name' is the macro parameter.
    
  @code
  
              template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_U>
              struct has_enum_'name'
                {
                static const value = unspecified;
                typedef mpl::bool_<true-or-false> type;
                };
 
              The metafunction types and return:
    
                BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
                                 The enclosing type can be a class, struct, or union.
                
                BOOST_TTI_TP_U = (optional) An optional template parameter, defaulting to a marker type.
                                   If specified it is an MPL lambda expression which is invoked 
                                   with the inner enum found and must return a constant boolean 
                                   value.
                                   
                returns = 'value' depends on whether or not the optional BOOST_TTI_TP_U is specified.
                
                          If BOOST_TTI_TP_U is not specified, then 'value' is true if the 'name' enum 
                          exists within the enclosing type BOOST_TTI_TP_T; otherwise 'value' is false.
                          
                          If BOOST_TTI_TP_U is specified, then 'value' is true if the 'name' enum exists 
                          within the enclosing type BOOST_TTI_TP_T and the MPL lambda expression as specified 
                          by BOOST_TTI_TP_U, invoked by passing the actual inner enum of 'name', returns 
                          a 'value' of true; otherwise 'value' is false.
                             
                          The action taken with BOOST_TTI_TP_U occurs only when the 'name' enum exists 
                          within the enclosing type BOOST_TTI_TP_T.
                             
  @endcode
  
  Example usage:
  
  @code
  
  BOOST_TTI_HAS_ENUM(MyType) generates the metafunction has_enum_MyType in the current scope
  to look for an inner enum called MyType.
  
  has_enum_MyType<EnclosingType>::value is true if MyType is an inner enum of EnclosingType, otherwise false.
  
  has_class_MyType<EnclosingType,ALambdaExpression>::value is true if MyType is an inner enum of EnclosingType
    and invoking ALambdaExpression with the inner enum returns a value of true, otherwise false.
  
  A popular use of the optional MPL lambda expression is to check whether the enum found is the same  
  as another type, when the enum found is a typedef. In that case our example would be:
  
  has_enum_MyType<EnclosingType,boost::is_same<_,SomeOtherType> >::value is true if MyType is an inner enum
    of EnclosingType and is the same type as SomeOtherType.
  
  @endcode
  
*/
#define BOOST_TTI_HAS_ENUM(name) \
  BOOST_TTI_TRAIT_HAS_ENUM \
  ( \
  BOOST_TTI_HAS_ENUM_GEN(name), \
  name \
  ) \
/**/
 
#endif // BOOST_TTI_HAS_ENUM_HPP