]> git.saurik.com Git - bison.git/commitdiff
Support constructor with an argument.
authorAkim Demaille <demaille@gostai.com>
Thu, 7 Aug 2008 22:38:07 +0000 (00:38 +0200)
committerAkim Demaille <demaille@gostai.com>
Mon, 10 Nov 2008 10:04:31 +0000 (11:04 +0100)
This improves the "list" bench by 2%.

* data/lalr1.cc (variant::build): Add an overloaded version with
an argument.
* tests/c++.at (AT_CHECK_VARIANT): Check it.

ChangeLog
data/lalr1.cc
tests/c++.at

index d7921b14e0fc5ca53886767adf7028c837f2f49e..cba6f7c19da63c395c26e3429e53e9d2cba6642c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-11-10  Akim Demaille  <demaille@gostai.com>
+
+       Support constructor with an argument.
+       This improves the "list" bench by 2%.
+       
+       * data/lalr1.cc (variant::build): Add an overloaded version with
+       an argument.
+       * tests/c++.at (AT_CHECK_VARIANT): Check it.
+
 2008-11-10  Akim Demaille  <demaille@gostai.com>
 
        Test variants.
 2008-11-10  Akim Demaille  <demaille@gostai.com>
 
        Test variants.
index 5798edf6eb4258a91bff10e659fdbb74768ac4ec..5854390e2956370ab63005ed3cb7c2aab2be3c1e 100644 (file)
@@ -247,6 +247,16 @@ dnl FIXME: This is wrong, we want computed header guards.
       return *new (buffer) T;
     }
 
       return *new (buffer) T;
     }
 
+    /// Instantiate a \a T in here from \a t.
+    template <typename T>
+    inline T&
+    build(const T& t)
+    {]b4_assert_if([
+      assert(!built);
+      built = true;])[
+      return *new (buffer) T(t);
+    }
+
     /// Accessor to a built \a T.
     template <typename T>
     inline T&
     /// Accessor to a built \a T.
     template <typename T>
     inline T&
index d351d41b6bbf658a25e84d7990e382c88401db74..fefeda37affdb1dba1dc0f2d285b7ac78ab6716d 100644 (file)
@@ -33,6 +33,8 @@ AT_DATA([list.yy],
 %skeleton "lalr1.cc"
 %defines
 %define variant
 %skeleton "lalr1.cc"
 %defines
 %define variant
+]m4_bpatsubst([$1], [\\n], [
+])[
 
 %code requires // code for the .hh file
 {
 
 %code requires // code for the .hh file
 {
@@ -87,7 +89,7 @@ typedef std::list<std::string> strings_type;
 %%
 
 result:
 %%
 
 result:
-  list { std::cout << $][1; }
+  list         { std::cout << $][1; }
 ;
 
 list:
 ;
 
 list:
@@ -111,19 +113,24 @@ yylex(yy::parser::semantic_type* yylval)
   switch (stage)
   {
     case 0:
   switch (stage)
   {
     case 0:
-      yylval->build<std::string>() = std::string("BEGIN");
+    case 4:
+#ifdef ONE_STAGE_BUILD
+      yylval->build(string_cast(stage));
+#else
+      yylval->build<std::string>() = string_cast(stage);
+#endif
       result = yy::parser::token::TEXT;
       break;
     case 1:
     case 2:
     case 3:
       result = yy::parser::token::TEXT;
       break;
     case 1:
     case 2:
     case 3:
+#ifdef ONE_STAGE_BUILD
+      yylval->build(stage);
+#else
       yylval->build<int>() = stage;
       yylval->build<int>() = stage;
+#endif
       result = yy::parser::token::NUMBER;
       break;
       result = yy::parser::token::NUMBER;
       break;
-    case 4:
-      yylval->build<std::string>() = std::string("END");
-      result = yy::parser::token::TEXT;
-      break;
     default:
       result = yy::parser::token::END_OF_FILE;
       break;
     default:
       result = yy::parser::token::END_OF_FILE;
       break;
@@ -133,7 +140,6 @@ yylex(yy::parser::semantic_type* yylval)
   return result;
 }
 
   return result;
 }
 
-// Mandatory error function
 void
 yy::parser::error(const yy::parser::location_type& yylloc,
                   const std::string& message)
 void
 yy::parser::error(const yy::parser::location_type& yylloc,
                   const std::string& message)
@@ -141,7 +147,8 @@ yy::parser::error(const yy::parser::location_type& yylloc,
   std::cerr << yylloc << ": " << message << std::endl;
 }
 
   std::cerr << yylloc << ": " << message << std::endl;
 }
 
-int main(int argc, char *argv[])
+int
+main(int argc, char *argv[])
 {
   yy::parser p;
   p.set_debug_level(!!getenv("YYDEBUG"));
 {
   yy::parser p;
   p.set_debug_level(!!getenv("YYDEBUG"));
@@ -149,14 +156,14 @@ int main(int argc, char *argv[])
 }
 ]])
 
 }
 ]])
 
-AT_BISON_CHECK([-o list.cc list.yy], 0)
+AT_BISON_CHECK([-o list.cc list.yy])
 AT_COMPILE_CXX([list])
 AT_CHECK([./list], 0,
 AT_COMPILE_CXX([list])
 AT_CHECK([./list], 0,
-[BEGIN
+[0
 1
 2
 3
 1
 2
 3
-END
+4
 ])
 
 AT_CLEANUP
 ])
 
 AT_CLEANUP
@@ -164,6 +171,7 @@ AT_CLEANUP
 
 AT_CHECK_VARIANTS([])
 AT_CHECK_VARIANTS([%define assert])
 
 AT_CHECK_VARIANTS([])
 AT_CHECK_VARIANTS([%define assert])
+AT_CHECK_VARIANTS([[%define assert %code {\n#define ONE_STAGE_BUILD\n}]])
 
 
 ## ----------------------- ##
 
 
 ## ----------------------- ##