X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/5f5a90dff6b40a1a1e980680e078d7e2799d9bc2..f6b561d9f9cbc6fc95bbb86518372a5cb52f45a6:/data/variant.hh diff --git a/data/variant.hh b/data/variant.hh index d36d6269..65f0026e 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -1,7 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 2002-2012 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -87,13 +86,13 @@ m4_define([b4_variant_define], /// via the current state. template struct variant - {]b4_assert_if([ + {]b4_parse_assert_if([ /// Whether something is contained. bool built; ])[ /// Empty construction. inline - variant ()]b4_assert_if([ + variant ()]b4_parse_assert_if([ : built (false)])[ {} @@ -101,7 +100,7 @@ m4_define([b4_variant_define], template inline T& build () - {]b4_assert_if([ + {]b4_parse_assert_if([ assert (!built); built = true;])[ return *new (buffer.raw) T; @@ -111,7 +110,7 @@ m4_define([b4_variant_define], template inline T& build (const T& t) - {]b4_assert_if([ + {]b4_parse_assert_if([ assert(!built); built = true;])[ return *new (buffer.raw) T(t); @@ -120,7 +119,7 @@ m4_define([b4_variant_define], /// Construct and fill. template inline - variant (const T& t)]b4_assert_if([ + variant (const T& t)]b4_parse_assert_if([ : built (true)])[ { new (buffer.raw) T(t); @@ -130,7 +129,7 @@ m4_define([b4_variant_define], template inline T& as () - {]b4_assert_if([ + {]b4_parse_assert_if([ assert (built);])[ return reinterpret_cast(buffer.raw); } @@ -139,7 +138,7 @@ m4_define([b4_variant_define], template inline const T& as () const - {]b4_assert_if([ + {]b4_parse_assert_if([ assert(built);])[ return reinterpret_cast(buffer.raw); } @@ -168,7 +167,7 @@ m4_define([b4_variant_define], inline void destroy () { - as().~T();]b4_assert_if([ + as().~T();]b4_parse_assert_if([ built = false;])[ } @@ -217,3 +216,62 @@ m4_define([b4_symbol_value_template], [m4_ifval([$2], [$1.template as< $2 >()], [$1])]) + + + +## ------------- ## +## make_SYMBOL. ## +## ------------- ## + + +# b4_symbol_constructor_declare_(SYMBOL-NUMBER) +# --------------------------------------------- +# Declare the overloaded version of make_symbol for the (common) type of +# these SYMBOL-NUMBERS. Use at class-level. +m4_define([b4_symbol_constructor_declare_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], +[ static inline + symbol_type + 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_symbol_constructor_declare +# ----------------------------- +# Declare symbol constructors for all the value types. +# Use at class-level. +m4_define([b4_symbol_constructor_declare], +[ // Symbol constructors declarations. +b4_symbol_foreach([b4_symbol_constructor_declare_])]) + + + +# b4_symbol_constructor_define_(SYMBOL-NUMBER) +# -------------------------------------------- +# Define symbol constructor for this SYMBOL-NUMBER. +m4_define([b4_symbol_constructor_define_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], +[ b4_parser_class_name::symbol_type + 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]))) + { + return symbol_type (b4_join([token::b4_symbol([$1], [id])], + b4_symbol_if([$1], [has_type], [v]), + b4_locations_if([l]))); + } + +])])]) + + +# b4_symbol_constructor_define +# ---------------------------- +# Define the overloaded versions of make_symbol for all the value types. +m4_define([b4_symbol_constructor_define], +[ // Implementation of make_symbol for each symbol type. +b4_symbol_foreach([b4_symbol_constructor_define_])])