Merge 61e237d892 into a2a113c6ff
This commit is contained in:
commit
a1d8c12e1a
@ -239,11 +239,12 @@ inline void Node::Assign(char* rhs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline Node& Node::operator=(const Node& rhs) {
|
inline Node& Node::operator=(const Node& rhs) {
|
||||||
if (!m_isValid || !rhs.m_isValid)
|
AssignData(rhs);
|
||||||
throw InvalidNode();
|
return *this;
|
||||||
if (is(rhs))
|
}
|
||||||
return *this;
|
|
||||||
AssignNode(rhs);
|
inline Node& Node::operator=(const NodeAlias& rhs) {
|
||||||
|
AssignNode(rhs.m_node);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,7 @@ struct iterator_value;
|
|||||||
} // namespace YAML
|
} // namespace YAML
|
||||||
|
|
||||||
namespace YAML {
|
namespace YAML {
|
||||||
|
class YAML_CPP_API NodeAlias;
|
||||||
class YAML_CPP_API Node {
|
class YAML_CPP_API Node {
|
||||||
public:
|
public:
|
||||||
friend class NodeBuilder;
|
friend class NodeBuilder;
|
||||||
@ -81,6 +82,7 @@ class YAML_CPP_API Node {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
Node& operator=(const T& rhs);
|
Node& operator=(const T& rhs);
|
||||||
Node& operator=(const Node& rhs);
|
Node& operator=(const Node& rhs);
|
||||||
|
Node& operator=(const NodeAlias& rhs);
|
||||||
void reset(const Node& rhs = Node());
|
void reset(const Node& rhs = Node());
|
||||||
|
|
||||||
// size/iterator
|
// size/iterator
|
||||||
@ -134,6 +136,14 @@ class YAML_CPP_API Node {
|
|||||||
mutable detail::node* m_pNode;
|
mutable detail::node* m_pNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class NodeAlias {
|
||||||
|
friend class Node;
|
||||||
|
public:
|
||||||
|
NodeAlias(const Node& node) : m_node(node) {}
|
||||||
|
private:
|
||||||
|
const Node& m_node;
|
||||||
|
};
|
||||||
|
|
||||||
YAML_CPP_API bool operator==(const Node& lhs, const Node& rhs);
|
YAML_CPP_API bool operator==(const Node& lhs, const Node& rhs);
|
||||||
|
|
||||||
YAML_CPP_API Node Clone(const Node& node);
|
YAML_CPP_API Node Clone(const Node& node);
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
#include "handler_test.h"
|
#include "handler_test.h"
|
||||||
#include "specexamples.h" // IWYU pragma: keep
|
|
||||||
#include "yaml-cpp/yaml.h" // IWYU pragma: keep
|
#include "yaml-cpp/yaml.h" // IWYU pragma: keep
|
||||||
|
|
||||||
#include "gmock/gmock.h"
|
#include "gmock/gmock.h"
|
||||||
|
|||||||
@ -98,6 +98,22 @@ TEST(LoadNodeTest, IterateMap) {
|
|||||||
EXPECT_EQ(3, i);
|
EXPECT_EQ(3, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(LoadNodeTest, AliasMultipleAssign) {
|
||||||
|
Node doc = Load("{A: &DEFAULT {str: string, int: 42, float: 3.1415}, B: *DEFAULT}");
|
||||||
|
|
||||||
|
for (YAML::const_iterator it = doc.begin(); it != doc.end(); ++it) {
|
||||||
|
SCOPED_TRACE("group " + it->first.as<std::string>());
|
||||||
|
Node value;
|
||||||
|
|
||||||
|
value = it->second["str"];
|
||||||
|
EXPECT_STREQ(value.as<std::string>().c_str(), "string");
|
||||||
|
value = it->second["float"];
|
||||||
|
EXPECT_EQ(value.as<float>(), 3.1415f);
|
||||||
|
value = it->second["int"];
|
||||||
|
EXPECT_EQ(value.as<int>(), 42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef BOOST_FOREACH
|
#ifdef BOOST_FOREACH
|
||||||
TEST(LoadNodeTest, ForEach) {
|
TEST(LoadNodeTest, ForEach) {
|
||||||
Node node = Load("[1, 3, 5, 7]");
|
Node node = Load("[1, 3, 5, 7]");
|
||||||
|
|||||||
@ -296,7 +296,7 @@ TEST(NodeTest, StdPair) {
|
|||||||
TEST(NodeTest, SimpleAlias) {
|
TEST(NodeTest, SimpleAlias) {
|
||||||
Node node;
|
Node node;
|
||||||
node["foo"] = "value";
|
node["foo"] = "value";
|
||||||
node["bar"] = node["foo"];
|
node["bar"] = NodeAlias(node["foo"]);
|
||||||
EXPECT_EQ("value", node["foo"].as<std::string>());
|
EXPECT_EQ("value", node["foo"].as<std::string>());
|
||||||
EXPECT_EQ("value", node["bar"].as<std::string>());
|
EXPECT_EQ("value", node["bar"].as<std::string>());
|
||||||
EXPECT_EQ(node["bar"], node["foo"]);
|
EXPECT_EQ(node["bar"], node["foo"]);
|
||||||
@ -316,7 +316,7 @@ TEST(NodeTest, AliasAsKey) {
|
|||||||
|
|
||||||
TEST(NodeTest, SelfReferenceSequence) {
|
TEST(NodeTest, SelfReferenceSequence) {
|
||||||
Node node;
|
Node node;
|
||||||
node[0] = node;
|
node[0] = NodeAlias(node);
|
||||||
EXPECT_TRUE(node.IsSequence());
|
EXPECT_TRUE(node.IsSequence());
|
||||||
EXPECT_EQ(1, node.size());
|
EXPECT_EQ(1, node.size());
|
||||||
EXPECT_EQ(node, node[0]);
|
EXPECT_EQ(node, node[0]);
|
||||||
@ -326,7 +326,7 @@ TEST(NodeTest, SelfReferenceSequence) {
|
|||||||
|
|
||||||
TEST(NodeTest, ValueSelfReferenceMap) {
|
TEST(NodeTest, ValueSelfReferenceMap) {
|
||||||
Node node;
|
Node node;
|
||||||
node["key"] = node;
|
node["key"] = NodeAlias(node);
|
||||||
EXPECT_TRUE(node.IsMap());
|
EXPECT_TRUE(node.IsMap());
|
||||||
EXPECT_EQ(1, node.size());
|
EXPECT_EQ(1, node.size());
|
||||||
EXPECT_EQ(node, node["key"]);
|
EXPECT_EQ(node, node["key"]);
|
||||||
@ -344,7 +344,7 @@ TEST(NodeTest, KeySelfReferenceMap) {
|
|||||||
|
|
||||||
TEST(NodeTest, SelfReferenceMap) {
|
TEST(NodeTest, SelfReferenceMap) {
|
||||||
Node node;
|
Node node;
|
||||||
node[node] = node;
|
node[node] = NodeAlias(node);
|
||||||
EXPECT_TRUE(node.IsMap());
|
EXPECT_TRUE(node.IsMap());
|
||||||
EXPECT_EQ(1, node.size());
|
EXPECT_EQ(1, node.size());
|
||||||
EXPECT_EQ(node, node[node]);
|
EXPECT_EQ(node, node[node]);
|
||||||
@ -364,7 +364,7 @@ TEST(NodeTest, TempMapVariable) {
|
|||||||
TEST(NodeTest, TempMapVariableAlias) {
|
TEST(NodeTest, TempMapVariableAlias) {
|
||||||
Node node;
|
Node node;
|
||||||
Node tmp = node["key"];
|
Node tmp = node["key"];
|
||||||
tmp = node["other"];
|
tmp = NodeAlias(node["other"]);
|
||||||
node["other"] = "value";
|
node["other"] = "value";
|
||||||
EXPECT_TRUE(node.IsMap());
|
EXPECT_TRUE(node.IsMap());
|
||||||
EXPECT_EQ(2, node.size());
|
EXPECT_EQ(2, node.size());
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user