mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 04:41:16 +00:00
Maintain order of nodes in sequences (#668)
This commit is contained in:
@@ -13,10 +13,16 @@
|
|||||||
#include "yaml-cpp/node/ptr.h"
|
#include "yaml-cpp/node/ptr.h"
|
||||||
#include "yaml-cpp/node/type.h"
|
#include "yaml-cpp/node/type.h"
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
namespace YAML {
|
namespace YAML {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
class node {
|
class node {
|
||||||
|
private:
|
||||||
|
struct less {
|
||||||
|
bool operator ()(const node* l, const node* r) {return l->m_index < r->m_index;}
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
node() : m_pRef(new node_ref), m_dependencies{} {}
|
node() : m_pRef(new node_ref), m_dependencies{} {}
|
||||||
node(const node&) = delete;
|
node(const node&) = delete;
|
||||||
@@ -108,6 +114,7 @@ class node {
|
|||||||
void push_back(node& input, shared_memory_holder pMemory) {
|
void push_back(node& input, shared_memory_holder pMemory) {
|
||||||
m_pRef->push_back(input, pMemory);
|
m_pRef->push_back(input, pMemory);
|
||||||
input.add_dependency(*this);
|
input.add_dependency(*this);
|
||||||
|
m_index = m_amount.fetch_add(1);
|
||||||
}
|
}
|
||||||
void insert(node& key, node& value, shared_memory_holder pMemory) {
|
void insert(node& key, node& value, shared_memory_holder pMemory) {
|
||||||
m_pRef->insert(key, value, pMemory);
|
m_pRef->insert(key, value, pMemory);
|
||||||
@@ -159,8 +166,10 @@ class node {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
shared_node_ref m_pRef;
|
shared_node_ref m_pRef;
|
||||||
using nodes = std::set<node*>;
|
using nodes = std::set<node*, less>;
|
||||||
nodes m_dependencies;
|
nodes m_dependencies;
|
||||||
|
size_t m_index;
|
||||||
|
static std::atomic<size_t> m_amount;
|
||||||
};
|
};
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace YAML
|
} // namespace YAML
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
namespace YAML {
|
namespace YAML {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
std::atomic<size_t> node::m_amount{0};
|
||||||
|
|
||||||
const std::string& node_data::empty_scalar() {
|
const std::string& node_data::empty_scalar() {
|
||||||
static const std::string svalue;
|
static const std::string svalue;
|
||||||
|
Reference in New Issue
Block a user