$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r70195 - in trunk/tools/quickbook: . src
From: dnljms_at_[hidden]
Date: 2011-03-19 12:24:41
Author: danieljames
Date: 2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
New Revision: 70195
URL: http://svn.boost.org/trac/boost/changeset/70195
Log:
Quickbook: Implement int value and use for years and versions.
Hopefully will no longer need to the workaround for 64 bit gcc.
Properties modified: 
   trunk/tools/quickbook/   (props changed)
Text files modified: 
   trunk/tools/quickbook/src/actions.cpp          |     8 -----                                   
   trunk/tools/quickbook/src/actions.hpp          |    10 ------                                  
   trunk/tools/quickbook/src/doc_info_actions.cpp |    26 ++++++++++------                        
   trunk/tools/quickbook/src/doc_info_grammar.cpp |    19 ++++++-----                             
   trunk/tools/quickbook/src/doc_info_tags.hpp    |     1                                         
   trunk/tools/quickbook/src/values.cpp           |    63 ++++++++++++++++++++++++++++++++++++--- 
   trunk/tools/quickbook/src/values.hpp           |    10 +++++                                   
   trunk/tools/quickbook/src/values_parse.hpp     |     6 +++                                     
   8 files changed, 101 insertions(+), 42 deletions(-)
Modified: trunk/tools/quickbook/src/actions.cpp
==============================================================================
--- trunk/tools/quickbook/src/actions.cpp	(original)
+++ trunk/tools/quickbook/src/actions.cpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -33,12 +33,8 @@
     char const* quickbook_get_date = "__quickbook_get_date__";
     char const* quickbook_get_time = "__quickbook_get_time__";
 
-    int qbk_major_version = -1;
-    int qbk_minor_version = -1;
     unsigned qbk_version_n = 0; // qbk_major_version * 100 + qbk_minor_version
 
