node_data.cpp 2.71 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
6
7
8
9

namespace YAML
{
	namespace detail
	{
10
		node_data::node_data(): m_isDefined(false), m_type(ValueType::Null)
Jesse Beder's avatar
Jesse Beder committed
11
12
		{
		}
13
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

		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;
		}

		// indexing
61
		node& node_data::get(node& key, shared_memory_holder pMemory) const
62
63
		{
			if(m_type != ValueType::Map)
64
				return pMemory->create_node();
65
66
			
			for(node_map::const_iterator it=m_map.begin();it!=m_map.end();++it) {
67
68
				if(it->first == &key) // TODO: equality?
					return *it->second;
69
70
			}
			
71
			return pMemory->create_node();
72
73
		}
		
74
		node& node_data::get(node& key, shared_memory_holder pMemory)
75
76
77
78
79
80
81
82
83
		{
			switch(m_type) {
				case ValueType::Undefined:
				case ValueType::Null:
				case ValueType::Scalar:
					m_type = ValueType::Map;
					m_map.clear();
					break;
				case ValueType::Sequence:
84
					convert_sequence_to_map(pMemory);
85
86
87
88
89
90
					break;
				case ValueType::Map:
					break;
			}

			for(node_map::const_iterator it=m_map.begin();it!=m_map.end();++it) {
91
92
				if(it->first == &key) // TODO: equality?
					return *it->second;
93
94
			}
			
95
96
97
			node& value = pMemory->create_node();
			m_map.push_back(kv_pair(&key, &value));
			return value;
98
99
		}
		
100
		bool node_data::remove(node& key, shared_memory_holder /* pMemory */)
101
102
103
104
105
		{
			if(m_type != ValueType::Map)
				return false;

			for(node_map::iterator it=m_map.begin();it!=m_map.end();++it) {
106
				if(it->first == &key) { // TODO: equality?
107
108
109
110
111
112
113
114
					m_map.erase(it);
					return true;
				}
			}
			
			return false;
		}

115
		void node_data::convert_sequence_to_map(shared_memory_holder pMemory)
116
117
118
119
120
121
122
123
		{
			assert(m_type == ValueType::Sequence);
			
			m_map.clear();
			for(std::size_t i=0;i<m_sequence.size();i++) {
				std::stringstream stream;
				stream << i;

124
125
126
				node& key = pMemory->create_node();
				key.set_scalar(stream.str());
				m_map.push_back(kv_pair(&key, m_sequence[i]));
127
128
129
130
131
			}
			
			m_sequence.clear();
			m_type = ValueType::Map;
		}
Jesse Beder's avatar
Jesse Beder committed
132
133
	}
}