diff --git a/src/actions.cpp b/src/actions.cpp index 3e75fa3..7a28810 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -74,7 +74,7 @@ namespace quickbook void element_action::operator()(iterator first, iterator) const { - value_consumer values = actions.values.get(); + value_consumer values = actions.values.release(); if(!values.check()) return; value v = values.consume(); if(values.check()) return; @@ -347,7 +347,7 @@ namespace quickbook assert(tag != 0); detail::markup markup = detail::get_markup(tag); - value_consumer values = actions.values.get(); + value_consumer values = actions.values.release(); value content = values.consume(); values.finish(); @@ -367,7 +367,7 @@ namespace quickbook { saved_suppress = actions.suppress; - value_consumer values = actions.values.get(); + value_consumer values = actions.values.release(); bool condition = find(actions.macro, values.consume().get_quickbook().c_str()); @@ -1109,7 +1109,7 @@ namespace quickbook file_position const pos = first.get_position(); // Get the arguments - value_consumer values = actions.values.get(); + value_consumer values = actions.values.release(); bool template_escape = values.check(template_tags::escape); if(template_escape) values.consume(); diff --git a/src/code_snippet.cpp b/src/code_snippet.cpp index d5aac18..a88ee77 100644 --- a/src/code_snippet.cpp +++ b/src/code_snippet.cpp @@ -429,7 +429,7 @@ namespace quickbook append_code(); boost::shared_ptr snippet = pop_snippet_data(); - value callouts = snippet->callouts.get(); + value callouts = snippet->callouts.release(); std::string body; if(snippet->start_code) { diff --git a/src/doc_info_actions.cpp b/src/doc_info_actions.cpp index 2d7939e..97b5c58 100644 --- a/src/doc_info_actions.cpp +++ b/src/doc_info_actions.cpp @@ -73,7 +73,7 @@ namespace quickbook // The doc_info in the file has been parsed. Here's what we'll do // *before* anything else. - value_consumer values = actions.values.get(); + value_consumer values = actions.values.release(); // Skip over invalid attributes diff --git a/src/values.cpp b/src/values.cpp index e110c2d..5e49658 100644 --- a/src/values.cpp +++ b/src/values.cpp @@ -194,7 +194,7 @@ namespace quickbook } stored_value::stored_value(detail::value_base const& x) - : detail::value_counted(x.store()) + : detail::value_counted(x.value_->store()) { } @@ -689,8 +689,10 @@ namespace quickbook struct value_list_impl : public value_node { value_list_impl(value::tag_type); - value_list_impl(value_node*, value::tag_type); + value_list_impl(value_list_builder&, value::tag_type); private: + value_list_impl(value_list_impl const&); + char const* type_name() const { return "list"; } virtual ~value_list_impl(); @@ -708,8 +710,14 @@ namespace quickbook : value_node(tag), head_(&value_nil_impl::instance) {} - value_list_impl::value_list_impl(value_node* ptr, value::tag_type tag) - : value_node(tag), head_(ptr) + value_list_impl::value_list_impl(value_list_builder& builder, + value::tag_type tag) + : value_node(tag), head_(builder.release()) + { + } + + value_list_impl::value_list_impl(value_list_impl const& x) + : value_node(x.tag_), head_(x.head_) { list_ref(head_); } @@ -721,7 +729,7 @@ namespace quickbook value_node* value_list_impl::clone() const { - return new value_list_impl(head_, tag_); + return new value_list_impl(*this); } value_node* value_list_impl::store() @@ -750,7 +758,7 @@ namespace quickbook for(;pos2 != &value_nil_impl::instance; pos2 = pos2->next_) build.append(pos2->store()); - return new value_list_impl(build.get(), tag_); + return new value_list_impl(build, tag_); } @@ -799,8 +807,11 @@ namespace quickbook if(other.back_ == &head_) other.back_ = &other.head_; } - value_node* value_list_builder::get() const { - return head_; + value_node* value_list_builder::release() { + value_node* r = head_; + head_ = &value_nil_impl::instance; + back_ = &head_; + return r; } void value_list_builder::append(value_node* item) @@ -847,8 +858,8 @@ namespace quickbook swap(*store); } - value value_builder::get() { - return value(new detail::value_list_impl(current.get(), list_tag)); + value value_builder::release() { + return value(new detail::value_list_impl(current, list_tag)); } void value_builder::reset() { @@ -876,7 +887,7 @@ namespace quickbook } void value_builder::finish_list() { - value list = get(); + value list = release(); restore(); insert(list); } diff --git a/src/values.hpp b/src/values.hpp index 7eb2325..093395b 100644 --- a/src/values.hpp +++ b/src/values.hpp @@ -122,14 +122,13 @@ namespace quickbook int get_int() const { return value_->get_int(); } - value_node* store() const { return value_->store(); } - protected: value_node* value_; // value_builder needs to access 'value_' to get the node // from a value. friend class quickbook::value_builder; + friend class quickbook::stored_value; }; //////////////////////////////////////////////////////////////////////// @@ -206,7 +205,7 @@ namespace quickbook value_list_builder(value_node*); ~value_list_builder(); void swap(value_list_builder& b); - value_node* get() const; + value_node* release(); void append(value_node*); void sort(); @@ -272,7 +271,7 @@ namespace quickbook void save(); void restore(); - value get(); + value release(); void reset(); void set_tag(value::tag_type); diff --git a/src/values_parse.hpp b/src/values_parse.hpp index 9897994..a65a3fd 100644 --- a/src/values_parse.hpp +++ b/src/values_parse.hpp @@ -123,7 +123,7 @@ namespace quickbook { , sort(builder) {} - value get() { return builder.get(); } + value release() { return builder.release(); } value_builder builder; scoped_parser save; diff --git a/test/unit/values_test.cpp b/test/unit/values_test.cpp index 23e7194..38b91e1 100644 --- a/test/unit/values_test.cpp +++ b/test/unit/values_test.cpp @@ -39,7 +39,7 @@ void sort_test() b.insert(quickbook::bbk_value("d", 8)); b.sort_list(); - quickbook::value_consumer c = b.get(); + quickbook::value_consumer c = b.release(); BOOST_TEST(c.check(2)); BOOST_TEST_EQ(c.consume(2).get_boostbook(), "b"); BOOST_TEST(c.check(5)); c.consume(5); BOOST_TEST(c.check(8)); c.consume(8); @@ -62,8 +62,8 @@ void multiple_list_test() list2.insert(quickbook::bbk_value("c", 3)); - quickbook::value_consumer l1 = list1.get(); list1.reset(); - quickbook::value_consumer l2 = list2.get(); list2.reset(); + quickbook::value_consumer l1 = list1.release(); + quickbook::value_consumer l2 = list2.release(); BOOST_TEST(l1.check(10)); BOOST_TEST_EQ(l1.consume(10).get_boostbook(), "b"); @@ -80,18 +80,19 @@ void multiple_list_test() void store_test1() { - quickbook::value q; + quickbook::stored_value q; { std::string src = "Hello"; - q = quickbook::qbk_value( + quickbook::value q1 = quickbook::qbk_value( quickbook::iterator(src.begin()), quickbook::iterator(src.end()), 5); + BOOST_TEST_EQ(q1.get_quickbook(), "Hello"); + q = q1; BOOST_TEST_EQ(q.get_quickbook(), "Hello"); - q.store(); - BOOST_TEST_EQ(q.get_quickbook(), "Hello"); + BOOST_TEST_EQ(q1.get_quickbook(), "Hello"); } BOOST_TEST_EQ(q.get_quickbook(), "Hello"); @@ -109,7 +110,7 @@ void store_test2_check(quickbook::value const& q) void store_test2() { - quickbook::value q; + quickbook::stored_value q; { quickbook::value_builder list1; @@ -120,11 +121,12 @@ void store_test2() 5)); list1.insert(quickbook::bbk_value("World", 10)); - q = list1.get(); + quickbook::value q2 = list1.release(); + store_test2_check(q2); + q = q2; store_test2_check(q); - q.store(); - store_test2_check(q); + store_test2_check(q2); } store_test2_check(q); }