-    void assign_qbk_version::operator()(int value) const { v_ = value; }
-
     namespace {
         std::string fully_qualified_id(std::string const& library_id,
             std::string const& qualified_section_id,
@@ -1646,8 +1642,6 @@
         
         // save the source mode and version info (only restored for 1.6+)
         std::string source_mode = actions.source_mode;
-        unsigned qbk_major_version_store = qbk_major_version;
-        unsigned qbk_minor_version_store = qbk_minor_version;
         unsigned qbk_version_n_store = qbk_version_n;
 
         // scope the macros
@@ -1683,8 +1677,6 @@
         {
             actions.source_mode = source_mode;
 
-            qbk_major_version = qbk_major_version_store;
-            qbk_minor_version = qbk_minor_version_store;
             qbk_version_n = qbk_version_n_store;
         }
 
Modified: trunk/tools/quickbook/src/actions.hpp
==============================================================================
--- trunk/tools/quickbook/src/actions.hpp	(original)
+++ trunk/tools/quickbook/src/actions.hpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -37,17 +37,7 @@
     namespace cl = boost::spirit::classic;
     namespace fs = boost::filesystem;
 
-    extern int qbk_major_version;
-    extern int qbk_minor_version;
     extern unsigned qbk_version_n; // qbk_major_version * 100 + qbk_minor_version
-    
-    // This struct is used to avoid an optimization bug
-    // in g++ 4.4 on 64-bit linux.
-    struct assign_qbk_version {
-        assign_qbk_version(int& v) : v_(v) {}
-        void operator()(int value) const;
-        int& v_;
-    };
 
     struct quickbook_range {
         template <typename Arg>
Modified: trunk/tools/quickbook/src/doc_info_actions.cpp
==============================================================================
--- trunk/tools/quickbook/src/doc_info_actions.cpp	(original)
+++ trunk/tools/quickbook/src/doc_info_actions.cpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -11,7 +11,6 @@
 #include <sstream>
 #include <boost/bind.hpp>
 #include <boost/algorithm/string/join.hpp>
-#include <boost/lexical_cast.hpp>
 #include "quickbook.hpp"
 #include "utils.hpp"
 #include "input_path.hpp"
@@ -79,8 +78,8 @@
 
         while (values.check(value::default_tag)) values.consume();
         
-        std::vector<std::string> duplicates;
-
+        value qbk_version = values.optional_consume(doc_info_tags::qbk_version);
+        
         value doc_title;
         if (values.check())
         {
@@ -89,6 +88,8 @@
             actions.doc_title_qbk = doc_title.get_quickbook();
         }
 
+        std::vector<std::string> duplicates;
+
         value id = consume_last_single(values, doc_info_attributes::id, &duplicates);
         value dirname = consume_last_single(values, doc_info_attributes::dirname, &duplicates);
         value last_revision = consume_last_single(values, doc_info_attributes::last_revision, &duplicates);
@@ -155,22 +156,28 @@
 
         // Quickbook version
 
-        if (qbk_major_version == -1)
+        int qbk_major_version, qbk_minor_version;
+
+        if (qbk_version.empty())
         {
             // hard code quickbook version to v1.1
             qbk_major_version = 1;
             qbk_minor_version = 1;
-            qbk_version_n = 101;
             detail::outwarn(actions.filename,1)
                 << "Warning: Quickbook version undefined. "
                 "Version 1.1 is assumed" << std::endl;
         }
         else
         {
-            qbk_version_n = ((unsigned) qbk_major_version * 100) +
-                (unsigned) qbk_minor_version;
+            value_consumer qbk_version_values(qbk_version);
+            qbk_major_version = qbk_version_values.consume().get_int();
+            qbk_minor_version = qbk_version_values.consume().get_int();
+            qbk_version_values.finish();
         }
         
+        qbk_version_n = ((unsigned) qbk_major_version * 100) +
+            (unsigned) qbk_minor_version;
+
         if (qbk_version_n == 106)
         {
             detail::outwarn(actions.filename,1)
@@ -283,11 +290,10 @@
     
                 while(copyright.check(doc_info_tags::copyright_year))
                 {
-                    int year_start =
-                        boost::lexical_cast<int>(copyright.consume().get_quickbook());
+                    int year_start = copyright.consume().get_int();
                     int year_end =
                         copyright.check(doc_info_tags::copyright_year_end) ?
-                        boost::lexical_cast<int>(copyright.consume().get_quickbook()) :
+                        copyright.consume().get_int() :
                         year_start;
     
                     if (year_end < year_start) {
Modified: trunk/tools/quickbook/src/doc_info_grammar.cpp
==============================================================================
--- trunk/tools/quickbook/src/doc_info_grammar.cpp	(original)
+++ trunk/tools/quickbook/src/doc_info_grammar.cpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -16,6 +16,7 @@
 #include <boost/spirit/include/classic_loops.hpp>
 #include <boost/spirit/include/classic_symbols.hpp>
 #include <boost/spirit/include/classic_chset.hpp>
+#include <boost/spirit/include/classic_numerics.hpp>
 #include <boost/spirit/include/phoenix1_primitives.hpp>
 
 namespace quickbook
@@ -65,9 +66,10 @@
         cl::rule<scanner>
                         doc_title, doc_simple, doc_phrase, doc_fallback,
                         doc_authors, doc_author,
-                        doc_copyright, doc_copyright_year, doc_copyright_holder,
+                        doc_copyright, doc_copyright_holder,
                         doc_source_mode, doc_biblioid,
                         quickbook_version, char_;
+        cl::uint_parser<int, 10, 4, 4> doc_copyright_year;
         cl::symbols<> doc_types;
         cl::symbols<value::tag_type> doc_attributes;
         std::map<value::tag_type, cl::rule<scanner>* > attribute_rules;
@@ -135,11 +137,14 @@
             ;
 
         local.quickbook_version =
-                "quickbook" >> hard_space
-            >>  (   cl::uint_p              [assign_qbk_version(qbk_major_version)]
+            actions.values.list(doc_info_tags::qbk_version)
+            [   "quickbook"
+            >>  hard_space
+            >>  (   cl::uint_p              [actions.values.entry(ph::arg1)]
                     >> '.' 
-                    >>  uint2_t()           [assign_qbk_version(qbk_minor_version)]
+                    >>  uint2_t()           [actions.values.entry(ph::arg1)]
                 )
+            ]
             ;
 
         // TODO: Clear phrase afterwards?
@@ -156,8 +161,6 @@
         local.attribute_rules[doc_info_attributes::last_revision] = &local.doc_simple;
         local.attribute_rules[doc_info_attributes::lang] = &local.doc_simple;
 
-        local.doc_copyright_year = cl::repeat_p(4)[cl::digit_p];
-
         local.doc_copyright_holder
             =   *(  ~cl::eps_p
                     (   ']'
@@ -168,12 +171,12 @@
 
         local.doc_copyright =
             *(  +(  local.doc_copyright_year
-                                            [actions.values.entry(ph::arg1, ph::arg2, doc_info_tags::copyright_year)]
+                                            [actions.values.entry(ph::arg1, doc_info_tags::copyright_year)]
                 >>  space
                 >>  !(  '-'
                     >>  space
                     >>  local.doc_copyright_year
-                                            [actions.values.entry(ph::arg1, ph::arg2, doc_info_tags::copyright_year_end)]
+                                            [actions.values.entry(ph::arg1, doc_info_tags::copyright_year_end)]
                     >>  space
                     )
                 >>  !cl::ch_p(',')
Modified: trunk/tools/quickbook/src/doc_info_tags.hpp
==============================================================================
--- trunk/tools/quickbook/src/doc_info_tags.hpp	(original)
+++ trunk/tools/quickbook/src/doc_info_tags.hpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -14,6 +14,7 @@
 namespace quickbook
 {
     QUICKBOOK_VALUE_TAGS(doc_info_tags, 0x400,
+        (qbk_version)
         (type)
         (title)
         (author_surname)(author_first)
Modified: trunk/tools/quickbook/src/values.cpp
==============================================================================
--- trunk/tools/quickbook/src/values.cpp	(original)
+++ trunk/tools/quickbook/src/values.cpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -9,6 +9,7 @@
 #include "values.hpp"
 #include <boost/intrusive_ptr.hpp>
 #include <boost/current_function.hpp>
+#include <boost/lexical_cast.hpp>
 
 #define UNDEFINED_ERROR() \
     throw value_error( \
@@ -41,6 +42,7 @@
         value_node* value_node::store() { return this; }
 
         file_position value_node::get_position() const { UNDEFINED_ERROR(); }
+        int value_node::get_int() const { UNDEFINED_ERROR(); }
         std::string value_node::get_quickbook() const { UNDEFINED_ERROR(); }
         std::string value_node::get_boostbook() const {  UNDEFINED_ERROR(); }
         value_node* value_node::get_list() const {  UNDEFINED_ERROR(); }
@@ -196,6 +198,62 @@
     }
 
     ////////////////////////////////////////////////////////////////////////////
+    // Integers
+
+    namespace detail
+    {
+        struct value_int_impl : public value_node
+        {
+        public:
+            explicit value_int_impl(int, value::tag_type);
+        private:
+            char const* type_name() const { return "integer"; }
+            virtual value_node* clone() const;
+            virtual int get_int() const;
+            virtual std::string get_quickbook() const;
+            virtual std::string get_boostbook() const;
+            virtual bool empty() const;
+    
+            int value_;
+        };
+
+        value_int_impl::value_int_impl(int v, value::tag_type t)
+            : value_node(t)
+            , value_(v)
+        {}
+
+        value_node* value_int_impl::clone() const
+        {
+            return new value_int_impl(value_, tag_);
+        }
+
+        int value_int_impl::get_int() const
+        {
+            return value_;
+        }
+
+        std::string value_int_impl::get_quickbook() const
+        {
+            return boost::lexical_cast<std::string>(value_);
+        }
+
+        std::string value_int_impl::get_boostbook() const
+        {
+            return boost::lexical_cast<std::string>(value_);
+        }
+
+        bool value_int_impl::empty() const
+        {
+            return false;
+        }
+    }
+
+    value int_value(int v, value::tag_type t)
+    {
+        return value(new detail::value_int_impl(v, t));
+    }
+
+    ////////////////////////////////////////////////////////////////////////////
     // Strings
 
     namespace detail
@@ -675,11 +733,6 @@
         }
     }
 
-    value list_value(value::tag_type t)
-    {
-        return value(new detail::value_list_impl(t));
-    }
-
     //////////////////////////////////////////////////////////////////////////
     // List builder
     
Modified: trunk/tools/quickbook/src/values.hpp
==============================================================================
--- trunk/tools/quickbook/src/values.hpp	(original)
+++ trunk/tools/quickbook/src/values.hpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -51,6 +51,7 @@
             virtual file_position get_position() const;
             virtual std::string get_quickbook() const;
             virtual std::string get_boostbook() const;
+            virtual int get_int() const;
 
             virtual bool empty() const;
             virtual bool is_list() const;
@@ -110,6 +111,8 @@
             { return value_->get_quickbook(); }
             std::string get_boostbook() const
             { return value_->get_boostbook(); }
+            int get_int() const
+            { return value_->get_int(); }
 
         protected:
             value_node* value_;
@@ -219,8 +222,13 @@
         explicit value(detail::value_node*);
     };
 
+    // Empty
     value empty_value(value::tag_type = value::default_tag);
-    value list_value(value::tag_type = value::default_tag);
+
+    // Integers
+    value int_value(int, value::tag_type = value::default_tag);
+
+    // Boostbook and quickbook strings
     value qbk_value(iterator, iterator, value::tag_type = value::default_tag);
     value qbk_value(std::string const&,
             file_position = file_position(),
Modified: trunk/tools/quickbook/src/values_parse.hpp
==============================================================================
--- trunk/tools/quickbook/src/values_parse.hpp	(original)
+++ trunk/tools/quickbook/src/values_parse.hpp	2011-03-19 12:24:39 EDT (Sat, 19 Mar 2011)
@@ -74,6 +74,12 @@
         {
             b.insert(qbk_value(v, begin.get_position(), tag));
         }
+        
+        void operator()(int v,
+            value::tag_type tag = value::default_tag) const
+        {
+            b.insert(int_value(v, tag));
+        }
 
         value_builder& b;
     };