mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-13 05:20:28 +08:00
refactor: optimize deep_merge function using iterative stack approach
This commit is contained in:
parent
a6687a3839
commit
0f41f1bc8d
@ -4,13 +4,20 @@ use super::use_lowercase;
|
||||
use serde_yaml_ng::{self, Mapping, Value};
|
||||
|
||||
fn deep_merge(a: &mut Value, b: Value) {
|
||||
match (a, b) {
|
||||
(&mut Value::Mapping(ref mut a), Value::Mapping(b)) => {
|
||||
for (k, v) in b {
|
||||
deep_merge(a.entry(k).or_insert(Value::Null), v);
|
||||
let mut stack: Vec<(*mut Value, Value)> = vec![(a as *mut Value, b)];
|
||||
|
||||
while let Some((a_ptr, b)) = stack.pop() {
|
||||
let a = unsafe { &mut *a_ptr };
|
||||
|
||||
match (a, b) {
|
||||
(Value::Mapping(a_map), Value::Mapping(b_map)) => {
|
||||
for (k, v) in b_map {
|
||||
let child = a_map.entry(k).or_insert(Value::Null);
|
||||
stack.push((child as *mut Value, v));
|
||||
}
|
||||
}
|
||||
(a, b) => *a = b,
|
||||
}
|
||||
(a, b) => *a = b,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user