From ff2fd55ac60eb870d809295703be8bfb126f8742 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Thu, 24 Mar 2011 21:25:50 +0000 Subject: [PATCH] Quickbook: Use a different type for stored values. And fix some bugs in the process. [SVN r70529] --- src/actions.cpp | 2 +- src/code_snippet.cpp | 2 +- src/template_stack.cpp | 2 +- src/template_stack.hpp | 4 +-- src/values.cpp | 64 +++++++++++++++++++++++++++--------------- src/values.hpp | 26 ++++++++++++----- 6 files changed, 66 insertions(+), 34 deletions(-) diff --git a/src/actions.cpp b/src/actions.cpp index e83d192..3e75fa3 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -999,7 +999,7 @@ namespace quickbook body.filename); body.content = qbk_value(begin, pos.first, - body.content.get_tag()).store(); + body.content.get_tag()); args.push_back(second); } } diff --git a/src/code_snippet.cpp b/src/code_snippet.cpp index 54c621e..d5aac18 100644 --- a/src/code_snippet.cpp +++ b/src/code_snippet.cpp @@ -395,7 +395,7 @@ namespace quickbook if(!snippet_stack) return; code += "``[[callout" + boost::lexical_cast(callout_id) + "]]``"; - snippet_stack->callouts.insert(qbk_value(first, last, template_tags::block).store()); + snippet_stack->callouts.insert(qbk_value(first, last, template_tags::block)); ++callout_id; } diff --git a/src/template_stack.cpp b/src/template_stack.cpp index f7d9f8d..a2059c3 100644 --- a/src/template_stack.cpp +++ b/src/template_stack.cpp @@ -20,7 +20,7 @@ namespace quickbook value const& content, fs::path const& filename ) - : content(content.store()) + : content(content) , filename(filename) { assert(content.get_tag() == template_tags::block || diff --git a/src/template_stack.hpp b/src/template_stack.hpp index 6119305..c053c71 100644 --- a/src/template_stack.hpp +++ b/src/template_stack.hpp @@ -31,7 +31,7 @@ namespace quickbook template_body(value const&, fs::path const&); bool is_block() const; - value content; + stored_value content; fs::path filename; }; @@ -60,7 +60,7 @@ namespace quickbook // or static_parent for clarity. template_scope const* parent; - value callouts; + stored_value callouts; }; typedef boost::spirit::classic::symbols template_symbols; diff --git a/src/values.cpp b/src/values.cpp index ae73dc2..e110c2d 100644 --- a/src/values.cpp +++ b/src/values.cpp @@ -145,21 +145,10 @@ namespace quickbook intrusive_ptr_add_ref(value_); } - value_counted& value_counted::operator=(value_counted x) - { - swap(x); - return *this; - } - value_counted::~value_counted() { intrusive_ptr_release(value_); } - - value value_counted::store() const - { - return value(value_->store()); - } } //////////////////////////////////////////////////////////////////////////// @@ -175,7 +164,7 @@ namespace quickbook { } - value::value(detail::value_ref x) + value::value(detail::value_base const& x) : detail::value_counted(x) { } @@ -184,7 +173,37 @@ namespace quickbook : detail::value_counted(x) { } - + + value& value::operator=(value x) + { + swap(x); + return *this; + } + + //////////////////////////////////////////////////////////////////////////// + // stored_value + + stored_value::stored_value() + : detail::value_counted() + { + } + + stored_value::stored_value(stored_value const& x) + : detail::value_counted(x) + { + } + + stored_value::stored_value(detail::value_base const& x) + : detail::value_counted(x.store()) + { + } + + stored_value& stored_value::operator=(stored_value x) + { + swap(x); + return *this; + } + //////////////////////////////////////////////////////////////////////////// // Iterator @@ -720,15 +739,16 @@ namespace quickbook value_list_builder build; - for(value_node* pos2 = head_; - pos2 != &value_nil_impl::instance; - pos2 = pos2->next_) - { - if(pos2 == pos) - build.append(new_node.get()); - else - build.append(pos2); - } + value_node* pos2 = head_; + + for(;pos2 != pos; pos2 = pos2->next_) + build.append(pos2); + + build.append(new_node.get()); + pos2 = pos2->next_; + + for(;pos2 != &value_nil_impl::instance; pos2 = pos2->next_) + build.append(pos2->store()); return new value_list_impl(build.get(), tag_); } diff --git a/src/values.hpp b/src/values.hpp index 09e45da..7eb2325 100644 --- a/src/values.hpp +++ b/src/values.hpp @@ -23,6 +23,7 @@ namespace quickbook { class value; + class stored_value; class value_builder; class value_error; @@ -98,9 +99,8 @@ namespace quickbook ~value_base() {} - public: void swap(value_base& x) { std::swap(value_, x.value_); } - + public: bool check() const { return value_->check(); } bool empty() const { return value_->empty(); } bool is_list() const { return value_->is_list(); } @@ -122,6 +122,8 @@ namespace quickbook int get_int() const { return value_->get_int(); } + value_node* store() const { return value_->store(); } + protected: value_node* value_; @@ -181,15 +183,13 @@ namespace quickbook class value_counted : public value_base { - public: + value_counted& operator=(value_counted const&); + protected: value_counted(); value_counted(value_counted const&); value_counted(value_base const&); value_counted(value_node*); - value_counted& operator=(value_counted); ~value_counted(); - - value store() const; }; //////////////////////////////////////////////////////////////////////// @@ -226,8 +226,20 @@ namespace quickbook public: value(); value(value const&); - value(detail::value_ref); + value(detail::value_base const&); explicit value(detail::value_node*); + value& operator=(value); + void swap(value& x) { detail::value_counted::swap(x); } + }; + + class stored_value : public detail::value_counted + { + public: + stored_value(); + stored_value(stored_value const&); + stored_value(detail::value_base const&); + stored_value& operator=(stored_value); + void swap(stored_value& x) { detail::value_counted::swap(x); } }; // Empty