149 lines
3.8 KiB
C
149 lines
3.8 KiB
C
|
#ifndef NODE_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66
|
||
|
#define NODE_NODE_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 <stdexcept>
|
||
|
#include <string>
|
||
|
|
||
|
#include "yaml-cpp/dll.h"
|
||
|
#include "yaml-cpp/emitterstyle.h"
|
||
|
#include "yaml-cpp/mark.h"
|
||
|
#include "yaml-cpp/node/detail/iterator_fwd.h"
|
||
|
#include "yaml-cpp/node/ptr.h"
|
||
|
#include "yaml-cpp/node/type.h"
|
||
|
|
||
|
namespace YAML {
|
||
|
namespace detail {
|
||
|
class node;
|
||
|
class node_data;
|
||
|
struct iterator_value;
|
||
|
} // namespace detail
|
||
|
} // namespace YAML
|
||
|
|
||
|
namespace YAML {
|
||
|
class YAML_CPP_API Node {
|
||
|
public:
|
||
|
friend class NodeBuilder;
|
||
|
friend class NodeEvents;
|
||
|
friend struct detail::iterator_value;
|
||
|
friend class detail::node;
|
||
|
friend class detail::node_data;
|
||
|
template <typename>
|
||
|
friend class detail::iterator_base;
|
||
|
template <typename T, typename S>
|
||
|
friend struct as_if;
|
||
|
|
||
|
using iterator = YAML::iterator;
|
||
|
using const_iterator = YAML::const_iterator;
|
||
|
|
||
|
Node();
|
||
|
explicit Node(NodeType::value type);
|
||
|
template <typename T>
|
||
|
explicit Node(const T& rhs);
|
||
|
explicit Node(const detail::iterator_value& rhs);
|
||
|
Node(const Node& rhs);
|
||
|
~Node();
|
||
|
|
||
|
YAML::Mark Mark() const;
|
||
|
NodeType::value Type() const;
|
||
|
bool IsDefined() const;
|
||
|
bool IsNull() const { return Type() == NodeType::Null; }
|
||
|
bool IsScalar() const { return Type() == NodeType::Scalar; }
|
||
|
bool IsSequence() const { return Type() == NodeType::Sequence; }
|
||
|
bool IsMap() const { return Type() == NodeType::Map; }
|
||
|
|
||
|
// bool conversions
|
||
|
explicit operator bool() const { return IsDefined(); }
|
||
|
bool operator!() const { return !IsDefined(); }
|
||
|
|
||
|
// access
|
||
|
template <typename T>
|
||
|
T as() const;
|
||
|
template <typename T, typename S>
|
||
|
T as(const S& fallback) const;
|
||
|
const std::string& Scalar() const;
|
||
|
|
||
|
const std::string& Tag() const;
|
||
|
void SetTag(const std::string& tag);
|
||
|
|
||
|
// style
|
||
|
// WARNING: This API might change in future releases.
|
||
|
EmitterStyle::value Style() const;
|
||
|
void SetStyle(EmitterStyle::value style);
|
||
|
|
||
|
// assignment
|
||
|
bool is(const Node& rhs) const;
|
||
|
template <typename T>
|
||
|
Node& operator=(const T& rhs);
|
||
|
Node& operator=(const Node& rhs);
|
||
|
void reset(const Node& rhs = Node());
|
||
|
|
||
|
// size/iterator
|
||
|
std::size_t size() const;
|
||
|
|
||
|
const_iterator begin() const;
|
||
|
iterator begin();
|
||
|
|
||
|
const_iterator end() const;
|
||
|
iterator end();
|
||
|
|
||
|
// sequence
|
||
|
template <typename T>
|
||
|
void push_back(const T& rhs);
|
||
|
void push_back(const Node& rhs);
|
||
|
|
||
|
// indexing
|
||
|
template <typename Key>
|
||
|
const Node operator[](const Key& key) const;
|
||
|
template <typename Key>
|
||
|
Node operator[](const Key& key);
|
||
|
template <typename Key>
|
||
|
bool remove(const Key& key);
|
||
|
|
||
|
const Node operator[](const Node& key) const;
|
||
|
Node operator[](const Node& key);
|
||
|
bool remove(const Node& key);
|
||
|
|
||
|
// map
|
||
|
template <typename Key, typename Value>
|
||
|
void force_insert(const Key& key, const Value& value);
|
||
|
|
||
|
private:
|
||
|
enum Zombie { ZombieNode };
|
||
|
explicit Node(Zombie);
|
||
|
explicit Node(Zombie, const std::string&);
|
||
|
explicit Node(detail::node& node, detail::shared_memory_holder pMemory);
|
||
|
|
||
|
void EnsureNodeExists() const;
|
||
|
|
||
|
template <typename T>
|
||
|
void Assign(const T& rhs);
|
||
|
void Assign(const char* rhs);
|
||
|
void Assign(char* rhs);
|
||
|
|
||
|
void AssignData(const Node& rhs);
|
||
|
void AssignNode(const Node& rhs);
|
||
|
|
||
|
private:
|
||
|
bool m_isValid;
|
||
|
// String representation of invalid key, if the node is invalid.
|
||
|
std::string m_invalidKey;
|
||
|
mutable detail::shared_memory_holder m_pMemory;
|
||
|
mutable detail::node* m_pNode;
|
||
|
};
|
||
|
|
||
|
YAML_CPP_API bool operator==(const Node& lhs, const Node& rhs);
|
||
|
|
||
|
YAML_CPP_API Node Clone(const Node& node);
|
||
|
|
||
|
template <typename T>
|
||
|
struct convert;
|
||
|
}
|
||
|
|
||
|
#endif // NODE_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66
|