$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r60224 - branches/quickbook-1.5-spirit2
From: daniel_james_at_[hidden]
Date: 2010-03-06 05:47:46
Author: danieljames
Date: 2010-03-06 05:47:44 EST (Sat, 06 Mar 2010)
New Revision: 60224
URL: http://svn.boost.org/trac/boost/changeset/60224
Log:
A little more portable.
Text files modified: 
   branches/quickbook-1.5-spirit2/boostbook.cpp  |    19 +++++++++++++------                     
   branches/quickbook-1.5-spirit2/html.cpp       |    19 +++++++++++++------                     
   branches/quickbook-1.5-spirit2/rule_store.hpp |    21 +++++++++++----------                   
   3 files changed, 37 insertions(+), 22 deletions(-)
Modified: branches/quickbook-1.5-spirit2/boostbook.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/boostbook.cpp	(original)
+++ branches/quickbook-1.5-spirit2/boostbook.cpp	2010-03-06 05:47:44 EST (Sat, 06 Mar 2010)
@@ -106,6 +106,13 @@
                 }
             }
         } initialize_instance;
+        
+        boostbook_markup get_markup(std::string const& x) {
+            std::map<std::string, boostbook_markup>::const_iterator
+                pos = markup_map.find(x);
+            BOOST_ASSERT(pos != markup_map.end());
+            return pos->second;
+        }
     }
 
     void boostbook_encoder::operator()(quickbook::state& state, std::string const& x)
@@ -147,7 +154,7 @@
 
     void boostbook_encoder::operator()(quickbook::state& state, link const& x)
     {
-        boostbook_markup m = markup_map.at(x.type);
+        boostbook_markup m = get_markup(x.type);
         state.phrase << m.pre;
         state.phrase << encode(x.destination);
         state.phrase << "\">";
@@ -157,13 +164,13 @@
 
     void boostbook_encoder::operator()(quickbook::state& state, formatted const& x)
     {
-        boostbook_markup m = markup_map.at(x.type);
+        boostbook_markup m = get_markup(x.type);
         state.phrase << m.pre << x.content << m.post;
     }
 
     void boostbook_encoder::operator()(quickbook::state& state, break_ const& x)
     {
-        boostbook_markup m = markup_map.at("break");
+        boostbook_markup m = get_markup("break");
         state.phrase << m.pre;
     }
 
@@ -203,7 +210,7 @@
 
     void boostbook_encoder::operator()(quickbook::state& state, hr)
     {
-        state.phrase << markup_map.at("hr").pre;
+        state.phrase << get_markup("hr").pre;
     }
 
     void boostbook_encoder::operator()(quickbook::state& state, begin_section2 const& x)
@@ -260,7 +267,7 @@
         state.phrase << encode(x.title);
         state.phrase << "</title>\n";
 
-        boostbook_markup m = markup_map.at("varlistentry");
+        boostbook_markup m = get_markup("varlistentry");
 
         for(std::vector<varlistentry>::const_iterator
             it = x.entries.begin(); it != x.entries.end(); ++it)
@@ -297,7 +304,7 @@
         // used the last count that was calculated.
         state.phrase << "<tgroup cols=\"" << x.cols << "\">\n";
 
-        boostbook_markup m = markup_map.at("row");
+        boostbook_markup m = get_markup("row");
 
         if (x.head)
         {
Modified: branches/quickbook-1.5-spirit2/html.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/html.cpp	(original)
+++ branches/quickbook-1.5-spirit2/html.cpp	2010-03-06 05:47:44 EST (Sat, 06 Mar 2010)
@@ -106,6 +106,13 @@
                 }
             }
         } initialize_instance;
+
+        html_markup get_markup(std::string const& x) {
+            std::map<std::string, html_markup>::const_iterator
+                pos = markup_map.find(x);
+            BOOST_ASSERT(pos != markup_map.end());
+            return pos->second;
+        }
     }
 
     void html_encoder::operator()(quickbook::state& state, std::string const& x)
@@ -145,7 +152,7 @@
 
     void html_encoder::operator()(quickbook::state& state, link const& x)
     {
-        html_markup m = markup_map.at(x.type);
+        html_markup m = get_markup(x.type);
         if(*m.pre) {
             state.phrase << m.pre;
             state.phrase << encode(x.destination);
@@ -174,14 +181,14 @@
                 ;
         }
         else {
-            html_markup m = markup_map.at(x.type);
+            html_markup m = get_markup(x.type);
             state.phrase << m.pre << x.content << m.post;
         }
     }
 
     void html_encoder::operator()(quickbook::state& state, break_ const& x)
     {
-        html_markup m = markup_map.at("break");
+        html_markup m = get_markup("break");
         state.phrase << m.pre;
     }
 
@@ -215,7 +222,7 @@
 
     void html_encoder::operator()(quickbook::state& state, hr)
     {
-        state.phrase << markup_map.at("hr").pre;
+        state.phrase << get_markup("hr").pre;
     }
 
     void html_encoder::operator()(quickbook::state& state, begin_section2 const& x)
@@ -277,7 +284,7 @@
 
         state.phrase << "<dl>\n";
 
-        html_markup m = markup_map.at("varlistentry");
+        html_markup m = get_markup("varlistentry");
 
         for(std::vector<varlistentry>::const_iterator
             it = x.entries.begin(); it != x.entries.end(); ++it)
@@ -310,7 +317,7 @@
             state.phrase << ">\n";
         }
 
-        html_markup m = markup_map.at("row");
+        html_markup m = get_markup("row");
 
         if (x.head)
         {
Modified: branches/quickbook-1.5-spirit2/rule_store.hpp
==============================================================================
--- branches/quickbook-1.5-spirit2/rule_store.hpp	(original)
+++ branches/quickbook-1.5-spirit2/rule_store.hpp	2010-03-06 05:47:44 EST (Sat, 06 Mar 2010)
@@ -16,6 +16,7 @@
 
 #include <deque>
 #include <boost/assert.hpp>
+#include <utility>
 
 namespace quickbook
 {
@@ -29,7 +30,7 @@
         struct scoped_void
         {
             void* ptr_;
-            void (*del_)(void* x);
+            void (*del_)(void*);
             
             scoped_void() : ptr_(0), del_(0) {}
             scoped_void(scoped_void const& src) : ptr_(0), del_(0) {
@@ -39,13 +40,9 @@
                 if(ptr_) del_(ptr_);
             }
             
-            template <typename T>
-            T* instantiate() {
-                T* obj;
-            
-                del_ = &delete_impl<T>;
-                ptr_ = obj = new T();
-                return obj;
+            void store(void* ptr, void (*del)(void* x)) {
+                ptr = ptr_;
+                del = del_;
             }
         private:
             scoped_void& operator=(scoped_void const&);
@@ -61,15 +58,19 @@
             
             template <typename T>
             operator T&() {
+                std::auto_ptr<T> obj(new T());
+                T& ref = *obj;
                 s.store_.push_back(detail::scoped_void());
-                return *s.store_.back().instantiate<T>();
+                s.store_.back().store(obj.release(), &detail::delete_impl<T>);
+                return ref;
             }
         };
 
         rule_store() {}
 
         instantiate create() {
-            return instantiate(*this);
+            instantiate i(*this);
+            return i;
         }
 
         std::deque<detail::scoped_void> store_;