authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-26 03:27:35-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-27 05:58:00-04:00
log0e5e001278465e508130eb159327e6aa11895f1c
tree83f933ead66237a7b7fb5a477923036996ae8a75
parent86625c5a752796b64966541187a5843e11add615

std.MultiArrayList: add set and get to Slice


1 files changed, 16 insertions(+), 10 deletions(-)

lib/std/multi_array_list.zig+16-10
......@@ -49,6 +49,20 @@ pub fn MultiArrayList(comptime S: type) type {
4949 return casted_ptr[0..self.len];
5050 }
5151
52 pub fn set(self: Slice, index: usize, elem: S) void {
53 inline for (fields) |field_info| {
54 self.items(@field(Field, field_info.name))[index] = @field(elem, field_info.name);
55 }
56 }
57
58 pub fn get(self: Slice, index: usize) S {
59 var elem: S = undefined;
60 inline for (fields) |field_info| {
61 @field(elem, field_info.name) = self.items(@field(Field, field_info.name))[index];
62 }
63 return elem;
64 }
65
5266 pub fn toMultiArrayList(self: Slice) Self {
5367 if (self.ptrs.len == 0) {
5468 return .{};
......@@ -156,20 +170,12 @@ pub fn MultiArrayList(comptime S: type) type {
156170
157171 /// Overwrite one array element with new data.
158172 pub fn set(self: *Self, index: usize, elem: S) void {
159 const slices = self.slice();
160 inline for (fields, 0..) |field_info, i| {
161 slices.items(@intToEnum(Field, i))[index] = @field(elem, field_info.name);
162 }
173 return self.slice().set(index, elem);
163174 }
164175
165176 /// Obtain all the data for one array element.
166177 pub fn get(self: Self, index: usize) S {
167 const slices = self.slice();
168 var result: S = undefined;
169 inline for (fields, 0..) |field_info, i| {
170 @field(result, field_info.name) = slices.items(@intToEnum(Field, i))[index];
171 }
172 return result;
178 return self.slice().get(index);
173179 }
174180
175181 /// Extend the list by 1 element. Allocates more memory as necessary.