From b8e9b52af7f6473e609947e470c06a06023b305f Mon Sep 17 00:00:00 2001 From: beder Date: Fri, 9 Sep 2011 23:40:19 -0500 Subject: [PATCH] Implemented sugar Parse() functions --- include/yaml-cpp/value.h | 1 + include/yaml-cpp/value/impl.h | 4 ++-- include/yaml-cpp/value/parse.h | 21 +++++++++++++++++++++ include/yaml-cpp/value/value.h | 1 + src/value/parse.cpp | 29 +++++++++++++++++++++++++++++ src/value/valuebuilder.cpp | 12 ++++++++++-- src/value/valuebuilder.h | 2 ++ util/value.cpp | 17 +---------------- 8 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 include/yaml-cpp/value/parse.h create mode 100644 src/value/parse.cpp diff --git a/include/yaml-cpp/value.h b/include/yaml-cpp/value.h index a05ae48..9f11204 100644 --- a/include/yaml-cpp/value.h +++ b/include/yaml-cpp/value.h @@ -11,5 +11,6 @@ #include "yaml-cpp/value/convert.h" #include "yaml-cpp/value/iterator.h" #include "yaml-cpp/value/detail/impl.h" +#include "yaml-cpp/value/parse.h" #endif // VALUE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 diff --git a/include/yaml-cpp/value/impl.h b/include/yaml-cpp/value/impl.h index 92be737..336fef1 100644 --- a/include/yaml-cpp/value/impl.h +++ b/include/yaml-cpp/value/impl.h @@ -112,13 +112,13 @@ namespace YAML return *this; } - void Value::AssignData(const Value& rhs) + inline void Value::AssignData(const Value& rhs) { m_pNode->set_data(*rhs.m_pNode); m_pMemory->merge(*rhs.m_pMemory); } - void Value::AssignNode(const Value& rhs) + inline void Value::AssignNode(const Value& rhs) { m_pNode->set_ref(*rhs.m_pNode); m_pMemory->merge(*rhs.m_pMemory); diff --git a/include/yaml-cpp/value/parse.h b/include/yaml-cpp/value/parse.h new file mode 100644 index 0000000..ae252b1 --- /dev/null +++ b/include/yaml-cpp/value/parse.h @@ -0,0 +1,21 @@ +#ifndef VALUE_PARSE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 +#define VALUE_PARSE_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 +#pragma once +#endif + +#include +#include + +namespace YAML +{ + class Value; + + Value Parse(const std::string& input); + Value Parse(const char *input); + Value Parse(std::istream& input); +} + +#endif // VALUE_PARSE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 + diff --git a/include/yaml-cpp/value/value.h b/include/yaml-cpp/value/value.h index 5be19b2..5235bf4 100644 --- a/include/yaml-cpp/value/value.h +++ b/include/yaml-cpp/value/value.h @@ -17,6 +17,7 @@ namespace YAML class Value { public: + friend class ValueBuilder; friend class detail::node_data; template friend class detail::iterator_base; diff --git a/src/value/parse.cpp b/src/value/parse.cpp new file mode 100644 index 0000000..2777243 --- /dev/null +++ b/src/value/parse.cpp @@ -0,0 +1,29 @@ +#include "yaml-cpp/value/parse.h" +#include "yaml-cpp/value/value.h" +#include "yaml-cpp/value/impl.h" +#include "yaml-cpp/parser.h" +#include "valuebuilder.h" + +#include + +namespace YAML +{ + Value Parse(const std::string& input) { + std::stringstream stream(input); + return Parse(stream); + } + + Value Parse(const char *input) { + std::stringstream stream(input); + return Parse(stream); + } + + Value Parse(std::istream& input) { + Parser parser(input); + ValueBuilder builder; + if(!parser.HandleNextDocument(builder)) + return Value(); + + return builder.Root(); + } +} diff --git a/src/value/valuebuilder.cpp b/src/value/valuebuilder.cpp index 66f6195..1819d9a 100644 --- a/src/value/valuebuilder.cpp +++ b/src/value/valuebuilder.cpp @@ -14,6 +14,14 @@ namespace YAML { } + Value ValueBuilder::Root() + { + if(!m_pRoot) + return Value(); + + return Value(*m_pRoot, m_pMemory); + } + void ValueBuilder::OnDocumentStart(const Mark&) { } @@ -70,13 +78,13 @@ namespace YAML detail::node& ValueBuilder::Push(anchor_t anchor) { - detail::node& top = *m_stack.back(); + const bool needsKey = (!m_stack.empty() && m_stack.back()->type() == ValueType::Map && m_keys.size() < m_mapDepth); detail::node& node = m_pMemory->create_node(); m_stack.push_back(&node); RegisterAnchor(anchor, node); - if(top.type() == ValueType::Map && m_keys.size() < m_mapDepth) + if(needsKey) m_keys.push_back(&node); return node; diff --git a/src/value/valuebuilder.h b/src/value/valuebuilder.h index 6673464..7695087 100644 --- a/src/value/valuebuilder.h +++ b/src/value/valuebuilder.h @@ -19,6 +19,8 @@ namespace YAML ValueBuilder(); virtual ~ValueBuilder(); + Value Root(); + virtual void OnDocumentStart(const Mark& mark); virtual void OnDocumentEnd(); diff --git a/util/value.cpp b/util/value.cpp index 29cdf3f..e8075bd 100644 --- a/util/value.cpp +++ b/util/value.cpp @@ -3,22 +3,7 @@ int main() { - YAML::Value value; - value["seq"] = YAML::Value(YAML::ValueType::Sequence); - for(int i=0;i<5;i++) - value["seq"].append(i); - value["map"]["one"] = "I"; - value["map"]["two"] = "II"; - value["map"]["three"] = "III"; - value["map"]["four"] = "IV"; - - for(YAML::const_iterator it=value["seq"].begin();it!=value["seq"].end();++it) { - std::cout << it->as() << "\n"; - } - - for(YAML::const_iterator it=value["map"].begin();it!=value["map"].end();++it) { - std::cout << it->first.as() << " -> " << it->second.as() << "\n"; - } + YAML::Value value = YAML::Parse("foo: bar"); return 0; }