diff options
| author | golubi-kuryat <[email protected]> | 2025-09-05 11:05:58 +0300 |
|---|---|---|
| committer | golubi-kuryat <[email protected]> | 2025-09-05 13:12:37 +0300 |
| commit | c16c8277df06c43957bef277c57200b22772d046 (patch) | |
| tree | b6fb2283c0cdd07513cd6c28a82446ccb4d89596 | |
| parent | 0a4c0b7639ef00779018318a1df2e051867ce633 (diff) | |
Optimize merge memories
PR в upstream
<https://github.com/jbeder/yaml-cpp/pull/1368>
commit_hash:8e225d3e1e3dad786ed6cd63b36d39e3f75af805
| -rw-r--r-- | contrib/libs/yaml-cpp/include/yaml-cpp/node/detail/memory.h | 1 | ||||
| -rw-r--r-- | contrib/libs/yaml-cpp/patches/03-optimize-merge.patch | 33 | ||||
| -rw-r--r-- | contrib/libs/yaml-cpp/src/memory.cpp | 8 |
3 files changed, 42 insertions, 0 deletions
diff --git a/contrib/libs/yaml-cpp/include/yaml-cpp/node/detail/memory.h b/contrib/libs/yaml-cpp/include/yaml-cpp/node/detail/memory.h index e881545bf2f..942ab668d4c 100644 --- a/contrib/libs/yaml-cpp/include/yaml-cpp/node/detail/memory.h +++ b/contrib/libs/yaml-cpp/include/yaml-cpp/node/detail/memory.h @@ -25,6 +25,7 @@ class YAML_CPP_API memory { memory() : m_nodes{} {} node& create_node(); void merge(const memory& rhs); + size_t size() const; private: using Nodes = std::set<shared_node>; diff --git a/contrib/libs/yaml-cpp/patches/03-optimize-merge.patch b/contrib/libs/yaml-cpp/patches/03-optimize-merge.patch new file mode 100644 index 00000000000..f4ccc8e3da0 --- /dev/null +++ b/contrib/libs/yaml-cpp/patches/03-optimize-merge.patch @@ -0,0 +1,33 @@ +--- contrib/libs/yaml-cpp/include/yaml-cpp/node/detail/memory.h (index) ++++ contrib/libs/yaml-cpp/include/yaml-cpp/node/detail/memory.h (working tree) +@@ -25,6 +25,7 @@ class YAML_CPP_API memory { + memory() : m_nodes{} {} + node& create_node(); + void merge(const memory& rhs); ++ size_t size() const; + + private: + using Nodes = std::set<shared_node>; +--- contrib/libs/yaml-cpp/src/memory.cpp (index) ++++ contrib/libs/yaml-cpp/src/memory.cpp (working tree) +@@ -9,6 +9,10 @@ void memory_holder::merge(memory_holder& rhs) { + if (m_pMemory == rhs.m_pMemory) + return; + ++ if (m_pMemory->size() < rhs.m_pMemory->size()) { ++ std::swap(m_pMemory, rhs.m_pMemory); ++ } ++ + m_pMemory->merge(*rhs.m_pMemory); + rhs.m_pMemory = m_pMemory; + } +@@ -22,5 +26,9 @@ node& memory::create_node() { + void memory::merge(const memory& rhs) { + m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end()); + } ++ ++size_t memory::size() const { ++ return m_nodes.size(); ++} + } // namespace detail + } // namespace YAML diff --git a/contrib/libs/yaml-cpp/src/memory.cpp b/contrib/libs/yaml-cpp/src/memory.cpp index 676e4c7f152..7a544e6f221 100644 --- a/contrib/libs/yaml-cpp/src/memory.cpp +++ b/contrib/libs/yaml-cpp/src/memory.cpp @@ -9,6 +9,10 @@ void memory_holder::merge(memory_holder& rhs) { if (m_pMemory == rhs.m_pMemory) return; + if (m_pMemory->size() < rhs.m_pMemory->size()) { + std::swap(m_pMemory, rhs.m_pMemory); + } + m_pMemory->merge(*rhs.m_pMemory); rhs.m_pMemory = m_pMemory; } @@ -22,5 +26,9 @@ node& memory::create_node() { void memory::merge(const memory& rhs) { m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end()); } + +size_t memory::size() const { + return m_nodes.size(); +} } // namespace detail } // namespace YAML |
