1 #ifndef NODE_DETAIL_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 #define NODE_DETAIL_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 4 #if defined(_MSC_VER) || \ 5 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ 6 (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 10 #include "yaml-cpp/node/detail/node.h" 11 #include "yaml-cpp/node/detail/node_data.h" 14 #include <type_traits> 18 template <
typename Key,
typename Enable =
void>
20 static node*
get(
const std::vector<node*>& ,
21 const Key& , shared_memory_holder ) {
26 template <
typename Key>
28 typename
std::enable_if<std::is_unsigned<Key>::value &&
29 !std::is_same<Key, bool>::value>::type> {
30 static node*
get(
const std::vector<node*>& sequence,
const Key& key,
31 shared_memory_holder ) {
32 return key < sequence.size() ? sequence[key] :
nullptr;
35 static node*
get(std::vector<node*>& sequence,
const Key& key,
36 shared_memory_holder pMemory) {
37 if (key > sequence.size() || (key > 0 && !sequence[key - 1]->is_defined()))
39 if (key == sequence.size())
40 sequence.push_back(&pMemory->create_node());
45 template <
typename Key>
46 struct get_idx<Key, typename
std::enable_if<std::is_signed<Key>::value>::type> {
47 static node*
get(
const std::vector<node*>& sequence,
const Key& key,
48 shared_memory_holder pMemory) {
49 return key >= 0 ? get_idx<std::size_t>::get(
50 sequence, static_cast<std::size_t>(key), pMemory)
53 static node*
get(std::vector<node*>& sequence,
const Key& key,
54 shared_memory_holder pMemory) {
55 return key >= 0 ? get_idx<std::size_t>::get(
56 sequence, static_cast<std::size_t>(key), pMemory)
61 template <
typename Key,
typename Enable =
void>
63 static bool remove(std::vector<node*>&,
const Key&, std::size_t&) {
68 template <
typename Key>
70 Key, typename
std::enable_if<std::is_unsigned<Key>::value &&
71 !std::is_same<Key, bool>::value>::type> {
73 static bool remove(std::vector<node*>& sequence,
const Key& key,
74 std::size_t& seqSize) {
75 if (key >= sequence.size()) {
78 sequence.erase(sequence.begin() + key);
87 template <
typename Key>
88 struct remove_idx<Key,
89 typename
std::enable_if<std::is_signed<Key>::value>::type> {
91 static bool remove(std::vector<node*>& sequence,
const Key& key,
92 std::size_t& seqSize) {
93 return key >= 0 ? remove_idx<std::size_t>::remove(
94 sequence, static_cast<std::size_t>(key), seqSize)
100 inline bool node::equals(
const T& rhs, shared_memory_holder pMemory) {
102 if (convert<T>::decode(Node(*
this, pMemory), lhs)) {
108 inline bool node::equals(
const char* rhs, shared_memory_holder pMemory) {
110 if (convert<std::string>::decode(Node(*
this, std::move(pMemory)), lhs)) {
117 template <
typename Key>
118 inline node* node_data::get(
const Key& key,
119 shared_memory_holder pMemory)
const {
123 case NodeType::Undefined:
126 case NodeType::Sequence:
127 if (node* pNode = get_idx<Key>::get(m_sequence, key, pMemory))
130 case NodeType::Scalar:
131 throw BadSubscript(m_mark, key);
134 auto it = std::find_if(m_map.begin(), m_map.end(), [&](
const kv_pair m) {
135 return m.first->equals(key, pMemory);
138 return it != m_map.end() ? it->second :
nullptr;
141 template <
typename Key>
142 inline node& node_data::get(
const Key& key, shared_memory_holder pMemory) {
146 case NodeType::Undefined:
148 case NodeType::Sequence:
149 if (node* pNode = get_idx<Key>::get(m_sequence, key, pMemory)) {
150 m_type = NodeType::Sequence;
154 convert_to_map(pMemory);
156 case NodeType::Scalar:
157 throw BadSubscript(m_mark, key);
160 auto it = std::find_if(m_map.begin(), m_map.end(), [&](
const kv_pair m) {
161 return m.first->equals(key, pMemory);
164 if (it != m_map.end()) {
168 node& k = convert_to_node(key, pMemory);
169 node& v = pMemory->create_node();
170 insert_map_pair(k, v);
174 template <
typename Key>
175 inline bool node_data::remove(
const Key& key, shared_memory_holder pMemory) {
176 if (m_type == NodeType::Sequence) {
177 return remove_idx<Key>::remove(m_sequence, key, m_seqSize);
180 if (m_type == NodeType::Map) {
181 kv_pairs::iterator it = m_undefinedPairs.begin();
182 while (it != m_undefinedPairs.end()) {
183 kv_pairs::iterator jt = std::next(it);
184 if (it->first->equals(key, pMemory)) {
185 m_undefinedPairs.erase(it);
190 auto iter = std::find_if(m_map.begin(), m_map.end(), [&](
const kv_pair m) {
191 return m.first->equals(key, pMemory);
194 if (iter != m_map.end()) {
204 template <
typename Key,
typename Value>
205 inline void node_data::force_insert(
const Key& key,
const Value& value,
206 shared_memory_holder pMemory) {
210 case NodeType::Undefined:
212 case NodeType::Sequence:
213 convert_to_map(pMemory);
215 case NodeType::Scalar:
219 node& k = convert_to_node(key, pMemory);
220 node& v = convert_to_node(value, pMemory);
221 insert_map_pair(k, v);
224 template <
typename T>
225 inline node& node_data::convert_to_node(
const T& rhs,
226 shared_memory_holder pMemory) {
227 Node value = convert<T>::encode(rhs);
228 value.EnsureNodeExists();
229 pMemory->merge(*value.m_pMemory);
230 return *value.m_pNode;
235 #endif // NODE_DETAIL_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 Definition: gtest-internal.h:1322