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";