version_id to GVT node map
Versioned Object
A
/ \
B C
Differential Versioned Object
Versioned Object
の図で示したようにノードの関係性をたどったメタ情報のみをcached value(s)に格納するlog
オブジェクトのコードイメージとしては以下のようになる。const std = @import("std");
/// 差分情報(delta)の構造体
const Delta = struct {
version: u32, // delta が適用されるバージョン番号
diff: []const u8, // 差分情報
};
/// 差分情報を管理するバージョン管理オブジェクト
/// 現在の完全な状態(currentValue)と、過去の変更履歴(deltas のリスト)を保持。
pub const VersionedObject = struct {
allocator: *std.mem.Allocator,
currentValue: []const u8, // 最新の完全な状態(キャッシュ)
deltas: std.ArrayList(Delta), // 差分情報のログ(各エントリが delta を表す)
pub fn init(allocator: *std.mem.Allocator, initialValue: []const u8) !VersionedObject {
var obj = VersionedObject{
.allocator = allocator,
.currentValue = initialValue,
.deltas = std.ArrayList(Delta).init(allocator),
};
return obj;
}
/// 新たな delta を追加して新バージョンを記録する関数(好きなロジックを入れる)
pub fn addDelta(self: *VersionedObject, newDelta: Delta) !void {
try self.deltas.append(newDelta);
}
/// 指定したバージョンの状態を再構築する(好きなロジックを入れる)
pub fn reconstructVersion(self: *VersionedObject, targetVersion: u32) []u8 {
return self.currentValue;
}
};
pub fn main() !void {
var allocator = std.heap.page_allocator;
var obj = try VersionedObject.init(allocator, "Initial value");
var delta = Delta{
.version = 1,
.diff = " updated",
};
try obj.addDelta(delta);
const version1 = obj.reconstructVersion(1);
std.debug.print("Version 1: {s}\n", .{version1});
}