summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgolubi-kuryat <[email protected]>2025-09-05 11:05:58 +0300
committergolubi-kuryat <[email protected]>2025-09-05 13:12:37 +0300
commitc16c8277df06c43957bef277c57200b22772d046 (patch)
treeb6fb2283c0cdd07513cd6c28a82446ccb4d89596
parent0a4c0b7639ef00779018318a1df2e051867ce633 (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.h1
-rw-r--r--contrib/libs/yaml-cpp/patches/03-optimize-merge.patch33
-rw-r--r--contrib/libs/yaml-cpp/src/memory.cpp8
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