From c8fc3c9592092e8f9729a18f91462cad8e095c77 Mon Sep 17 00:00:00 2001 From: beder Date: Sun, 11 Sep 2011 17:16:26 -0500 Subject: [PATCH] Implemented the map size computation --- include/yaml-cpp/node/detail/impl.h | 2 +- include/yaml-cpp/node/detail/node_data.h | 5 +++++ src/node/detail/node_data.cpp | 23 +++++++++++++++++++---- test/new-api/nodetests.cpp | 3 +++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/include/yaml-cpp/node/detail/impl.h b/include/yaml-cpp/node/detail/impl.h index 8f32fbe..613e58d 100644 --- a/include/yaml-cpp/node/detail/impl.h +++ b/include/yaml-cpp/node/detail/impl.h @@ -54,7 +54,7 @@ namespace YAML node& k = convert_to_node(key, pMemory); node& v = pMemory->create_node(); - m_map[&k] = &v; + insert_map_pair(k, v); return v; } diff --git a/include/yaml-cpp/node/detail/node_data.h b/include/yaml-cpp/node/detail/node_data.h index 515f15b..232116d 100644 --- a/include/yaml-cpp/node/detail/node_data.h +++ b/include/yaml-cpp/node/detail/node_data.h @@ -64,6 +64,7 @@ namespace YAML void reset_sequence(); void reset_map(); + void insert_map_pair(node& key, node& value); void convert_sequence_to_map(shared_memory_holder pMemory); template @@ -88,6 +89,10 @@ namespace YAML // map typedef std::map node_map; node_map m_map; + + typedef std::pair kv_pair; + typedef std::list kv_pairs; + mutable kv_pairs m_undefinedPairs; }; } } diff --git a/src/node/detail/node_data.cpp b/src/node/detail/node_data.cpp index 94a3a5a..0b460eb 100644 --- a/src/node/detail/node_data.cpp +++ b/src/node/detail/node_data.cpp @@ -75,7 +75,7 @@ namespace YAML switch(m_type) { case NodeType::Sequence: compute_seq_size(); return m_seqSize; - case NodeType::Map: compute_map_size(); return m_map.size(); + case NodeType::Map: compute_map_size(); return m_map.size() - m_undefinedPairs.size(); default: return 0; } @@ -90,6 +90,13 @@ namespace YAML void node_data::compute_map_size() const { + kv_pairs::iterator it = m_undefinedPairs.begin(); + while(it != m_undefinedPairs.end()) { + kv_pairs::iterator jt = boost::next(it); + if(it->first->is_defined() && it->second->is_defined()) + m_undefinedPairs.erase(it); + it = jt; + } } const_node_iterator node_data::begin() const @@ -166,7 +173,7 @@ namespace YAML if(m_type != NodeType::Map) throw std::runtime_error("Can't insert into a non-map node"); - m_map[&key] = &value; + insert_map_pair(key, value); } // indexing @@ -205,7 +212,7 @@ namespace YAML } node& value = pMemory->create_node(); - m_map[&key] = &value; + insert_map_pair(key, value); return value; } @@ -233,6 +240,14 @@ namespace YAML void node_data::reset_map() { m_map.clear(); + m_undefinedPairs.clear(); + } + + void node_data::insert_map_pair(node& key, node& value) + { + m_map[&key] = &value; + if(!key.is_defined() || !value.is_defined()) + m_undefinedPairs.push_back(kv_pair(&key, &value)); } void node_data::convert_sequence_to_map(shared_memory_holder pMemory) @@ -246,7 +261,7 @@ namespace YAML node& key = pMemory->create_node(); key.set_scalar(stream.str()); - m_map[&key] = m_sequence[i]; + insert_map_pair(key, *m_sequence[i]); } reset_sequence(); diff --git a/test/new-api/nodetests.cpp b/test/new-api/nodetests.cpp index 2632215..27da3a4 100644 --- a/test/new-api/nodetests.cpp +++ b/test/new-api/nodetests.cpp @@ -67,6 +67,9 @@ namespace Test YAML_ASSERT(node.Type() == YAML::NodeType::Map); YAML_ASSERT(node["key"].as() == "value"); YAML_ASSERT(node.size() == 1); + node["undefined"] = "monkey"; + YAML_ASSERT(node["undefined"].as() == "monkey"); + YAML_ASSERT(node.size() == 2); return true; } }