mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 12:41:17 +00:00
Added default parameters for the as<> function (new API)
This commit is contained in:
@@ -65,24 +65,75 @@ namespace YAML
|
|||||||
}
|
}
|
||||||
|
|
||||||
// access
|
// access
|
||||||
|
|
||||||
|
// template helpers
|
||||||
|
template<typename T, typename S>
|
||||||
|
struct as_if {
|
||||||
|
explicit as_if(const Node& node_): node(node_) {}
|
||||||
|
const Node& node;
|
||||||
|
|
||||||
|
const T operator()(const S& fallback) const {
|
||||||
|
if(!node.m_pNode)
|
||||||
|
return fallback;
|
||||||
|
|
||||||
|
T t;
|
||||||
|
if(convert<T>::decode(node, t))
|
||||||
|
return t;
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename S>
|
||||||
|
struct as_if<std::string, S> {
|
||||||
|
explicit as_if(const Node& node_): node(node_) {}
|
||||||
|
const Node& node;
|
||||||
|
|
||||||
|
const std::string operator()(const S& fallback) const {
|
||||||
|
if(node.Type() != NodeType::Scalar)
|
||||||
|
return fallback;
|
||||||
|
return node.Scalar();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline const T Node::as() const
|
struct as_if<T, void> {
|
||||||
{
|
explicit as_if(const Node& node_): node(node_) {}
|
||||||
if(!m_pNode)
|
const Node& node;
|
||||||
|
|
||||||
|
const T operator()() const {
|
||||||
|
if(!node.m_pNode)
|
||||||
throw std::runtime_error("Unable to convert to type");
|
throw std::runtime_error("Unable to convert to type");
|
||||||
|
|
||||||
T t;
|
T t;
|
||||||
if(convert<T>::decode(*this, t))
|
if(convert<T>::decode(node, t))
|
||||||
return t;
|
return t;
|
||||||
throw std::runtime_error("Unable to convert to type");
|
throw std::runtime_error("Unable to convert to type");
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline const std::string Node::as() const
|
struct as_if<std::string, void> {
|
||||||
{
|
explicit as_if(const Node& node_): node(node_) {}
|
||||||
if(Type() != NodeType::Scalar)
|
const Node& node;
|
||||||
|
|
||||||
|
const std::string operator()() const {
|
||||||
|
if(node.Type() != NodeType::Scalar)
|
||||||
throw std::runtime_error("Unable to convert to string, not a scalar");
|
throw std::runtime_error("Unable to convert to string, not a scalar");
|
||||||
return Scalar();
|
return node.Scalar();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// access functions
|
||||||
|
template<typename T>
|
||||||
|
inline const T Node::as() const
|
||||||
|
{
|
||||||
|
return as_if<T, void>(*this)();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename S>
|
||||||
|
inline const T Node::as(const S& fallback) const
|
||||||
|
{
|
||||||
|
return as_if<T, S>(*this)(fallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const std::string& Node::Scalar() const
|
inline const std::string& Node::Scalar() const
|
||||||
|
@@ -22,6 +22,7 @@ namespace YAML
|
|||||||
friend class NodeEvents;
|
friend class NodeEvents;
|
||||||
friend class detail::node_data;
|
friend class detail::node_data;
|
||||||
template<typename> friend class detail::iterator_base;
|
template<typename> friend class detail::iterator_base;
|
||||||
|
template<typename T, typename S> friend struct as_if;
|
||||||
|
|
||||||
Node();
|
Node();
|
||||||
explicit Node(NodeType::value type);
|
explicit Node(NodeType::value type);
|
||||||
@@ -43,6 +44,7 @@ namespace YAML
|
|||||||
|
|
||||||
// access
|
// access
|
||||||
template<typename T> const T as() const;
|
template<typename T> const T as() const;
|
||||||
|
template<typename T, typename S> const T as(const S& fallback) const;
|
||||||
const std::string& Scalar() const;
|
const std::string& Scalar() const;
|
||||||
const std::string& Tag() const;
|
const std::string& Tag() const;
|
||||||
void SetTag(const std::string& tag);
|
void SetTag(const std::string& tag);
|
||||||
|
@@ -286,6 +286,18 @@ namespace Test
|
|||||||
node = YAML::Node();
|
node = YAML::Node();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST FallbackValues()
|
||||||
|
{
|
||||||
|
YAML::Node node = YAML::Load("foo: bar\nx: 2");
|
||||||
|
YAML_ASSERT(node["foo"].as<std::string>() == "bar");
|
||||||
|
YAML_ASSERT(node["foo"].as<std::string>("hello") == "bar");
|
||||||
|
YAML_ASSERT(node["baz"].as<std::string>("hello") == "hello");
|
||||||
|
YAML_ASSERT(node["x"].as<int>() == 2);
|
||||||
|
YAML_ASSERT(node["x"].as<int>(5) == 2);
|
||||||
|
YAML_ASSERT(node["y"].as<int>(5) == 5);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RunNodeTest(TEST (*test)(), const std::string& name, int& passed, int& total) {
|
void RunNodeTest(TEST (*test)(), const std::string& name, int& passed, int& total) {
|
||||||
@@ -332,6 +344,7 @@ namespace Test
|
|||||||
RunNodeTest(&Node::Bool, "bool", passed, total);
|
RunNodeTest(&Node::Bool, "bool", passed, total);
|
||||||
RunNodeTest(&Node::AutoBoolConversion, "auto bool conversion", passed, total);
|
RunNodeTest(&Node::AutoBoolConversion, "auto bool conversion", passed, total);
|
||||||
RunNodeTest(&Node::Reassign, "reassign", passed, total);
|
RunNodeTest(&Node::Reassign, "reassign", passed, total);
|
||||||
|
RunNodeTest(&Node::FallbackValues, "fallback values", passed, total);
|
||||||
|
|
||||||
std::cout << "Node tests: " << passed << "/" << total << " passed\n";
|
std::cout << "Node tests: " << passed << "/" << total << " passed\n";
|
||||||
return passed == total;
|
return passed == total;
|
||||||
|
Reference in New Issue
Block a user