Commit d63ec48c authored by Jesse Beder's avatar Jesse Beder
Browse files

Run clang-format

parent 3355bbb3
#ifndef YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #ifndef YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#define YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once #pragma once
#endif #endif
...@@ -18,4 +20,4 @@ ...@@ -18,4 +20,4 @@
#include "yaml-cpp/node/parse.h" #include "yaml-cpp/node/parse.h"
#include "yaml-cpp/node/emit.h" #include "yaml-cpp/node/emit.h"
#endif // YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66
...@@ -2,82 +2,72 @@ ...@@ -2,82 +2,72 @@
#include "yaml-cpp/node/impl.h" #include "yaml-cpp/node/impl.h"
#include <algorithm> #include <algorithm>
namespace namespace {
{ // we're not gonna mess with the mess that is all the isupper/etc. functions
// we're not gonna mess with the mess that is all the isupper/etc. functions bool IsLower(char ch) { return 'a' <= ch && ch <= 'z'; }
bool IsLower(char ch) { return 'a' <= ch && ch <= 'z'; } bool IsUpper(char ch) { return 'A' <= ch && ch <= 'Z'; }
bool IsUpper(char ch) { return 'A' <= ch && ch <= 'Z'; } char ToLower(char ch) { return IsUpper(ch) ? ch + 'a' - 'A' : ch; }
char ToLower(char ch) { return IsUpper(ch) ? ch + 'a' - 'A' : ch; }
std::string tolower(const std::string& str) {
std::string tolower(const std::string& str) std::string s(str);
{ std::transform(s.begin(), s.end(), s.begin(), ToLower);
std::string s(str); return s;
std::transform(s.begin(), s.end(), s.begin(), ToLower); }
return s;
} template <typename T>
bool IsEntirely(const std::string& str, T func) {
template <typename T> for (std::size_t i = 0; i < str.size(); i++)
bool IsEntirely(const std::string& str, T func) if (!func(str[i]))
{ return false;
for(std::size_t i=0;i<str.size();i++)
if(!func(str[i])) return true;
return false;
return true;
}
// IsFlexibleCase
// . Returns true if 'str' is:
// . UPPERCASE
// . lowercase
// . Capitalized
bool IsFlexibleCase(const std::string& str)
{
if(str.empty())
return true;
if(IsEntirely(str, IsLower))
return true;
bool firstcaps = IsUpper(str[0]);
std::string rest = str.substr(1);
return firstcaps && (IsEntirely(rest, IsLower) || IsEntirely(rest, IsUpper));
}
} }
namespace YAML // IsFlexibleCase
{ // . Returns true if 'str' is:
bool convert<bool>::decode(const Node& node, bool& rhs) { // . UPPERCASE
if(!node.IsScalar()) // . lowercase
return false; // . Capitalized
bool IsFlexibleCase(const std::string& str) {
// we can't use iostream bool extraction operators as they don't if (str.empty())
// recognize all possible values in the table below (taken from return true;
// http://yaml.org/type/bool.html)
static const struct { if (IsEntirely(str, IsLower))
std::string truename, falsename; return true;
} names[] = {
{ "y", "n" }, bool firstcaps = IsUpper(str[0]);
{ "yes", "no" }, std::string rest = str.substr(1);
{ "true", "false" }, return firstcaps && (IsEntirely(rest, IsLower) || IsEntirely(rest, IsUpper));
{ "on", "off" }, }
}; }
if(!IsFlexibleCase(node.Scalar())) namespace YAML {
return false; bool convert<bool>::decode(const Node& node, bool& rhs) {
if (!node.IsScalar())
for(unsigned i=0;i<sizeof(names)/sizeof(names[0]);i++) { return false;
if(names[i].truename == tolower(node.Scalar())) {
rhs = true; // we can't use iostream bool extraction operators as they don't
return true; // recognize all possible values in the table below (taken from
} // http://yaml.org/type/bool.html)
static const struct {
if(names[i].falsename == tolower(node.Scalar())) { std::string truename, falsename;
rhs = false; } names[] = {{"y", "n"}, {"yes", "no"}, {"true", "false"}, {"on", "off"}, };
return true;
} if (!IsFlexibleCase(node.Scalar()))
} return false;
return false; for (unsigned i = 0; i < sizeof(names) / sizeof(names[0]); i++) {
} if (names[i].truename == tolower(node.Scalar())) {
rhs = true;
return true;
}
if (names[i].falsename == tolower(node.Scalar())) {
rhs = false;
return true;
}
}
return false;
}
} }
...@@ -3,27 +3,23 @@ ...@@ -3,27 +3,23 @@
#include "yaml-cpp/emitter.h" #include "yaml-cpp/emitter.h"
#include "nodeevents.h" #include "nodeevents.h"
namespace YAML namespace YAML {
{ Emitter& operator<<(Emitter& out, const Node& node) {
Emitter& operator << (Emitter& out, const Node& node) EmitFromEvents emitFromEvents(out);
{ NodeEvents events(node);
EmitFromEvents emitFromEvents(out); events.Emit(emitFromEvents);
NodeEvents events(node); return out;
events.Emit(emitFromEvents); }
return out;
} std::ostream& operator<<(std::ostream& out, const Node& node) {
Emitter emitter(out);
std::ostream& operator << (std::ostream& out, const Node& node) emitter << node;
{ return out;
Emitter emitter(out); }
emitter << node;
return out;
}
std::string Dump(const Node& node) std::string Dump(const Node& node) {
{ Emitter emitter;
Emitter emitter; emitter << node;
emitter << node; return emitter.c_str();
return emitter.c_str(); }
}
} }
#include "yaml-cpp/node/detail/memory.h" #include "yaml-cpp/node/detail/memory.h"
#include "yaml-cpp/node/detail/node.h" #include "yaml-cpp/node/detail/node.h"
namespace YAML namespace YAML {
{ namespace detail {
namespace detail void memory_holder::merge(memory_holder& rhs) {
{ if (m_pMemory == rhs.m_pMemory)
void memory_holder::merge(memory_holder& rhs) return;
{
if(m_pMemory == rhs.m_pMemory) m_pMemory->merge(*rhs.m_pMemory);
return; rhs.m_pMemory = m_pMemory;
}
m_pMemory->merge(*rhs.m_pMemory);
rhs.m_pMemory = m_pMemory; node& memory::create_node() {
} shared_node pNode(new node);
m_nodes.insert(pNode);
node& memory::create_node() return *pNode;
{ }
shared_node pNode(new node);
m_nodes.insert(pNode); void memory::merge(const memory& rhs) {
return *pNode; m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end());
} }
}
void memory::merge(const memory& rhs)
{
m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end());
}
}
} }
...@@ -2,13 +2,11 @@ ...@@ -2,13 +2,11 @@
#include "nodebuilder.h" #include "nodebuilder.h"
#include "nodeevents.h" #include "nodeevents.h"
namespace YAML namespace YAML {
{ Node Clone(const Node& node) {
Node Clone(const Node& node) NodeEvents events(node);
{ NodeBuilder builder;
NodeEvents events(node); events.Emit(builder);
NodeBuilder builder; return builder.Root();
events.Emit(builder); }
return builder.Root();
}
} }
...@@ -4,292 +4,280 @@ ...@@ -4,292 +4,280 @@
#include "yaml-cpp/exceptions.h" #include "yaml-cpp/exceptions.h"
#include <sstream> #include <sstream>
namespace YAML namespace YAML {
{ namespace detail {
namespace detail std::string node_data::empty_scalar;
{
std::string node_data::empty_scalar; node_data::node_data()
: m_isDefined(false), m_type(NodeType::Null), m_seqSize(0) {}
node_data::node_data(): m_isDefined(false), m_type(NodeType::Null), m_seqSize(0)
{ void node_data::mark_defined() {
} if (m_type == NodeType::Undefined)
m_type = NodeType::Null;
void node_data::mark_defined() m_isDefined = true;
{ }
if(m_type == NodeType::Undefined)
m_type = NodeType::Null; void node_data::set_type(NodeType::value type) {
m_isDefined = true; if (type == NodeType::Undefined) {
} m_type = type;
m_isDefined = false;
void node_data::set_type(NodeType::value type) return;
{ }
if(type == NodeType::Undefined) {
m_type = type; m_isDefined = true;
m_isDefined = false; if (type == m_type)
return; return;
}
m_type = type;
m_isDefined = true; switch (m_type) {
if(type == m_type) case NodeType::Null:
return; break;
case NodeType::Scalar:
m_type = type; m_scalar.clear();
break;
switch(m_type) { case NodeType::Sequence:
case NodeType::Null: reset_sequence();
break; break;
case NodeType::Scalar: case NodeType::Map:
m_scalar.clear(); reset_map();
break; break;
case NodeType::Sequence: case NodeType::Undefined:
reset_sequence(); assert(false);
break; break;
case NodeType::Map: }
reset_map(); }
break;
case NodeType::Undefined: void node_data::set_tag(const std::string& tag) { m_tag = tag; }
assert(false);
break; void node_data::set_null() {
} m_isDefined = true;
} m_type = NodeType::Null;
}
void node_data::set_tag(const std::string& tag)
{ void node_data::set_scalar(const std::string& scalar) {
m_tag = tag; m_isDefined = true;
} m_type = NodeType::Scalar;
m_scalar = scalar;
void node_data::set_null() }
{
m_isDefined = true; // size/iterator
m_type = NodeType::Null; std::size_t node_data::size() const {
} if (!m_isDefined)
return 0;
void node_data::set_scalar(const std::string& scalar)
{ switch (m_type) {
m_isDefined = true; case NodeType::Sequence:
m_type = NodeType::Scalar; compute_seq_size();
m_scalar = scalar; return m_seqSize;
} case NodeType::Map:
compute_map_size();
// size/iterator return m_map.size() - m_undefinedPairs.size();
std::size_t node_data::size() const default:
{ return 0;
if(!m_isDefined) }
return 0; return 0;
}
switch(m_type) {
case NodeType::Sequence: compute_seq_size(); return m_seqSize; void node_data::compute_seq_size() const {
case NodeType::Map: compute_map_size(); return m_map.size() - m_undefinedPairs.size(); while (m_seqSize < m_sequence.size() && m_sequence[m_seqSize]->is_defined())
default: m_seqSize++;
return 0; }
}
return 0; void node_data::compute_map_size() const {
} kv_pairs::iterator it = m_undefinedPairs.begin();
while (it != m_undefinedPairs.end()) {
void node_data::compute_seq_size() const kv_pairs::iterator jt = boost::next(it);
{ if (it->first->is_defined() && it->second->is_defined())
while(m_seqSize < m_sequence.size() && m_sequence[m_seqSize]->is_defined()) m_undefinedPairs.erase(it);
m_seqSize++; it = jt;
} }
}
void node_data::compute_map_size() const
{ const_node_iterator node_data::begin() const {
kv_pairs::iterator it = m_undefinedPairs.begin(); if (!m_isDefined)
while(it != m_undefinedPairs.end()) { return const_node_iterator();
kv_pairs::iterator jt = boost::next(it);
if(it->first->is_defined() && it->second->is_defined()) switch (m_type) {
m_undefinedPairs.erase(it); case NodeType::Sequence:
it = jt; return const_node_iterator(m_sequence.begin());
} case NodeType::Map:
} return const_node_iterator(m_map.begin(), m_map.end());
default:
const_node_iterator node_data::begin() const return const_node_iterator();
{ }
if(!m_isDefined) }
return const_node_iterator();
node_iterator node_data::begin() {
switch(m_type) { if (!m_isDefined)
case NodeType::Sequence: return const_node_iterator(m_sequence.begin()); return node_iterator();
case NodeType::Map: return const_node_iterator(m_map.begin(), m_map.end());
default: return const_node_iterator(); switch (m_type) {
} case NodeType::Sequence:
} return node_iterator(m_sequence.begin());
case NodeType::Map:
node_iterator node_data::begin() return node_iterator(m_map.begin(), m_map.end());
{ default:
if(!m_isDefined) return node_iterator();
return node_iterator(); }
}
switch(m_type) {
case NodeType::Sequence: return node_iterator(m_sequence.begin()); const_node_iterator node_data::end() const {
case NodeType::Map: return node_iterator(m_map.begin(), m_map.end()); if (!m_isDefined)
default: return node_iterator(); return const_node_iterator();
}
} switch (m_type) {
case NodeType::Sequence:
const_node_iterator node_data::end() const return const_node_iterator(m_sequence.end());
{ case NodeType::Map:
if(!m_isDefined) return const_node_iterator(m_map.end(), m_map.end());
return const_node_iterator(); default:
return const_node_iterator();
switch(m_type) { }
case NodeType::Sequence: return const_node_iterator(m_sequence.end()); }
case NodeType::Map: return const_node_iterator(m_map.end(), m_map.end());
default: return const_node_iterator(); node_iterator node_data::end() {
} if (!m_isDefined)
} return node_iterator();
node_iterator node_data::end() switch (m_type) {
{ case NodeType::Sequence:
if(!m_isDefined) return node_iterator(m_sequence.end());
return node_iterator(); case NodeType::Map:
return node_iterator(m_map.end(), m_map.end());
switch(m_type) { default:
case NodeType::Sequence: return node_iterator(m_sequence.end()); return node_iterator();
case NodeType::Map: return node_iterator(m_map.end(), m_map.end()); }
default: return node_iterator(); }
}
} // sequence
void node_data::push_back(node& node, shared_memory_holder /* pMemory */) {
// sequence if (m_type == NodeType::Undefined || m_type == NodeType::Null) {
void node_data::push_back(node& node, shared_memory_holder /* pMemory */) m_type = NodeType::Sequence;
{ reset_sequence();
if(m_type == NodeType::Undefined || m_type == NodeType::Null) { }
m_type = NodeType::Sequence;
reset_sequence(); if (m_type != NodeType::Sequence)
} throw BadPushback();
if(m_type != NodeType::Sequence) m_sequence.push_back(&node);
throw BadPushback(); }
m_sequence.push_back(&node); void node_data::insert(node& key, node& value, shared_memory_holder pMemory) {
} switch (m_type) {
case NodeType::Map:
void node_data::insert(node& key, node& value, shared_memory_holder pMemory) break;
{ case NodeType::Undefined:
switch(m_type) { case NodeType::Null:
case NodeType::Map: case NodeType::Sequence:
break; convert_to_map(pMemory);
case NodeType::Undefined: break;
case NodeType::Null: case NodeType::Scalar:
case NodeType::Sequence: throw BadSubscript();
convert_to_map(pMemory); }
break;
case NodeType::Scalar: insert_map_pair(key, value);
throw BadSubscript(); }
}
// indexing
insert_map_pair(key, value); node& node_data::get(node& key, shared_memory_holder pMemory) const {
} if (m_type != NodeType::Map)
return pMemory->create_node();
// indexing
node& node_data::get(node& key, shared_memory_holder pMemory) const for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
{ if (it->first->is(key))
if(m_type != NodeType::Map) return *it->second;
return pMemory->create_node(); }
for(node_map::const_iterator it=m_map.begin();it!=m_map.end();++it) { return pMemory->create_node();
if(it->first->is(key)) }
return *it->second;
} node& node_data::get(node& key, shared_memory_holder pMemory) {
switch (m_type) {
return pMemory->create_node(); case NodeType::Map:
} break;
case NodeType::Undefined:
node& node_data::get(node& key, shared_memory_holder pMemory) case NodeType::Null:
{ case NodeType::Sequence:
switch(m_type) { convert_to_map(pMemory);
case NodeType::Map: break;
break; case NodeType::Scalar:
case NodeType::Undefined: throw BadSubscript();
case NodeType::Null: }
case NodeType::Sequence:
convert_to_map(pMemory); for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
break; if (it->first->is(key))
case NodeType::Scalar: return *it->second;
throw BadSubscript(); }
}
node& value = pMemory->create_node();
for(node_map::const_iterator it=m_map.begin();it!=m_map.end();++it) { insert_map_pair(key, value);
if(it->first->is(key)) return value;
return *it->second; }
}
bool node_data::remove(node& key, shared_memory_holder /* pMemory */) {
node& value = pMemory->create_node(); if (m_type != NodeType::Map)
insert_map_pair(key, value); return false;
return value;
} for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->is(key)) {
bool node_data::remove(node& key, shared_memory_holder /* pMemory */) m_map.erase(it);
{ return true;
if(m_type != NodeType::Map) }
return false; }
for(node_map::iterator it=m_map.begin();it!=m_map.end();++it) { return false;
if(it->first->is(key)) { }
m_map.erase(it);
return true; void node_data::reset_sequence() {
} m_sequence.clear();
} m_seqSize = 0;
}
return false;
} void node_data::reset_map() {
m_map.clear();
void node_data::reset_sequence() m_undefinedPairs.clear();
{ }
m_sequence.clear();
m_seqSize = 0; void node_data::insert_map_pair(node& key, node& value) {
} m_map[&key] = &value;
if (!key.is_defined() || !value.is_defined())
void node_data::reset_map() m_undefinedPairs.push_back(kv_pair(&key, &value));
{ }
m_map.clear();
m_undefinedPairs.clear(); void node_data::convert_to_map(shared_memory_holder pMemory) {
} switch (m_type) {
case NodeType::Undefined:
void node_data::insert_map_pair(node& key, node& value) case NodeType::Null:
{ reset_map();
m_map[&key] = &value; m_type = NodeType::Map;
if(!key.is_defined() || !value.is_defined()) break;
m_undefinedPairs.push_back(kv_pair(&key, &value)); case NodeType::Sequence:
} convert_sequence_to_map(pMemory);
break;
void node_data::convert_to_map(shared_memory_holder pMemory) case NodeType::Map:
{ break;
switch(m_type) { case NodeType::Scalar:
case NodeType::Undefined: assert(false);
case NodeType::Null: break;
reset_map(); }
m_type = NodeType::Map; }
break;
case NodeType::Sequence: void node_data::convert_sequence_to_map(shared_memory_holder pMemory) {
convert_sequence_to_map(pMemory); assert(m_type == NodeType::Sequence);
break;
case NodeType::Map: reset_map();
break; for (std::size_t i = 0; i < m_sequence.size(); i++) {
case NodeType::Scalar: std::stringstream stream;
assert(false); stream << i;
break;
} node& key = pMemory->create_node();
} key.set_scalar(stream.str());
insert_map_pair(key, *m_sequence[i]);
void node_data::convert_sequence_to_map(shared_memory_holder pMemory) }
{
assert(m_type == NodeType::Sequence); reset_sequence();
m_type = NodeType::Map;
reset_map(); }
for(std::size_t i=0;i<m_sequence.size();i++) { }
std::stringstream stream;
stream << i;
node& key = pMemory->create_node();
key.set_scalar(stream.str());
insert_map_pair(key, *m_sequence[i]);
}
reset_sequence();
m_type = NodeType::Map;
}
}
} }
...@@ -4,135 +4,119 @@ ...@@ -4,135 +4,119 @@
#include "yaml-cpp/node/impl.h" #include "yaml-cpp/node/impl.h"
#include <cassert> #include <cassert>
namespace YAML namespace YAML {
{ NodeBuilder::NodeBuilder()
NodeBuilder::NodeBuilder(): m_pMemory(new detail::memory_holder), m_pRoot(0), m_mapDepth(0) : m_pMemory(new detail::memory_holder), m_pRoot(0), m_mapDepth(0) {
{ m_anchors.push_back(0); // since the anchors start at 1
m_anchors.push_back(0); // since the anchors start at 1 }
}
NodeBuilder::~NodeBuilder() {}
NodeBuilder::~NodeBuilder()
{ Node NodeBuilder::Root() {
} if (!m_pRoot)
return Node();
Node NodeBuilder::Root()
{ return Node(*m_pRoot, m_pMemory);
if(!m_pRoot) }
return Node();
void NodeBuilder::OnDocumentStart(const Mark&) {}
return Node(*m_pRoot, m_pMemory);
} void NodeBuilder::OnDocumentEnd() {}
void NodeBuilder::OnDocumentStart(const Mark&) void NodeBuilder::OnNull(const Mark& /* mark */, anchor_t anchor) {
{ detail::node& node = Push(anchor);
} node.set_null();
Pop();
void NodeBuilder::OnDocumentEnd() }
{
} void NodeBuilder::OnAlias(const Mark& /* mark */, anchor_t anchor) {
detail::node& node = *m_anchors[anchor];
void NodeBuilder::OnNull(const Mark& /* mark */, anchor_t anchor) Push(node);
{ Pop();
detail::node& node = Push(anchor); }
node.set_null();
Pop(); void NodeBuilder::OnScalar(const Mark& /* mark */, const std::string& tag,
} anchor_t anchor, const std::string& value) {
detail::node& node = Push(anchor);
void NodeBuilder::OnAlias(const Mark& /* mark */, anchor_t anchor) node.set_scalar(value);
{ node.set_tag(tag);
detail::node& node = *m_anchors[anchor]; Pop();
Push(node); }
Pop();
} void NodeBuilder::OnSequenceStart(const Mark& /* mark */,
const std::string& tag, anchor_t anchor) {
void NodeBuilder::OnScalar(const Mark& /* mark */, const std::string& tag, anchor_t anchor, const std::string& value) detail::node& node = Push(anchor);
{ node.set_tag(tag);
detail::node& node = Push(anchor); node.set_type(NodeType::Sequence);
node.set_scalar(value); }
node.set_tag(tag);
Pop(); void NodeBuilder::OnSequenceEnd() { Pop(); }
}
void NodeBuilder::OnMapStart(const Mark& /* mark */, const std::string& tag,
void NodeBuilder::OnSequenceStart(const Mark& /* mark */, const std::string& tag, anchor_t anchor) anchor_t anchor) {
{ detail::node& node = Push(anchor);
detail::node& node = Push(anchor); node.set_type(NodeType::Map);
node.set_tag(tag); node.set_tag(tag);
node.set_type(NodeType::Sequence); m_mapDepth++;
} }
void NodeBuilder::OnSequenceEnd() void NodeBuilder::OnMapEnd() {
{ assert(m_mapDepth > 0);
Pop(); m_mapDepth--;
} Pop();
}
void NodeBuilder::OnMapStart(const Mark& /* mark */, const std::string& tag, anchor_t anchor)
{ detail::node& NodeBuilder::Push(anchor_t anchor) {
detail::node& node = Push(anchor); detail::node& node = m_pMemory->create_node();
node.set_type(NodeType::Map); RegisterAnchor(anchor, node);
node.set_tag(tag); Push(node);
m_mapDepth++; return node;
} }
void NodeBuilder::OnMapEnd() void NodeBuilder::Push(detail::node& node) {
{ const bool needsKey =
assert(m_mapDepth > 0); (!m_stack.empty() && m_stack.back()->type() == NodeType::Map &&
m_mapDepth--; m_keys.size() < m_mapDepth);
Pop();
} m_stack.push_back(&node);
if (needsKey)
detail::node& NodeBuilder::Push(anchor_t anchor) m_keys.push_back(PushedKey(&node, false));
{ }
detail::node& node = m_pMemory->create_node();
RegisterAnchor(anchor, node); void NodeBuilder::Pop() {
Push(node); assert(!m_stack.empty());
return node; if (m_stack.size() == 1) {
} m_pRoot = m_stack[0];
m_stack.pop_back();
void NodeBuilder::Push(detail::node& node) return;
{ }
const bool needsKey = (!m_stack.empty() && m_stack.back()->type() == NodeType::Map && m_keys.size() < m_mapDepth);
detail::node& node = *m_stack.back();
m_stack.push_back(&node); m_stack.pop_back();
if(needsKey)
m_keys.push_back(PushedKey(&node, false)); detail::node& collection = *m_stack.back();
}
if (collection.type() == NodeType::Sequence) {
void NodeBuilder::Pop() collection.push_back(node, m_pMemory);
{ } else if (collection.type() == NodeType::Map) {
assert(!m_stack.empty()); assert(!m_keys.empty());
if(m_stack.size() == 1) { PushedKey& key = m_keys.back();
m_pRoot = m_stack[0]; if (key.second) {
m_stack.pop_back(); collection.insert(*key.first, node, m_pMemory);
return; m_keys.pop_back();
} } else {
key.second = true;
detail::node& node = *m_stack.back(); }
m_stack.pop_back(); } else {
assert(false);
detail::node& collection = *m_stack.back(); m_stack.clear();
}
if(collection.type() == NodeType::Sequence) { }
collection.push_back(node, m_pMemory);
} else if(collection.type() == NodeType::Map) { void NodeBuilder::RegisterAnchor(anchor_t anchor, detail::node& node) {
assert(!m_keys.empty()); if (anchor) {
PushedKey& key = m_keys.back(); assert(anchor == m_anchors.size());
if(key.second) { m_anchors.push_back(&node);
collection.insert(*key.first, node, m_pMemory); }
m_keys.pop_back(); }
} else {
key.second = true;
}
} else {
assert(false);
m_stack.clear();
}
}
void NodeBuilder::RegisterAnchor(anchor_t anchor, detail::node& node)
{
if(anchor) {
assert(anchor == m_anchors.size());
m_anchors.push_back(&node);
}
}
} }
#ifndef NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #ifndef NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#define NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once #pragma once
#endif #endif
...@@ -9,50 +11,50 @@ ...@@ -9,50 +11,50 @@
#include "yaml-cpp/node/ptr.h" #include "yaml-cpp/node/ptr.h"
#include <vector> #include <vector>
namespace YAML namespace YAML {
{ class Node;
class Node;
class NodeBuilder : public EventHandler {
class NodeBuilder: public EventHandler public:
{ NodeBuilder();
public: virtual ~NodeBuilder();
NodeBuilder();
virtual ~NodeBuilder(); Node Root();
Node Root(); virtual void OnDocumentStart(const Mark& mark);
virtual void OnDocumentEnd();
virtual void OnDocumentStart(const Mark& mark);
virtual void OnDocumentEnd(); virtual void OnNull(const Mark& mark, anchor_t anchor);
virtual void OnAlias(const Mark& mark, anchor_t anchor);
virtual void OnNull(const Mark& mark, anchor_t anchor); virtual void OnScalar(const Mark& mark, const std::string& tag,
virtual void OnAlias(const Mark& mark, anchor_t anchor); anchor_t anchor, const std::string& value);
virtual void OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value);
virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
virtual void OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor); anchor_t anchor);
virtual void OnSequenceEnd(); virtual void OnSequenceEnd();
virtual void OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor);
virtual void OnMapEnd();
private:
detail::node& Push(anchor_t anchor);
void Push(detail::node& node);
void Pop();
void RegisterAnchor(anchor_t anchor, detail::node& node);
private:
detail::shared_memory_holder m_pMemory;
detail::node *m_pRoot;
typedef std::vector<detail::node *> Nodes;
Nodes m_stack;
Nodes m_anchors;
typedef std::pair<detail::node *, bool> PushedKey;
std::vector<PushedKey> m_keys;
std::size_t m_mapDepth;
};
}
#endif // NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor);
virtual void OnMapEnd();
private:
detail::node& Push(anchor_t anchor);
void Push(detail::node& node);
void Pop();
void RegisterAnchor(anchor_t anchor, detail::node& node);
private:
detail::shared_memory_holder m_pMemory;
detail::node* m_pRoot;
typedef std::vector<detail::node*> Nodes;
Nodes m_stack;
Nodes m_anchors;
typedef std::pair<detail::node*, bool> PushedKey;
std::vector<PushedKey> m_keys;
std::size_t m_mapDepth;
};
}
#endif // NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#include "parsertests.h" #include "parsertests.h"
namespace Test { namespace Test {
bool RunParserTests() bool RunParserTests() { return true; }
{
return true;
}
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment