@zigc/lib 0.17.0-dev.242 → 0.17.0-dev.248
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compiler/std-docs.zig +1 -1
- package/package.json +1 -1
- package/std/heap/memory_pool.zig +34 -197
- package/std/heap.zig +0 -7
- package/std/multi_array_list.zig +24 -0
- package/std/zig/llvm/Builder.zig +2 -2
package/compiler/std-docs.zig
CHANGED
package/package.json
CHANGED
package/std/heap/memory_pool.zig
CHANGED
|
@@ -3,11 +3,6 @@ const Allocator = std.mem.Allocator;
|
|
|
3
3
|
const Alignment = std.mem.Alignment;
|
|
4
4
|
const MemoryPool = std.heap.MemoryPool;
|
|
5
5
|
|
|
6
|
-
/// Deprecated.
|
|
7
|
-
pub fn Managed(comptime Item: type) type {
|
|
8
|
-
return ExtraManaged(Item, .{ .alignment = null });
|
|
9
|
-
}
|
|
10
|
-
|
|
11
6
|
/// A memory pool that can allocate objects of a single type very quickly.
|
|
12
7
|
/// Use this when you need to allocate a lot of objects of the same type,
|
|
13
8
|
/// because it outperforms general purpose allocators.
|
|
@@ -18,11 +13,6 @@ pub fn Aligned(comptime Item: type, comptime alignment: Alignment) type {
|
|
|
18
13
|
return Extra(Item, .{ .alignment = alignment });
|
|
19
14
|
}
|
|
20
15
|
|
|
21
|
-
/// Deprecated.
|
|
22
|
-
pub fn AlignedManaged(comptime Item: type, comptime alignment: Alignment) type {
|
|
23
|
-
return ExtraManaged(Item, .{ .alignment = alignment });
|
|
24
|
-
}
|
|
25
|
-
|
|
26
16
|
pub const Options = struct {
|
|
27
17
|
/// The alignment of the memory pool items. Use `null` for natural alignment.
|
|
28
18
|
alignment: ?Alignment = null,
|
|
@@ -83,13 +73,6 @@ pub fn Extra(comptime Item: type, comptime pool_options: Options) type {
|
|
|
83
73
|
pool.* = undefined;
|
|
84
74
|
}
|
|
85
75
|
|
|
86
|
-
pub fn toManaged(pool: Pool, allocator: Allocator) ExtraManaged(Item, pool_options) {
|
|
87
|
-
return .{
|
|
88
|
-
.allocator = allocator,
|
|
89
|
-
.unmanaged = pool,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
|
|
93
76
|
/// Pre-allocates `num` items and adds them to the memory pool.
|
|
94
77
|
/// This allows at least `num` active allocations before an
|
|
95
78
|
/// `OutOfMemory` error might happen when calling `create()`.
|
|
@@ -114,7 +97,7 @@ pub fn Extra(comptime Item: type, comptime pool_options: Options) type {
|
|
|
114
97
|
/// NOTE: If `mode` is `free_all`, the function will always return `true`.
|
|
115
98
|
pub fn reset(pool: *Pool, allocator: Allocator, mode: ResetMode) bool {
|
|
116
99
|
// TODO: Potentially store all allocated objects in a list as well, allowing to
|
|
117
|
-
//
|
|
100
|
+
// just move them into the free list instead of actually releasing the memory.
|
|
118
101
|
|
|
119
102
|
var arena = pool.arena_state.promote(allocator);
|
|
120
103
|
defer pool.arena_state = arena.state;
|
|
@@ -155,182 +138,56 @@ pub fn Extra(comptime Item: type, comptime pool_options: Options) type {
|
|
|
155
138
|
};
|
|
156
139
|
}
|
|
157
140
|
|
|
158
|
-
/// Deprecated.
|
|
159
|
-
pub fn ExtraManaged(comptime Item: type, comptime pool_options: Options) type {
|
|
160
|
-
if (pool_options.alignment) |a| {
|
|
161
|
-
if (a.compare(.eq, .of(Item))) {
|
|
162
|
-
var new_options = pool_options;
|
|
163
|
-
new_options.alignment = null;
|
|
164
|
-
return ExtraManaged(Item, new_options);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return struct {
|
|
168
|
-
const Pool = @This();
|
|
169
|
-
|
|
170
|
-
allocator: Allocator,
|
|
171
|
-
unmanaged: Unmanaged,
|
|
172
|
-
|
|
173
|
-
pub const Unmanaged = Extra(Item, pool_options);
|
|
174
|
-
pub const item_size = Unmanaged.item_size;
|
|
175
|
-
pub const item_alignment = Unmanaged.item_alignment;
|
|
176
|
-
|
|
177
|
-
const ItemPtr = Unmanaged.ItemPtr;
|
|
178
|
-
|
|
179
|
-
/// Creates a new memory pool.
|
|
180
|
-
pub fn init(allocator: Allocator) Pool {
|
|
181
|
-
return Unmanaged.empty.toManaged(allocator);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/// Creates a new memory pool and pre-allocates `num` items.
|
|
185
|
-
/// This allows up to `num` active allocations before an
|
|
186
|
-
/// `OutOfMemory` error might happen when calling `create()`.
|
|
187
|
-
pub fn initCapacity(allocator: Allocator, num: usize) Allocator.Error!Pool {
|
|
188
|
-
return (try Unmanaged.initCapacity(allocator, num)).toManaged(allocator);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/// Destroys the memory pool and frees all allocated memory.
|
|
192
|
-
pub fn deinit(pool: *Pool) void {
|
|
193
|
-
pool.unmanaged.deinit(pool.allocator);
|
|
194
|
-
pool.* = undefined;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/// Pre-allocates `num` items and adds them to the memory pool.
|
|
198
|
-
/// This allows at least `num` active allocations before an
|
|
199
|
-
/// `OutOfMemory` error might happen when calling `create()`.
|
|
200
|
-
pub fn addCapacity(pool: *Pool, num: usize) Allocator.Error!void {
|
|
201
|
-
return pool.unmanaged.addCapacity(pool.allocator, num);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
pub const ResetMode = Unmanaged.ResetMode;
|
|
205
|
-
|
|
206
|
-
/// Resets the memory pool and destroys all allocated items.
|
|
207
|
-
/// This can be used to batch-destroy all objects without invalidating the memory pool.
|
|
208
|
-
///
|
|
209
|
-
/// The function will return whether the reset operation was successful or not.
|
|
210
|
-
/// If the reallocation failed `false` is returned. The pool will still be fully
|
|
211
|
-
/// functional in that case, all memory is released. Future allocations just might
|
|
212
|
-
/// be slower.
|
|
213
|
-
///
|
|
214
|
-
/// NOTE: If `mode` is `free_all`, the function will always return `true`.
|
|
215
|
-
pub fn reset(pool: *Pool, mode: ResetMode) bool {
|
|
216
|
-
return pool.unmanaged.reset(pool.allocator, mode);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/// Creates a new item and adds it to the memory pool.
|
|
220
|
-
pub fn create(pool: *Pool) Allocator.Error!ItemPtr {
|
|
221
|
-
return pool.unmanaged.create(pool.allocator);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/// Destroys a previously created item.
|
|
225
|
-
/// Only pass items to `ptr` that were previously created with `create()` of the same memory pool!
|
|
226
|
-
pub fn destroy(pool: *Pool, ptr: ItemPtr) void {
|
|
227
|
-
return pool.unmanaged.destroy(ptr);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
fn allocNew(pool: *Pool) Allocator.Error!*align(item_alignment) [item_size]u8 {
|
|
231
|
-
return pool.unmanaged.allocNew(pool.allocator);
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
|
|
236
141
|
test "basic" {
|
|
237
142
|
const a = std.testing.allocator;
|
|
238
143
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
defer pool.deinit(a);
|
|
242
|
-
|
|
243
|
-
const p1 = try pool.create(a);
|
|
244
|
-
const p2 = try pool.create(a);
|
|
245
|
-
const p3 = try pool.create(a);
|
|
246
|
-
|
|
247
|
-
// Assert uniqueness
|
|
248
|
-
try std.testing.expect(p1 != p2);
|
|
249
|
-
try std.testing.expect(p1 != p3);
|
|
250
|
-
try std.testing.expect(p2 != p3);
|
|
144
|
+
var pool: MemoryPool(u32) = .empty;
|
|
145
|
+
defer pool.deinit(a);
|
|
251
146
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
// Assert memory reuse
|
|
256
|
-
try std.testing.expect(p2 == p4);
|
|
257
|
-
}
|
|
147
|
+
const p1 = try pool.create(a);
|
|
148
|
+
const p2 = try pool.create(a);
|
|
149
|
+
const p3 = try pool.create(a);
|
|
258
150
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
151
|
+
// Assert uniqueness
|
|
152
|
+
try std.testing.expect(p1 != p2);
|
|
153
|
+
try std.testing.expect(p1 != p3);
|
|
154
|
+
try std.testing.expect(p2 != p3);
|
|
262
155
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
const p3 = try pool.create();
|
|
156
|
+
pool.destroy(p2);
|
|
157
|
+
const p4 = try pool.create(a);
|
|
266
158
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
try std.testing.expect(p1 != p3);
|
|
270
|
-
try std.testing.expect(p2 != p3);
|
|
271
|
-
|
|
272
|
-
pool.destroy(p2);
|
|
273
|
-
const p4 = try pool.create();
|
|
274
|
-
|
|
275
|
-
// Assert memory reuse
|
|
276
|
-
try std.testing.expect(p2 == p4);
|
|
277
|
-
}
|
|
159
|
+
// Assert memory reuse
|
|
160
|
+
try std.testing.expect(p2 == p4);
|
|
278
161
|
}
|
|
279
162
|
|
|
280
163
|
test "initCapacity (success)" {
|
|
281
164
|
const a = std.testing.allocator;
|
|
282
165
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
defer pool.deinit(a);
|
|
286
|
-
|
|
287
|
-
_ = try pool.create(a);
|
|
288
|
-
_ = try pool.create(a);
|
|
289
|
-
_ = try pool.create(a);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
{
|
|
293
|
-
var pool: Managed(u32) = try .initCapacity(a, 4);
|
|
294
|
-
defer pool.deinit();
|
|
166
|
+
var pool: MemoryPool(u32) = try .initCapacity(a, 4);
|
|
167
|
+
defer pool.deinit(a);
|
|
295
168
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
169
|
+
_ = try pool.create(a);
|
|
170
|
+
_ = try pool.create(a);
|
|
171
|
+
_ = try pool.create(a);
|
|
300
172
|
}
|
|
301
173
|
|
|
302
174
|
test "initCapacity (failure)" {
|
|
303
175
|
const failer = std.testing.failing_allocator;
|
|
304
176
|
try std.testing.expectError(error.OutOfMemory, MemoryPool(u32).initCapacity(failer, 5));
|
|
305
|
-
try std.testing.expectError(error.OutOfMemory, Managed(u32).initCapacity(failer, 5));
|
|
306
177
|
}
|
|
307
178
|
|
|
308
179
|
test "growable" {
|
|
309
180
|
const a = std.testing.allocator;
|
|
310
181
|
|
|
311
|
-
{
|
|
312
|
-
|
|
313
|
-
defer pool.deinit(a);
|
|
314
|
-
|
|
315
|
-
_ = try pool.create(a);
|
|
316
|
-
_ = try pool.create(a);
|
|
317
|
-
_ = try pool.create(a);
|
|
318
|
-
_ = try pool.create(a);
|
|
319
|
-
|
|
320
|
-
try std.testing.expectError(error.OutOfMemory, pool.create(a));
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
{
|
|
324
|
-
var pool: ExtraManaged(u32, .{ .growable = false }) = try .initCapacity(a, 4);
|
|
325
|
-
defer pool.deinit();
|
|
182
|
+
var pool: Extra(u32, .{ .growable = false }) = try .initCapacity(a, 4);
|
|
183
|
+
defer pool.deinit(a);
|
|
326
184
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
185
|
+
_ = try pool.create(a);
|
|
186
|
+
_ = try pool.create(a);
|
|
187
|
+
_ = try pool.create(a);
|
|
188
|
+
_ = try pool.create(a);
|
|
331
189
|
|
|
332
|
-
|
|
333
|
-
}
|
|
190
|
+
try std.testing.expectError(error.OutOfMemory, pool.create(a));
|
|
334
191
|
}
|
|
335
192
|
|
|
336
193
|
test "greater than pointer default alignment" {
|
|
@@ -339,21 +196,11 @@ test "greater than pointer default alignment" {
|
|
|
339
196
|
};
|
|
340
197
|
const a = std.testing.allocator;
|
|
341
198
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
defer pool.deinit(a);
|
|
345
|
-
|
|
346
|
-
const foo: *Foo = try pool.create(a);
|
|
347
|
-
pool.destroy(foo);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
{
|
|
351
|
-
var pool: Managed(Foo) = .init(a);
|
|
352
|
-
defer pool.deinit();
|
|
199
|
+
var pool: MemoryPool(Foo) = .empty;
|
|
200
|
+
defer pool.deinit(a);
|
|
353
201
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
}
|
|
202
|
+
const foo: *Foo = try pool.create(a);
|
|
203
|
+
pool.destroy(foo);
|
|
357
204
|
}
|
|
358
205
|
|
|
359
206
|
test "greater than pointer manual alignment" {
|
|
@@ -362,19 +209,9 @@ test "greater than pointer manual alignment" {
|
|
|
362
209
|
};
|
|
363
210
|
const a = std.testing.allocator;
|
|
364
211
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
defer pool.deinit(a);
|
|
368
|
-
|
|
369
|
-
const foo: *align(16) Foo = try pool.create(a);
|
|
370
|
-
pool.destroy(foo);
|
|
371
|
-
}
|
|
212
|
+
var pool: Aligned(Foo, .@"16") = .empty;
|
|
213
|
+
defer pool.deinit(a);
|
|
372
214
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
defer pool.deinit();
|
|
376
|
-
|
|
377
|
-
const foo: *align(16) Foo = try pool.create();
|
|
378
|
-
pool.destroy(foo);
|
|
379
|
-
}
|
|
215
|
+
const foo: *align(16) Foo = try pool.create(a);
|
|
216
|
+
pool.destroy(foo);
|
|
380
217
|
}
|
package/std/heap.zig
CHANGED
|
@@ -30,13 +30,6 @@ pub fn MemoryPool(comptime Item: type) type {
|
|
|
30
30
|
}
|
|
31
31
|
pub const memory_pool = @import("heap/memory_pool.zig");
|
|
32
32
|
|
|
33
|
-
/// Deprecated; use `memory_pool.Aligned`.
|
|
34
|
-
pub const MemoryPoolAligned = memory_pool.Aligned;
|
|
35
|
-
/// Deprecated; use `memory_pool.Extra`.
|
|
36
|
-
pub const MemoryPoolExtra = memory_pool.Extra;
|
|
37
|
-
/// Deprecated; use `memory_pool.Options`.
|
|
38
|
-
pub const MemoryPoolOptions = memory_pool.Options;
|
|
39
|
-
|
|
40
33
|
/// comptime-known minimum page size of the target.
|
|
41
34
|
///
|
|
42
35
|
/// All pointers from `mmap` or `NtAllocateVirtualMemory` are aligned to at least
|
package/std/multi_array_list.zig
CHANGED
|
@@ -133,6 +133,13 @@ pub fn MultiArrayList(comptime T: type) type {
|
|
|
133
133
|
};
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
pub fn swap(self: Slice, a: usize, b: usize) void {
|
|
137
|
+
inline for (@typeInfo(Field).@"enum".fields) |field| {
|
|
138
|
+
const its = self.items(@field(Field, field.name));
|
|
139
|
+
std.mem.swap(@FieldType(T, field.name), &its[a], &its[b]);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
136
143
|
pub fn toMultiArrayList(self: Slice) Self {
|
|
137
144
|
if (self.ptrs.len == 0 or self.capacity == 0) {
|
|
138
145
|
return .{};
|
|
@@ -267,6 +274,10 @@ pub fn MultiArrayList(comptime T: type) type {
|
|
|
267
274
|
return self.slice().get(index);
|
|
268
275
|
}
|
|
269
276
|
|
|
277
|
+
pub fn swap(self: Self, a: usize, b: usize) void {
|
|
278
|
+
return self.slice().swap(a, b);
|
|
279
|
+
}
|
|
280
|
+
|
|
270
281
|
/// Extend the list by 1 element.
|
|
271
282
|
///
|
|
272
283
|
/// Allocates more memory as necessary.
|
|
@@ -771,6 +782,19 @@ test "basic usage" {
|
|
|
771
782
|
try testing.expectEqualSlices(u32, list.items(.a), &[_]u32{ 1, 2, 3 });
|
|
772
783
|
try testing.expectEqualSlices(u8, list.items(.c), &[_]u8{ 'a', 'b', 'c' });
|
|
773
784
|
|
|
785
|
+
list.swap(0, 2);
|
|
786
|
+
try testing.expectEqualSlices(u32, list.items(.a), &[_]u32{ 3, 2, 1 });
|
|
787
|
+
try testing.expectEqualSlices(u8, list.items(.c), &[_]u8{ 'c', 'b', 'a' });
|
|
788
|
+
list.swap(2, 1);
|
|
789
|
+
try testing.expectEqualSlices(u32, list.items(.a), &[_]u32{ 3, 1, 2 });
|
|
790
|
+
try testing.expectEqualSlices(u8, list.items(.c), &[_]u8{ 'c', 'a', 'b' });
|
|
791
|
+
list.swap(2, 0);
|
|
792
|
+
try testing.expectEqualSlices(u32, list.items(.a), &[_]u32{ 2, 1, 3 });
|
|
793
|
+
try testing.expectEqualSlices(u8, list.items(.c), &[_]u8{ 'b', 'a', 'c' });
|
|
794
|
+
list.swap(0, 1);
|
|
795
|
+
try testing.expectEqualSlices(u32, list.items(.a), &[_]u32{ 1, 2, 3 });
|
|
796
|
+
try testing.expectEqualSlices(u8, list.items(.c), &[_]u8{ 'a', 'b', 'c' });
|
|
797
|
+
|
|
774
798
|
try testing.expectEqual(@as(usize, 3), list.items(.b).len);
|
|
775
799
|
try testing.expectEqualStrings("foobar", list.items(.b)[0]);
|
|
776
800
|
try testing.expectEqualStrings("zigzag", list.items(.b)[1]);
|
package/std/zig/llvm/Builder.zig
CHANGED
|
@@ -10022,9 +10022,9 @@ pub fn print(self: *Builder, w: *Writer) (Writer.Error || Allocator.Error)!void
|
|
|
10022
10022
|
defer metadata_formatter.need_comma = undefined;
|
|
10023
10023
|
switch (extra.weights) {
|
|
10024
10024
|
.none => {},
|
|
10025
|
-
.unpredictable => try w.writeAll("!unpredictable !{}"),
|
|
10025
|
+
.unpredictable => try w.writeAll(", !unpredictable !{}"),
|
|
10026
10026
|
_ => try w.print("{f}", .{
|
|
10027
|
-
try metadata_formatter.fmt("!prof ", extra.weights.toMetadata(), null),
|
|
10027
|
+
try metadata_formatter.fmt(", !prof ", extra.weights.toMetadata(), null),
|
|
10028
10028
|
}),
|
|
10029
10029
|
}
|
|
10030
10030
|
},
|