| ... | @@ -49,6 +49,20 @@ pub fn MultiArrayList(comptime S: type) type { | ... | @@ -49,6 +49,20 @@ pub fn MultiArrayList(comptime S: type) type { |
| 49 | return casted_ptr[0..self.len]; | 49 | return casted_ptr[0..self.len]; |
| 50 | } | 50 | } |
| 51 | | 51 | |
| | 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 | |
| 52 | pub fn toMultiArrayList(self: Slice) Self { | 66 | pub fn toMultiArrayList(self: Slice) Self { |
| 53 | if (self.ptrs.len == 0) { | 67 | if (self.ptrs.len == 0) { |
| 54 | return .{}; | 68 | return .{}; |
| ... | @@ -156,20 +170,12 @@ pub fn MultiArrayList(comptime S: type) type { | ... | @@ -156,20 +170,12 @@ pub fn MultiArrayList(comptime S: type) type { |
| 156 | | 170 | |
| 157 | /// Overwrite one array element with new data. | 171 | /// Overwrite one array element with new data. |
| 158 | pub fn set(self: *Self, index: usize, elem: S) void { | 172 | pub fn set(self: *Self, index: usize, elem: S) void { |
| 159 | const slices = self.slice(); | 173 | return self.slice().set(index, elem); |
| 160 | inline for (fields, 0..) |field_info, i| { | | |
| 161 | slices.items(@intToEnum(Field, i))[index] = @field(elem, field_info.name); | | |
| 162 | } | | |
| 163 | } | 174 | } |
| 164 | | 175 | |
| 165 | /// Obtain all the data for one array element. | 176 | /// Obtain all the data for one array element. |
| 166 | pub fn get(self: Self, index: usize) S { | 177 | pub fn get(self: Self, index: usize) S { |
| 167 | const slices = self.slice(); | 178 | return self.slice().get(index); |
| 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; | | |
| 173 | } | 179 | } |
| 174 | | 180 | |
| 175 | /// Extend the list by 1 element. Allocates more memory as necessary. | 181 | /// Extend the list by 1 element. Allocates more memory as necessary. |