17
17
18
18
namespace docopt {
19
19
20
+ enum class Kind {
21
+ Empty,
22
+ Bool,
23
+ Long,
24
+ String,
25
+ StringList
26
+ };
27
+
20
28
// / A generic type to hold the various types that can be produced by docopt.
21
29
// /
22
30
// / This type can be one of: {bool, long, string, vector<string>}, or empty.
@@ -36,15 +44,17 @@ namespace docopt {
36
44
value (value&&) noexcept ;
37
45
value& operator =(value const &);
38
46
value& operator =(value&&) noexcept ;
47
+
48
+ Kind kind () const { return mKind ; }
39
49
40
50
// Test if this object has any contents at all
41
- explicit operator bool () const { return kind != Kind::Empty; }
51
+ explicit operator bool () const { return mKind != Kind::Empty; }
42
52
43
53
// Test the type contained by this value object
44
- bool isBool () const { return kind ==Kind::Bool; }
45
- bool isString () const { return kind ==Kind::String; }
46
- bool isLong () const { return kind ==Kind::Long; }
47
- bool isStringList () const { return kind ==Kind::StringList; }
54
+ bool isBool () const { return mKind ==Kind::Bool; }
55
+ bool isString () const { return mKind ==Kind::String; }
56
+ bool isLong () const { return mKind ==Kind::Long; }
57
+ bool isStringList () const { return mKind ==Kind::StringList; }
48
58
49
59
// Throws std::invalid_argument if the type does not match
50
60
bool asBool () const ;
@@ -59,14 +69,6 @@ namespace docopt {
59
69
friend bool operator !=(value const &, value const &);
60
70
61
71
private:
62
- enum class Kind {
63
- Empty,
64
- Bool,
65
- Long,
66
- String,
67
- StringList
68
- };
69
-
70
72
union Variant {
71
73
Variant () {}
72
74
~Variant () { /* do nothing; will be destroyed by ~value */ }
@@ -89,19 +91,18 @@ namespace docopt {
89
91
}
90
92
91
93
void throwIfNotKind (Kind expected) const {
92
- if (kind == expected)
94
+ if (mKind == expected)
93
95
return ;
94
96
95
97
std::string error = " Illegal cast to " ;
96
98
error += kindAsString (expected);
97
99
error += " ; type is actually " ;
98
- error += kindAsString (kind );
100
+ error += kindAsString (mKind );
99
101
throw std::runtime_error (std::move (error));
100
102
}
101
103
102
- private:
103
- Kind kind = Kind::Empty;
104
- Variant variant {};
104
+ Kind mKind = Kind::Empty;
105
+ Variant mVariant {};
105
106
};
106
107
107
108
// / Write out the contents to the ostream
@@ -120,51 +121,51 @@ namespace std {
120
121
namespace docopt {
121
122
inline
122
123
value::value (bool v)
123
- : kind (Kind::Bool)
124
+ : mKind (Kind::Bool)
124
125
{
125
- variant .boolValue = v;
126
+ mVariant .boolValue = v;
126
127
}
127
128
128
129
inline
129
130
value::value (long v)
130
- : kind (Kind::Long)
131
+ : mKind (Kind::Long)
131
132
{
132
- variant .longValue = v;
133
+ mVariant .longValue = v;
133
134
}
134
135
135
136
inline
136
137
value::value (std::string v)
137
- : kind (Kind::String)
138
+ : mKind (Kind::String)
138
139
{
139
- new (&variant .strValue ) std::string (std::move (v));
140
+ new (&mVariant .strValue ) std::string (std::move (v));
140
141
}
141
142
142
143
inline
143
144
value::value (std::vector<std::string> v)
144
- : kind (Kind::StringList)
145
+ : mKind (Kind::StringList)
145
146
{
146
- new (&variant .strList ) std::vector<std::string>(std::move (v));
147
+ new (&mVariant .strList ) std::vector<std::string>(std::move (v));
147
148
}
148
149
149
150
inline
150
151
value::value (value const & other)
151
- : kind (other.kind )
152
+ : mKind (other.mKind )
152
153
{
153
- switch (kind ) {
154
+ switch (mKind ) {
154
155
case Kind::String:
155
- new (&variant .strValue ) std::string (other.variant .strValue );
156
+ new (&mVariant .strValue ) std::string (other.mVariant .strValue );
156
157
break ;
157
158
158
159
case Kind::StringList:
159
- new (&variant .strList ) std::vector<std::string>(other.variant .strList );
160
+ new (&mVariant .strList ) std::vector<std::string>(other.mVariant .strList );
160
161
break ;
161
162
162
163
case Kind::Bool:
163
- variant .boolValue = other.variant .boolValue ;
164
+ mVariant .boolValue = other.mVariant .boolValue ;
164
165
break ;
165
166
166
167
case Kind::Long:
167
- variant .longValue = other.variant .longValue ;
168
+ mVariant .longValue = other.mVariant .longValue ;
168
169
break ;
169
170
170
171
case Kind::Empty:
@@ -175,23 +176,23 @@ namespace docopt {
175
176
176
177
inline
177
178
value::value (value&& other) noexcept
178
- : kind (other.kind )
179
+ : mKind (other.mKind )
179
180
{
180
- switch (kind ) {
181
+ switch (mKind ) {
181
182
case Kind::String:
182
- new (&variant .strValue ) std::string (std::move (other.variant .strValue ));
183
+ new (&mVariant .strValue ) std::string (std::move (other.mVariant .strValue ));
183
184
break ;
184
185
185
186
case Kind::StringList:
186
- new (&variant .strList ) std::vector<std::string>(std::move (other.variant .strList ));
187
+ new (&mVariant .strList ) std::vector<std::string>(std::move (other.mVariant .strList ));
187
188
break ;
188
189
189
190
case Kind::Bool:
190
- variant .boolValue = other.variant .boolValue ;
191
+ mVariant .boolValue = other.mVariant .boolValue ;
191
192
break ;
192
193
193
194
case Kind::Long:
194
- variant .longValue = other.variant .longValue ;
195
+ mVariant .longValue = other.mVariant .longValue ;
195
196
break ;
196
197
197
198
case Kind::Empty:
@@ -203,13 +204,13 @@ namespace docopt {
203
204
inline
204
205
value::~value ()
205
206
{
206
- switch (kind ) {
207
+ switch (mKind ) {
207
208
case Kind::String:
208
- variant .strValue .~basic_string ();
209
+ mVariant .strValue .~basic_string ();
209
210
break ;
210
211
211
212
case Kind::StringList:
212
- variant .strList .~vector ();
213
+ mVariant .strList .~vector ();
213
214
break ;
214
215
215
216
case Kind::Empty:
@@ -243,23 +244,23 @@ namespace docopt {
243
244
inline
244
245
size_t value::hash () const noexcept
245
246
{
246
- switch (kind ) {
247
+ switch (mKind ) {
247
248
case Kind::String:
248
- return std::hash<std::string>()(variant .strValue );
249
+ return std::hash<std::string>()(mVariant .strValue );
249
250
250
251
case Kind::StringList: {
251
- size_t seed = std::hash<size_t >()(variant .strList .size ());
252
- for (auto const & str : variant .strList ) {
252
+ size_t seed = std::hash<size_t >()(mVariant .strList .size ());
253
+ for (auto const & str : mVariant .strList ) {
253
254
hash_combine (seed, str);
254
255
}
255
256
return seed;
256
257
}
257
258
258
259
case Kind::Bool:
259
- return std::hash<bool >()(variant .boolValue );
260
+ return std::hash<bool >()(mVariant .boolValue );
260
261
261
262
case Kind::Long:
262
- return std::hash<long >()(variant .longValue );
263
+ return std::hash<long >()(mVariant .longValue );
263
264
264
265
case Kind::Empty:
265
266
default :
@@ -271,15 +272,15 @@ namespace docopt {
271
272
bool value::asBool () const
272
273
{
273
274
throwIfNotKind (Kind::Bool);
274
- return variant .boolValue ;
275
+ return mVariant .boolValue ;
275
276
}
276
277
277
278
inline
278
279
long value::asLong () const
279
280
{
280
281
// Attempt to convert a string to a long
281
- if (kind == Kind::String) {
282
- const std::string& str = variant .strValue ;
282
+ if (mKind == Kind::String) {
283
+ const std::string& str = mVariant .strValue ;
283
284
std::size_t pos;
284
285
const long ret = stol (str, &pos); // Throws if it can't convert
285
286
if (pos != str.length ()) {
@@ -289,43 +290,43 @@ namespace docopt {
289
290
return ret;
290
291
}
291
292
throwIfNotKind (Kind::Long);
292
- return variant .longValue ;
293
+ return mVariant .longValue ;
293
294
}
294
295
295
296
inline
296
297
std::string const & value::asString () const
297
298
{
298
299
throwIfNotKind (Kind::String);
299
- return variant .strValue ;
300
+ return mVariant .strValue ;
300
301
}
301
302
302
303
inline
303
304
std::vector<std::string> const & value::asStringList () const
304
305
{
305
306
throwIfNotKind (Kind::StringList);
306
- return variant .strList ;
307
+ return mVariant .strList ;
307
308
}
308
309
309
310
inline
310
311
bool operator ==(value const & v1, value const & v2)
311
312
{
312
- if (v1.kind != v2.kind )
313
+ if (v1.mKind != v2.mKind )
313
314
return false ;
314
315
315
- switch (v1.kind ) {
316
- case value:: Kind::String:
317
- return v1.variant .strValue ==v2.variant .strValue ;
316
+ switch (v1.mKind ) {
317
+ case Kind::String:
318
+ return v1.mVariant .strValue ==v2.mVariant .strValue ;
318
319
319
- case value:: Kind::StringList:
320
- return v1.variant .strList ==v2.variant .strList ;
320
+ case Kind::StringList:
321
+ return v1.mVariant .strList ==v2.mVariant .strList ;
321
322
322
- case value:: Kind::Bool:
323
- return v1.variant .boolValue ==v2.variant .boolValue ;
323
+ case Kind::Bool:
324
+ return v1.mVariant .boolValue ==v2.mVariant .boolValue ;
324
325
325
- case value:: Kind::Long:
326
- return v1.variant .longValue ==v2.variant .longValue ;
326
+ case Kind::Long:
327
+ return v1.mVariant .longValue ==v2.mVariant .longValue ;
327
328
328
- case value:: Kind::Empty:
329
+ case Kind::Empty:
329
330
default :
330
331
return true ;
331
332
}
0 commit comments