$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r85109 - trunk/tools/quickbook/src
From: dnljms_at_[hidden]
Date: 2013-07-22 15:31:48
Author: danieljames
Date: 2013-07-22 15:31:48 EDT (Mon, 22 Jul 2013)
New Revision: 85109
URL: http://svn.boost.org/trac/boost/changeset/85109
Log:
Generic 'scoped_no_eols' implementation.
So that it can be reused for other state variables.
Text files modified: 
   trunk/tools/quickbook/src/main_grammar.cpp |    54 +++++++++++++++++++++++++-------------- 
   1 files changed, 35 insertions(+), 19 deletions(-)
Modified: trunk/tools/quickbook/src/main_grammar.cpp
==============================================================================
--- trunk/tools/quickbook/src/main_grammar.cpp	Mon Jul 22 13:03:01 2013	(r85108)
+++ trunk/tools/quickbook/src/main_grammar.cpp	2013-07-22 15:31:48 EDT (Mon, 22 Jul 2013)	(r85109)
@@ -226,35 +226,48 @@
         std::string saved_source_mode_;
     };
 
-    struct set_no_eols_scoped : scoped_action_base
+    struct in_list_impl {
+        main_grammar_local& l;
+
+        in_list_impl(main_grammar_local& l) :
+            l(l) {}
+
+        bool operator()() const {
+            return !l.list_stack.top().root;
+        }
+    };
+
+    template <typename T, typename M>
+    struct set_scoped_value_impl : scoped_action_base
     {
-        set_no_eols_scoped(main_grammar_local& l)
-            : l(l) {}
+        typedef M T::*member_ptr;
+
+        set_scoped_value_impl(T& l, member_ptr ptr)
+            : l(l), ptr(ptr), saved_value() {}
 
-        bool start() {
-            saved_no_eols = l.no_eols;
-            l.no_eols = false;
+        bool start(M const& value) {
+            saved_value = l.*ptr;
+            l.*ptr = value;
 
             return true;
         }
 
         void cleanup() {
-            l.no_eols = saved_no_eols;
+            l.*ptr = saved_value;
         }
 
-        main_grammar_local& l;
-        bool saved_no_eols;
+        T& l;
+        member_ptr ptr;
+        M saved_value;
     };
 
-    struct in_list_impl {
-        main_grammar_local& l;
-
-        in_list_impl(main_grammar_local& l) :
-            l(l) {}
+    template <typename T, typename M>
+    struct set_scoped_value : scoped_parser<set_scoped_value_impl<T, M> >
+    {
+        typedef set_scoped_value_impl<T, M> impl;
 
-        bool operator()() const {
-            return !l.list_stack.top().root;
-        }
+        set_scoped_value(T& l, typename impl::member_ptr ptr) :
+            scoped_parser<impl>(impl(l, ptr)) {}
     };
 
     ////////////////////////////////////////////////////////////////////////////
@@ -287,8 +300,11 @@
 
         // Local Actions
         scoped_parser<process_element_impl> process_element(local);
-        scoped_parser<set_no_eols_scoped> scoped_no_eols(local);
         in_list_impl in_list(local);
+
+        set_scoped_value<main_grammar_local, bool> scoped_no_eols(
+                local, &main_grammar_local::no_eols);
+
         member_action<main_grammar_local> check_indentation(local,
             &main_grammar_local::check_indentation_impl);
         member_action<main_grammar_local> check_code_block(local,
@@ -354,7 +370,7 @@
             ;
 
         inside_preformatted =
-            scoped_no_eols()
+            scoped_no_eols(false)
             [   paragraph_phrase
             ]
             ;