Zig deep clone and merge for config maps
Zig
const std = @import("std");
const Config = struct {
name: []const u8,
values: std.StringHashMap(u32),
};
fn deepClone(a: std.mem.Allocator, c: Config) !Config {
var out = Config{ .name = try a.dupe(u8, c.name), .values = std.StringHashMap(u32).init(a) };
var it = c.values.iterator();
while (it.next()) |e| try out.values.put(try a.dupe(u8, e.key_ptr.*), e.value_ptr.*);
return out;
}
fn deepMerge(a: std.mem.Allocator, base: Config, over: Config) !Config {
var out = try deepClone(a, base);
if (over.name.len > 0) out.name = try a.dupe(u8, over.name);
var it = over.values.iterator();
while (it.next()) |e| try out.values.put(try a.dupe(u8, e.key_ptr.*), e.value_ptr.*);
return out;
}