]> git.saurik.com Git - bison.git/blobdiff - data/variant.hh
tests: minor fixes/simplifications
[bison.git] / data / variant.hh
index 893673383d8fe741f7c0960462a710818da1809e..5895b297cfc0c3b5feae0a1b4fbaa3d8dc65b29d 100644 (file)
@@ -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
@@ -75,10 +74,10 @@ m4_map([b4_char_sizeof_], [$@])dnl
 ])])
 
 
-# b4_variant_definition
-# ---------------------
+# b4_variant_define
+# -----------------
 # Define "variant".
-m4_define([b4_variant_definition],
+m4_define([b4_variant_define],
 [[
   /// A char[S] buffer to store and retrieve objects.
   ///
@@ -87,13 +86,13 @@ m4_define([b4_variant_definition],
   /// via the current state.
   template <size_t S>
   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_definition],
     template <typename T>
     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_definition],
     template <typename T>
     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_definition],
     /// Construct and fill.
     template <typename T>
     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_definition],
     template <typename T>
     inline T&
     as ()
-    {]b4_assert_if([
+    {]b4_parse_assert_if([
       assert (built);])[
       return reinterpret_cast<T&>(buffer.raw);
     }
@@ -139,7 +138,7 @@ m4_define([b4_variant_definition],
     template <typename T>
     inline const T&
     as () const
-    {]b4_assert_if([
+    {]b4_parse_assert_if([
       assert(built);])[
       return reinterpret_cast<const T&>(buffer.raw);
     }
@@ -168,7 +167,7 @@ m4_define([b4_variant_definition],
     inline void
     destroy ()
     {
-      as<T>().~T();]b4_assert_if([
+      as<T>().~T();]b4_parse_assert_if([
       built = false;])[
     }
 
@@ -189,6 +188,18 @@ m4_define([b4_variant_definition],
 ## -------------------------- ##
 
 
+# b4_semantic_type_declare
+# ------------------------
+# Declare semantic_type.
+m4_define([b4_semantic_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<sizeof(union_type)> semantic_type;])
+
+
 # How the semantic value is extracted when using variants.
 
 # b4_symbol_value(VAL, [TYPE])
@@ -205,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_args(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_args(b4_symbol_if([$1], [has_type],
+                     [const b4_symbol([$1], [type])& v]),
+        b4_locations_if([const location_type& l])))
+  {
+    return symbol_type (b4_args([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_])])