1717
1818namespace docopt {
1919
20+ enum class Kind {
21+ Empty,
22+ Bool,
23+ Long,
24+ String,
25+ StringList
26+ };
27+
2028 // / A generic type to hold the various types that can be produced by docopt.
2129 // /
2230 // / This type can be one of: {bool, long, string, vector<string>}, or empty.
@@ -36,15 +44,17 @@ namespace docopt {
3644 value (value&&) noexcept ;
3745 value& operator =(value const &);
3846 value& operator =(value&&) noexcept ;
47+
48+ Kind kind () const { return mKind ; }
3949
4050 // 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; }
4252
4353 // 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; }
4858
4959 // Throws std::invalid_argument if the type does not match
5060 bool asBool () const ;
@@ -59,14 +69,6 @@ namespace docopt {
5969 friend bool operator !=(value const &, value const &);
6070
6171 private:
62- enum class Kind {
63- Empty,
64- Bool,
65- Long,
66- String,
67- StringList
68- };
69-
7072 union Variant {
7173 Variant () {}
7274 ~Variant () { /* do nothing; will be destroyed by ~value */ }
@@ -89,19 +91,18 @@ namespace docopt {
8991 }
9092
9193 void throwIfNotKind (Kind expected) const {
92- if (kind == expected)
94+ if (mKind == expected)
9395 return ;
9496
9597 std::string error = " Illegal cast to " ;
9698 error += kindAsString (expected);
9799 error += " ; type is actually " ;
98- error += kindAsString (kind );
100+ error += kindAsString (mKind );
99101 throw std::runtime_error (std::move (error));
100102 }
101103
102- private:
103- Kind kind = Kind::Empty;
104- Variant variant {};
104+ Kind mKind = Kind::Empty;
105+ Variant mVariant {};
105106 };
106107
107108 // / Write out the contents to the ostream
@@ -120,51 +121,51 @@ namespace std {
120121namespace docopt {
121122 inline
122123 value::value (bool v)
123- : kind (Kind::Bool)
124+ : mKind (Kind::Bool)
124125 {
125- variant .boolValue = v;
126+ mVariant .boolValue = v;
126127 }
127128
128129 inline
129130 value::value (long v)
130- : kind (Kind::Long)
131+ : mKind (Kind::Long)
131132 {
132- variant .longValue = v;
133+ mVariant .longValue = v;
133134 }
134135
135136 inline
136137 value::value (std::string v)
137- : kind (Kind::String)
138+ : mKind (Kind::String)
138139 {
139- new (&variant .strValue ) std::string (std::move (v));
140+ new (&mVariant .strValue ) std::string (std::move (v));
140141 }
141142
142143 inline
143144 value::value (std::vector<std::string> v)
144- : kind (Kind::StringList)
145+ : mKind (Kind::StringList)
145146 {
146- new (&variant .strList ) std::vector<std::string>(std::move (v));
147+ new (&mVariant .strList ) std::vector<std::string>(std::move (v));
147148 }
148149
149150 inline
150151 value::value (value const & other)
151- : kind (other.kind )
152+ : mKind (other.mKind )
152153 {
153- switch (kind ) {
154+ switch (mKind ) {
154155 case Kind::String:
155- new (&variant .strValue ) std::string (other.variant .strValue );
156+ new (&mVariant .strValue ) std::string (other.mVariant .strValue );
156157 break ;
157158
158159 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 );
160161 break ;
161162
162163 case Kind::Bool:
163- variant .boolValue = other.variant .boolValue ;
164+ mVariant .boolValue = other.mVariant .boolValue ;
164165 break ;
165166
166167 case Kind::Long:
167- variant .longValue = other.variant .longValue ;
168+ mVariant .longValue = other.mVariant .longValue ;
168169 break ;
169170
170171 case Kind::Empty:
@@ -175,23 +176,23 @@ namespace docopt {
175176
176177 inline
177178 value::value (value&& other) noexcept
178- : kind (other.kind )
179+ : mKind (other.mKind )
179180 {
180- switch (kind ) {
181+ switch (mKind ) {
181182 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 ));
183184 break ;
184185
185186 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 ));
187188 break ;
188189
189190 case Kind::Bool:
190- variant .boolValue = other.variant .boolValue ;
191+ mVariant .boolValue = other.mVariant .boolValue ;
191192 break ;
192193
193194 case Kind::Long:
194- variant .longValue = other.variant .longValue ;
195+ mVariant .longValue = other.mVariant .longValue ;
195196 break ;
196197
197198 case Kind::Empty:
@@ -203,13 +204,13 @@ namespace docopt {
203204 inline
204205 value::~value ()
205206 {
206- switch (kind ) {
207+ switch (mKind ) {
207208 case Kind::String:
208- variant .strValue .~basic_string ();
209+ mVariant .strValue .~basic_string ();
209210 break ;
210211
211212 case Kind::StringList:
212- variant .strList .~vector ();
213+ mVariant .strList .~vector ();
213214 break ;
214215
215216 case Kind::Empty:
@@ -243,23 +244,23 @@ namespace docopt {
243244 inline
244245 size_t value::hash () const noexcept
245246 {
246- switch (kind ) {
247+ switch (mKind ) {
247248 case Kind::String:
248- return std::hash<std::string>()(variant .strValue );
249+ return std::hash<std::string>()(mVariant .strValue );
249250
250251 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 ) {
253254 hash_combine (seed, str);
254255 }
255256 return seed;
256257 }
257258
258259 case Kind::Bool:
259- return std::hash<bool >()(variant .boolValue );
260+ return std::hash<bool >()(mVariant .boolValue );
260261
261262 case Kind::Long:
262- return std::hash<long >()(variant .longValue );
263+ return std::hash<long >()(mVariant .longValue );
263264
264265 case Kind::Empty:
265266 default :
@@ -271,15 +272,15 @@ namespace docopt {
271272 bool value::asBool () const
272273 {
273274 throwIfNotKind (Kind::Bool);
274- return variant .boolValue ;
275+ return mVariant .boolValue ;
275276 }
276277
277278 inline
278279 long value::asLong () const
279280 {
280281 // 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 ;
283284 std::size_t pos;
284285 const long ret = stol (str, &pos); // Throws if it can't convert
285286 if (pos != str.length ()) {
@@ -289,43 +290,43 @@ namespace docopt {
289290 return ret;
290291 }
291292 throwIfNotKind (Kind::Long);
292- return variant .longValue ;
293+ return mVariant .longValue ;
293294 }
294295
295296 inline
296297 std::string const & value::asString () const
297298 {
298299 throwIfNotKind (Kind::String);
299- return variant .strValue ;
300+ return mVariant .strValue ;
300301 }
301302
302303 inline
303304 std::vector<std::string> const & value::asStringList () const
304305 {
305306 throwIfNotKind (Kind::StringList);
306- return variant .strList ;
307+ return mVariant .strList ;
307308 }
308309
309310 inline
310311 bool operator ==(value const & v1, value const & v2)
311312 {
312- if (v1.kind != v2.kind )
313+ if (v1.mKind != v2.mKind )
313314 return false ;
314315
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 ;
318319
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 ;
321322
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 ;
324325
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 ;
327328
328- case value:: Kind::Empty:
329+ case Kind::Empty:
329330 default :
330331 return true ;
331332 }
0 commit comments