"include/vscode:/vscode.git/clone" did not exist on "cea992b8a095fb1e4cb288c9d8ba442f408d3e98"
node_data.cpp 2.94 KB
Newer Older
Jesse Beder's avatar
Jesse Beder committed
1
#include "yaml-cpp/value/detail/node_data.h"
2
#include "yaml-cpp/value/detail/memory.h"
3
4
#include "yaml-cpp/value/detail/node.h"
#include <sstream>
Jesse Beder's avatar
Jesse Beder committed
5
#include <stdexcept>
Jesse Beder's avatar
Jesse Beder committed
6
7
8
9
10

namespace YAML
{
	namespace detail
	{
11
12
		std::string node_data::empty_scalar;

13
		node_data::node_data(): m_isDefined(false), m_type(ValueType::Null)
Jesse Beder's avatar
Jesse Beder committed
14
15
		{
		}
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

		void node_data::set_type(ValueType::value type)
		{
			if(type == ValueType::Undefined) {
				m_type = type;
				m_isDefined = false;
				return;
			}
			

			m_isDefined = true;
			if(type == m_type)
				return;
			
			m_type = type;
			
			switch(m_type) {
				case ValueType::Null:
					break;
				case ValueType::Scalar:
					m_scalar.clear();
					break;
				case ValueType::Sequence:
					m_sequence.clear();
					break;
				case ValueType::Map:
					m_map.clear();
					break;
				case ValueType::Undefined:
					assert(false);
					break;
			}
		}

		void node_data::set_null()
		{
			m_isDefined = true;
			m_type = ValueType::Null;
		}
		
		void node_data::set_scalar(const std::string& scalar)
		{
			m_isDefined = true;
			m_type = ValueType::Scalar;
			m_scalar = scalar;
		}

Jesse Beder's avatar
Jesse Beder committed
63
64
65
66
67
68
69
70
		void node_data::append(node& node, shared_memory_holder /* pMemory */)
		{
			if(m_type != ValueType::Sequence)
				throw std::runtime_error("Can't append to a non-sequence node");
			
			m_sequence.push_back(&node);
		}

71
		// indexing
72
		node& node_data::get(node& key, shared_memory_holder pMemory) const
73
74
		{
			if(m_type != ValueType::Map)
75
				return pMemory->create_node();
76
77
			
			for(node_map::const_iterator it=m_map.begin();it!=m_map.end();++it) {
78
				if(it->first->is(key))
79
					return *it->second;
80
81
			}
			
82
			return pMemory->create_node();
83
84
		}
		
85
		node& node_data::get(node& key, shared_memory_holder pMemory)
86
87
88
89
90
91
92
93
94
		{
			switch(m_type) {
				case ValueType::Undefined:
				case ValueType::Null:
				case ValueType::Scalar:
					m_type = ValueType::Map;
					m_map.clear();
					break;
				case ValueType::Sequence:
95
					convert_sequence_to_map(pMemory);
96
97
98
99
100
101
					break;
				case ValueType::Map:
					break;
			}

			for(node_map::const_iterator it=m_map.begin();it!=m_map.end();++it) {
102
				if(it->first->is(key))
103
					return *it->second;
104
105
			}
			
106
107
108
			node& value = pMemory->create_node();
			m_map.push_back(kv_pair(&key, &value));
			return value;
109
110
		}
		
111
		bool node_data::remove(node& key, shared_memory_holder /* pMemory */)
112
113
114
115
116
		{
			if(m_type != ValueType::Map)
				return false;

			for(node_map::iterator it=m_map.begin();it!=m_map.end();++it) {
117
				if(it->first->is(key)) {
118
119
120
121
122
123
124
125
					m_map.erase(it);
					return true;
				}
			}
			
			return false;
		}

126
		void node_data::convert_sequence_to_map(shared_memory_holder pMemory)
127
128
129
130
131
132
133
134
		{
			assert(m_type == ValueType::Sequence);
			
			m_map.clear();
			for(std::size_t i=0;i<m_sequence.size();i++) {
				std::stringstream stream;
				stream << i;

135
136
137
				node& key = pMemory->create_node();
				key.set_scalar(stream.str());
				m_map.push_back(kv_pair(&key, m_sequence[i]));
138
139
140
141
142
			}
			
			m_sequence.clear();
			m_type = ValueType::Map;
		}
Jesse Beder's avatar
Jesse Beder committed
143
144
	}
}