X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/858666c44302b355ff0cad76b457d57659306d6f..66c209cf435b5bfc5cf982d8df9cc3ef05b4546b:/data/variant.hh?ds=sidebyside diff --git a/data/variant.hh b/data/variant.hh index 84ea7798..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;])[ }; ]]) @@ -311,15 +305,43 @@ m4_define([b4_symbol_constructor_define_], b4_parser_class_name::make_[]b4_symbol_([$1], [id]) (dnl b4_join(b4_symbol_if([$1], [has_type], [const b4_symbol([$1], [type])& v]), - b4_locations_if([const location_type& l])))[ + b4_locations_if([const location_type& l]))) { - symbol_type res (token::]b4_symbol([$1], [id])[]b4_locations_if([, l])[); - ]b4_symbol_if([$1], [has_type], [res.value.build (v); - ])[return res; + return symbol_type (b4_join([token::b4_symbol([$1], [id])], + b4_symbol_if([$1], [has_type], [v]), + b4_locations_if([l]))); + } -]])])]) +])])]) + +# b4_basic_symbol_constructor_declare +# ---------------------------------- +# Generate a constructor declaration for basic_symbol from given type. +m4_define([b4_basic_symbol_constructor_declare], +[[ + basic_symbol (]b4_join( + [typename Base::kind_type t], + b4_symbol_if([$1], [has_type], const b4_symbol([$1], [type])[ v]), + b4_locations_if([const location_type& l]))[); +]]) + +# b4_basic_symbol_constructor_define +# ---------------------------------- +# Generate a constructor implementation for basic_symbol from given type. +m4_define([b4_basic_symbol_constructor_define], +[[ + template + ]b4_parser_class_name[::basic_symbol::basic_symbol (]b4_join( + [typename Base::kind_type t], + b4_symbol_if([$1], [has_type], const b4_symbol([$1], [type])[ v]), + b4_locations_if([const location_type& l]))[) + : Base (t) + , value (]b4_symbol_if([$1], [has_type], [v])[)]b4_locations_if([ + , location (l)])[ + {} +]]) # b4_symbol_constructor_define # ----------------------------