X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/ee9cf8c4a6bf34fe291ed860e0d7779d78a5bcb0..66c209cf435b5bfc5cf982d8df9cc3ef05b4546b:/data/variant.hh?ds=sidebyside diff --git a/data/variant.hh b/data/variant.hh index 3b21329c..91548d84 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -95,15 +95,13 @@ m4_define([b4_variant_define], /// Empty construction. variant ()]b4_parse_assert_if([ - : built (false) - , tname (YY_NULL)])[ + : tname (YY_NULL)])[ {} /// Construct and fill. template variant (const T& t)]b4_parse_assert_if([ - : built (true) - , tname (typeid (T).name ())])[ + : tname (typeid (T).name ())])[ { YYASSERT (sizeof (T) <= S); new (buffer.raw) T (t); @@ -112,7 +110,7 @@ m4_define([b4_variant_define], /// Destruction, allowed only if empty. ~variant () {]b4_parse_assert_if([ - YYASSERT (!built); + YYASSERT (!tname); ])[} /// Instantiate an empty \a T in here. @@ -120,10 +118,8 @@ m4_define([b4_variant_define], T& build () {]b4_parse_assert_if([ - YYASSERT (!built); YYASSERT (!tname); YYASSERT (sizeof (T) <= S); - built = true; tname = typeid (T).name ();])[ return *new (buffer.raw) T; } @@ -133,10 +129,8 @@ m4_define([b4_variant_define], T& build (const T& t) {]b4_parse_assert_if([ - YYASSERT (!built); YYASSERT (!tname); YYASSERT (sizeof (T) <= S); - built = true; tname = typeid (T).name ();])[ return *new (buffer.raw) T (t); } @@ -146,10 +140,12 @@ m4_define([b4_variant_define], T& as () {]b4_parse_assert_if([ - YYASSERT (built); YYASSERT (tname == typeid (T).name ()); YYASSERT (sizeof (T) <= S);])[ - return reinterpret_cast (buffer.raw); + { + void *dummy = buffer.raw; + return *static_cast (dummy); + } } /// Const accessor to a built \a T (for %printer). @@ -157,10 +153,12 @@ m4_define([b4_variant_define], const T& as () const {]b4_parse_assert_if([ - YYASSERT (built); YYASSERT (tname == typeid (T).name ()); YYASSERT (sizeof (T) <= S);])[ - return reinterpret_cast (buffer.raw); + { + const void *dummy = buffer.raw; + return *static_cast (dummy); + } } /// Swap the content with \a other, of same type. @@ -175,8 +173,7 @@ m4_define([b4_variant_define], void swap (self_type& other) {]b4_parse_assert_if([ - YYASSERT (built); - YYASSERT (other.built); + YYASSERT (tname); YYASSERT (tname == other.tname);])[ std::swap (as(), other.as()); } @@ -188,7 +185,7 @@ m4_define([b4_variant_define], void move (self_type& other) {]b4_parse_assert_if([ - YYASSERT (! built);])[ + YYASSERT (!tname);])[ build(); swap(other); other.destroy(); @@ -208,7 +205,6 @@ m4_define([b4_variant_define], destroy () { as ().~T ();]b4_parse_assert_if([ - built = false; tname = YY_NULL;])[ } @@ -226,10 +222,8 @@ m4_define([b4_variant_define], char raw[S]; } buffer;]b4_parse_assert_if([ - /// Whether the content is built. - bool built; - /// If defined, the name of the stored type. - const char* tname;])[ + /// Whether the content is built: if defined, the name of the stored type. + const char *tname;])[ }; ]])