| ... | ... | @@ -185,64 +185,6 @@ pub fn create(self: Allocator, comptime T: type) Error!*T { |
| 185 | 185 | return &slice[0]; |
| 186 | 186 | } |
| 187 | 187 | |
| 188 | | /// Returns an aligned pointer to undefined memory. |
| 189 | | /// Call `destroy` with the result to free the memory. |
| 190 | | pub fn alignedCreate( |
| 191 | | self: Allocator, |
| 192 | | comptime T: type, |
| 193 | | // null means naturally aligned |
| 194 | | comptime alignment: ?u29, |
| 195 | | ) Error!*align(alignment orelse @alignOf(T)) T { |
| 196 | | if (@sizeOf(T) == 0) return @as(*T, undefined); |
| 197 | | const slice = try self.allocAdvancedWithRetAddr(T, alignment, 1, .exact, @returnAddress()); |
| 198 | | return &slice[0]; |
| 199 | | } |
| 200 | | |
| 201 | | test "create" { |
| 202 | | // Non-zero type, greater alignment |
| 203 | | { |
| 204 | | const x = try std.testing.allocator.alignedCreate(u8, @alignOf(u32)); |
| 205 | | defer std.testing.allocator.destroy(x); |
| 206 | | |
| 207 | | assert(@typeInfo(@TypeOf(x)).Pointer.alignment == @alignOf(u32)); |
| 208 | | } |
| 209 | | // Non-zero type, null alignment |
| 210 | | { |
| 211 | | const x = try std.testing.allocator.alignedCreate(u8, null); |
| 212 | | defer std.testing.allocator.destroy(x); |
| 213 | | |
| 214 | | assert(@typeInfo(@TypeOf(x)).Pointer.alignment == @alignOf(u8)); |
| 215 | | } |
| 216 | | // Non-zero type, lesser alignment |
| 217 | | { |
| 218 | | const x = try std.testing.allocator.alignedCreate(u32, @alignOf(u5)); |
| 219 | | defer std.testing.allocator.destroy(x); |
| 220 | | |
| 221 | | assert(@typeInfo(@TypeOf(x)).Pointer.alignment == @alignOf(u5)); |
| 222 | | } |
| 223 | | // Zero type, greater alignment |
| 224 | | { |
| 225 | | const x = try std.testing.allocator.alignedCreate([0]u8, @alignOf(u32)); |
| 226 | | defer std.testing.allocator.destroy(x); |
| 227 | | |
| 228 | | assert(@typeInfo(@TypeOf(x)).Pointer.alignment == @alignOf(void)); |
| 229 | | } |
| 230 | | // Zero type, null alignment |
| 231 | | { |
| 232 | | const x = try std.testing.allocator.alignedCreate([0]u8, null); |
| 233 | | defer std.testing.allocator.destroy(x); |
| 234 | | |
| 235 | | assert(@typeInfo(@TypeOf(x)).Pointer.alignment == @alignOf(void)); |
| 236 | | } |
| 237 | | // Zero alignment, lesser alignment |
| 238 | | { |
| 239 | | const x = try std.testing.allocator.alignedCreate([0]u8, @alignOf(u5)); |
| 240 | | defer std.testing.allocator.destroy(x); |
| 241 | | |
| 242 | | assert(@typeInfo(@TypeOf(x)).Pointer.alignment == @alignOf(void)); |
| 243 | | } |
| 244 | | } |
| 245 | | |
| 246 | 188 | /// `ptr` should be the return value of `create`, or otherwise |
| 247 | 189 | /// have the same address and alignment property. |
| 248 | 190 | pub fn destroy(self: Allocator, ptr: anytype) void { |