From b0a4de3dd9aa4841f3747d70156e8c206bdc4924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Rombauts?= Date: Tue, 26 May 2015 18:24:22 +0200 Subject: [PATCH 1/2] Fix missing/TODO links to 0.3.0 and 0.5.2 releases in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8689fee..54263ef 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,8 @@ cmake [-G generator] [-DBUILD_SHARED_LIBS=ON|OFF] .. # Recent Release # -[yaml-cpp 0.5.2](TODO) has been released! This is a bug fix release. +[yaml-cpp 0.5.2](https://github.com/jbeder/yaml-cpp/releases/tag/release-0.5.2) has been released! This is a bug fix release. -[yaml-cpp 0.3.0](TODO) is still available if you want the old API. +[yaml-cpp 0.3.0](https://github.com/jbeder/yaml-cpp/releases/tag/release-0.3.0) is still available if you want the old API. **The old API will continue to be supported, and will still receive bugfixes!** The 0.3.x and 0.4.x versions will be old API releases, and 0.5.x and above will all be new API releases. From b426fafff6238dda8d86fa668f585cba732dd272 Mon Sep 17 00:00:00 2001 From: Jonathan Hamilton Date: Mon, 1 Jun 2015 13:33:59 -0700 Subject: [PATCH 2/2] Fix some Node::operator[] regressions from 0.5.1 "const Node Node::operator[](const Key& key) const" changed from returning new empty node if the key was missing in 0.5.1 to returning a shared 'zombie' node in 0.5.2 to resolve a memory leak. (Specifically 1025f76df1b32b6ec3571ca928d7797a768a3341 was where this was introduced) This caused some regressions where this 'zombie' object threw exceptions in some functions where the 'empty' object would not. This change fixes the Node::as(fallback) method (to return the 'fallback' instead of throwing an exception) and the Node::begin()/Node::end() methods to return default-constructed iterators (so begin() == end() in such cases) instead of another exception. --- include/yaml-cpp/node/impl.h | 10 +++++----- test/node/node_test.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h index 26cccbd..69db1b7 100644 --- a/include/yaml-cpp/node/impl.h +++ b/include/yaml-cpp/node/impl.h @@ -149,7 +149,7 @@ inline const T Node::as() const { template inline const T Node::as(const S& fallback) const { if (!m_isValid) - throw InvalidNode(); + return fallback; return as_if(*this)(fallback); } @@ -282,26 +282,26 @@ inline std::size_t Node::size() const { inline const_iterator Node::begin() const { if (!m_isValid) - throw InvalidNode(); + return const_iterator(); return m_pNode ? const_iterator(m_pNode->begin(), m_pMemory) : const_iterator(); } inline iterator Node::begin() { if (!m_isValid) - throw InvalidNode(); + return iterator(); return m_pNode ? iterator(m_pNode->begin(), m_pMemory) : iterator(); } inline const_iterator Node::end() const { if (!m_isValid) - throw InvalidNode(); + return const_iterator(); return m_pNode ? const_iterator(m_pNode->end(), m_pMemory) : const_iterator(); } inline iterator Node::end() { if (!m_isValid) - throw InvalidNode(); + return iterator(); return m_pNode ? iterator(m_pNode->end(), m_pMemory) : iterator(); } diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index 03ad782..b00c69d 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -80,6 +80,12 @@ TEST(NodeTest, MapWithUndefinedValues) { EXPECT_EQ(2, node.size()); } +TEST(NodeTest, UndefinedConstNodeWithFallback) { + Node node; + const Node& cn = node; + EXPECT_EQ(cn["undefined"].as(3), 3); +} + TEST(NodeTest, MapIteratorWithUndefinedValues) { Node node; node["key"] = "value"; @@ -91,6 +97,32 @@ TEST(NodeTest, MapIteratorWithUndefinedValues) { EXPECT_EQ(1, count); } +TEST(NodeTest, ConstIteratorOnConstUndefinedNode) { + Node node; + const Node& cn = node; + const Node& undefinedCn = cn["undefined"]; + + std::size_t count = 0; + for (const_iterator it = undefinedCn.begin(); it != undefinedCn.end(); ++it) { + count++; + } + EXPECT_EQ(0, count); +} + +TEST(NodeTest, IteratorOnConstUndefinedNode) { + Node node; + const Node& cn = node; + const Node& undefinedCn = cn["undefined"]; + + Node& nonConstUndefinedNode = const_cast(undefinedCn); + + std::size_t count = 0; + for (iterator it = nonConstUndefinedNode.begin(); it != nonConstUndefinedNode.end(); ++it) { + count++; + } + EXPECT_EQ(0, count); +} + TEST(NodeTest, SimpleSubkeys) { Node node; node["device"]["udid"] = "12345";