mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 20:51:16 +00:00
Implemented the map size computation
This commit is contained in:
@@ -54,7 +54,7 @@ namespace YAML
|
|||||||
|
|
||||||
node& k = convert_to_node(key, pMemory);
|
node& k = convert_to_node(key, pMemory);
|
||||||
node& v = pMemory->create_node();
|
node& v = pMemory->create_node();
|
||||||
m_map[&k] = &v;
|
insert_map_pair(k, v);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -64,6 +64,7 @@ namespace YAML
|
|||||||
|
|
||||||
void reset_sequence();
|
void reset_sequence();
|
||||||
void reset_map();
|
void reset_map();
|
||||||
|
void insert_map_pair(node& key, node& value);
|
||||||
void convert_sequence_to_map(shared_memory_holder pMemory);
|
void convert_sequence_to_map(shared_memory_holder pMemory);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@@ -88,6 +89,10 @@ namespace YAML
|
|||||||
// map
|
// map
|
||||||
typedef std::map<node *, node *> node_map;
|
typedef std::map<node *, node *> node_map;
|
||||||
node_map m_map;
|
node_map m_map;
|
||||||
|
|
||||||
|
typedef std::pair<node *, node *> kv_pair;
|
||||||
|
typedef std::list<kv_pair> kv_pairs;
|
||||||
|
mutable kv_pairs m_undefinedPairs;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -75,7 +75,7 @@ namespace YAML
|
|||||||
|
|
||||||
switch(m_type) {
|
switch(m_type) {
|
||||||
case NodeType::Sequence: compute_seq_size(); return m_seqSize;
|
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:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -90,6 +90,13 @@ namespace YAML
|
|||||||
|
|
||||||
void node_data::compute_map_size() const
|
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
|
const_node_iterator node_data::begin() const
|
||||||
@@ -166,7 +173,7 @@ namespace YAML
|
|||||||
if(m_type != NodeType::Map)
|
if(m_type != NodeType::Map)
|
||||||
throw std::runtime_error("Can't insert into a non-map node");
|
throw std::runtime_error("Can't insert into a non-map node");
|
||||||
|
|
||||||
m_map[&key] = &value;
|
insert_map_pair(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// indexing
|
// indexing
|
||||||
@@ -205,7 +212,7 @@ namespace YAML
|
|||||||
}
|
}
|
||||||
|
|
||||||
node& value = pMemory->create_node();
|
node& value = pMemory->create_node();
|
||||||
m_map[&key] = &value;
|
insert_map_pair(key, value);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,6 +240,14 @@ namespace YAML
|
|||||||
void node_data::reset_map()
|
void node_data::reset_map()
|
||||||
{
|
{
|
||||||
m_map.clear();
|
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)
|
void node_data::convert_sequence_to_map(shared_memory_holder pMemory)
|
||||||
@@ -246,7 +261,7 @@ namespace YAML
|
|||||||
|
|
||||||
node& key = pMemory->create_node();
|
node& key = pMemory->create_node();
|
||||||
key.set_scalar(stream.str());
|
key.set_scalar(stream.str());
|
||||||
m_map[&key] = m_sequence[i];
|
insert_map_pair(key, *m_sequence[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
reset_sequence();
|
reset_sequence();
|
||||||
|
@@ -67,6 +67,9 @@ namespace Test
|
|||||||
YAML_ASSERT(node.Type() == YAML::NodeType::Map);
|
YAML_ASSERT(node.Type() == YAML::NodeType::Map);
|
||||||
YAML_ASSERT(node["key"].as<std::string>() == "value");
|
YAML_ASSERT(node["key"].as<std::string>() == "value");
|
||||||
YAML_ASSERT(node.size() == 1);
|
YAML_ASSERT(node.size() == 1);
|
||||||
|
node["undefined"] = "monkey";
|
||||||
|
YAML_ASSERT(node["undefined"].as<std::string>() == "monkey");
|
||||||
|
YAML_ASSERT(node.size() == 2);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user