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
							 |