X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/97ae878ec376149ba49bd08c1bd6590dd5224671..971ef18e306927e3b34229b95171d361eb2da695:/data/variant.hh diff --git a/data/variant.hh b/data/variant.hh index bbae8cb9..ac4f7a78 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -26,7 +26,7 @@ # YYTYPE. m4_define([b4_symbol_variant], [m4_pushdef([b4_dollar_dollar], - [$2.$3< $][3 >(m4_shift3($@))])dnl + [$2.$3< $][3 > (m4_shift3($@))])dnl switch ($1) { b4_type_foreach([b4_type_action_])[]dnl @@ -63,7 +63,7 @@ m4_define([b4_char_sizeof], [b4_symbol_if([$1], [has_type], [ m4_map([ b4_symbol_tag_comment], [$@])dnl - char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type])])@}; + char _b4_char_sizeof_dummy@{sizeof(b4_symbol([$1], [type]))@}; ])]) @@ -72,7 +72,6 @@ m4_map([ b4_symbol_tag_comment], [$@])dnl # The needed includes for variants support. m4_define([b4_variant_includes], [b4_parse_assert_if([[#include ]])[ -#include // abort #ifndef YYASSERT # include # define YYASSERT assert @@ -96,24 +95,22 @@ m4_define([b4_variant_define], /// Empty construction. variant ()]b4_parse_assert_if([ - : built (false) - , tname (YY_NULL)])[ + : yytname_ (YY_NULL)])[ {} /// Construct and fill. template variant (const T& t)]b4_parse_assert_if([ - : built (true) - , tname (typeid (T).name ())])[ + : yytname_ (typeid (T).name ())])[ { YYASSERT (sizeof (T) <= S); - new (buffer.raw) T (t); + new (yyas_ ()) T (t); } /// Destruction, allowed only if empty. ~variant () {]b4_parse_assert_if([ - YYASSERT (!built); + YYASSERT (!yytname_); ])[} /// Instantiate an empty \a T in here. @@ -121,12 +118,10 @@ m4_define([b4_variant_define], T& build () {]b4_parse_assert_if([ - YYASSERT (!built); - YYASSERT (!tname); + YYASSERT (!yytname_); YYASSERT (sizeof (T) <= S); - built = true; - tname = typeid (T).name ();])[ - return *new (buffer.raw) T; + yytname_ = typeid (T).name ();])[ + return *new (yyas_ ()) T; } /// Instantiate a \a T in here from \a t. @@ -134,12 +129,10 @@ m4_define([b4_variant_define], T& build (const T& t) {]b4_parse_assert_if([ - YYASSERT (!built); - YYASSERT (!tname); + YYASSERT (!yytname_); YYASSERT (sizeof (T) <= S); - built = true; - tname = typeid (T).name ();])[ - return *new (buffer.raw) T (t); + yytname_ = typeid (T).name ();])[ + return *new (yyas_ ()) T (t); } /// Accessor to a built \a T. @@ -147,10 +140,9 @@ m4_define([b4_variant_define], T& as () {]b4_parse_assert_if([ - YYASSERT (built); - YYASSERT (tname == typeid (T).name ()); + YYASSERT (yytname_ == typeid (T).name ()); YYASSERT (sizeof (T) <= S);])[ - return reinterpret_cast (buffer.raw); + return *yyas_ (); } /// Const accessor to a built \a T (for %printer). @@ -158,10 +150,9 @@ m4_define([b4_variant_define], const T& as () const {]b4_parse_assert_if([ - YYASSERT (built); - YYASSERT (tname == typeid (T).name ()); + YYASSERT (yytname_ == typeid (T).name ()); YYASSERT (sizeof (T) <= S);])[ - return reinterpret_cast (buffer.raw); + return *yyas_ (); } /// Swap the content with \a other, of same type. @@ -174,12 +165,11 @@ m4_define([b4_variant_define], /// variant::move (). template void - swap (variant& other) + swap (self_type& other) {]b4_parse_assert_if([ - YYASSERT (built); - YYASSERT (other.built); - YYASSERT (tname == other.tname);])[ - std::swap (as(), other.as()); + YYASSERT (yytname_); + YYASSERT (yytname_ == other.yytname_);])[ + std::swap (as (), other.as ()); } /// Move the content of \a other to this. @@ -187,18 +177,18 @@ m4_define([b4_variant_define], /// Destroys \a other. template void - move (variant& other) + move (self_type& other) {]b4_parse_assert_if([ - YYASSERT (! built);])[ - build(); - swap(other); - other.destroy(); + YYASSERT (!yytname_);])[ + build (); + swap (other); + other.destroy (); } /// Copy the content of \a other to this. template void - copy (const variant& other) + copy (const self_type& other) { build (other.as ()); } @@ -209,36 +199,42 @@ m4_define([b4_variant_define], destroy () { as ().~T ();]b4_parse_assert_if([ - built = false; - tname = YY_NULL;])[ + yytname_ = YY_NULL;])[ } + private: /// Prohibit blind copies. - private: - self_type& operator=(const self_type&) + self_type& operator=(const self_type&); + variant (const self_type&); + + /// Accessor to raw memory as \a T. + template + T* + yyas_ () { - abort (); - } + void *yyp = yybuffer_.yyraw; + return static_cast (yyp); + } - variant (const self_type&) + /// Const accessor to raw memory as \a T. + template + const T* + yyas_ () const { - abort (); - } + const void *yyp = yybuffer_.yyraw; + return static_cast (yyp); + } - private: - /// A buffer large enough to store any of the semantic values. - /// Long double is chosen as it has the strongest alignment - /// constraints. union { - long double align_me; - 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;])[ + /// Strongest alignment constraints. + long double yyalign_me; + /// A buffer large enough to store any of the semantic values. + char yyraw[S]; + } yybuffer_;]b4_parse_assert_if([ + + /// Whether the content is built: if defined, the name of the stored type. + const char *yytname_;])[ }; ]]) @@ -248,16 +244,16 @@ m4_define([b4_variant_define], ## -------------------------- ## -# b4_semantic_type_declare -# ------------------------ +# b4_value_type_declare +# --------------------- # Declare semantic_type. -m4_define([b4_semantic_type_declare], -[ /// An auxiliary type to compute the largest semantic type. +m4_define([b4_value_type_declare], +[[ /// An auxiliary type to compute the largest semantic type. union union_type {]b4_type_foreach([b4_char_sizeof])[}; /// Symbol semantic values. - typedef variant semantic_type;dnl + typedef variant semantic_type;][]dnl ]) @@ -267,7 +263,7 @@ m4_define([b4_semantic_type_declare], # ---------------------------- m4_define([b4_symbol_value], [m4_ifval([$2], - [$1.as< $2 >()], + [$1.as< $2 > ()], [$1])]) # b4_symbol_value_template(VAL, [TYPE]) @@ -275,7 +271,7 @@ m4_define([b4_symbol_value], # Same as b4_symbol_value, but used in a template method. m4_define([b4_symbol_value_template], [m4_ifval([$2], - [$1.template as< $2 >()], + [$1.template as< $2 > ()], [$1])]) @@ -320,16 +316,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);])[ - // ]b4_locations_if([res.location = l;])[ - 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 # ----------------------------