@@ -19,6 +19,7 @@ pub const Options = struct {};
19
19
20
20
allocator : std.mem.Allocator ,
21
21
info : SegmentInfo = .{},
22
+ attributes : std .StringHashMapUnmanaged ([]const u8 ) = .{},
22
23
docs : std .AutoHashMap (u32 , bool ),
23
24
items : std .ArrayList (Item ),
24
25
frozen : bool = false ,
@@ -34,6 +35,16 @@ pub fn init(allocator: std.mem.Allocator, opts: Options) Self {
34
35
35
36
pub fn deinit (self : * Self , delete_file : KeepOrDelete ) void {
36
37
_ = delete_file ;
38
+
39
+ {
40
+ var iter = self .attributes .iterator ();
41
+ while (iter .next ()) | entry | {
42
+ self .allocator .free (entry .key_ptr .* );
43
+ self .allocator .free (entry .value_ptr .* );
44
+ }
45
+ }
46
+ self .attributes .deinit (self .allocator );
47
+
37
48
self .docs .deinit ();
38
49
self .items .deinit ();
39
50
}
@@ -54,6 +65,7 @@ pub fn getSize(self: Self) usize {
54
65
}
55
66
56
67
pub fn build (self : * Self , changes : []const Change ) ! void {
68
+ var num_attributes : u32 = 0 ;
57
69
var num_docs : u32 = 0 ;
58
70
var num_items : usize = 0 ;
59
71
for (changes ) | change | {
@@ -65,9 +77,13 @@ pub fn build(self: *Self, changes: []const Change) !void {
65
77
.delete = > {
66
78
num_docs += 1 ;
67
79
},
80
+ .set_attribute = > {
81
+ num_attributes += 1 ;
82
+ },
68
83
}
69
84
}
70
85
86
+ try self .attributes .ensureTotalCapacity (self .allocator , num_attributes );
71
87
try self .docs .ensureTotalCapacity (num_docs );
72
88
try self .items .ensureTotalCapacity (num_items );
73
89
@@ -92,6 +108,16 @@ pub fn build(self: *Self, changes: []const Change) !void {
92
108
result .value_ptr .* = false ;
93
109
}
94
110
},
111
+ .set_attribute = > | op | {
112
+ const result = self .attributes .getOrPutAssumeCapacity (op .name );
113
+ if (! result .found_existing ) {
114
+ errdefer self .attributes .removeByPtr (result .key_ptr );
115
+ result .key_ptr .* = try self .allocator .dupe (u8 , op .name );
116
+ errdefer self .allocator .free (result .key_ptr .* );
117
+ result .value_ptr .* = try self .allocator .dupe (u8 , op .value );
118
+ errdefer self .allocator .free (result .value_ptr .* );
119
+ }
120
+ },
95
121
}
96
122
}
97
123
0 commit comments