diff --git a/lib/std/array_hash_map.zig b/lib/std/array_hash_map.zig index eb31d1cae3de..78be76fb315d 100644 --- a/lib/std/array_hash_map.zig +++ b/lib/std/array_hash_map.zig @@ -538,6 +538,12 @@ pub fn ArrayHashMapUnmanaged( /// Used to detect memory safety violations. pointer_stability: std.debug.SafetyLock = .{}, + /// A map containing no keys or values. + pub const empty: Self = .{ + .entries = .{}, + .index_header = null, + }; + /// Modifying the key is allowed only if it does not change the hash. /// Modifying the value is allowed. /// Entry pointers become invalid whenever this ArrayHashMap is modified, diff --git a/lib/std/array_list.zig b/lib/std/array_list.zig index 2510973692fa..24098a01f6e8 100644 --- a/lib/std/array_list.zig +++ b/lib/std/array_list.zig @@ -618,6 +618,8 @@ pub fn ArrayListUnmanaged(comptime T: type) type { /// Functions that potentially allocate memory accept an `Allocator` parameter. /// Initialize directly or with `initCapacity`, and deinitialize with `deinit` /// or use `toOwnedSlice`. +/// +/// Default initialization of this struct is deprecated; use `.empty` instead. pub fn ArrayListAlignedUnmanaged(comptime T: type, comptime alignment: ?u29) type { if (alignment) |a| { if (a == @alignOf(T)) { @@ -638,6 +640,12 @@ pub fn ArrayListAlignedUnmanaged(comptime T: type, comptime alignment: ?u29) typ /// additional memory. capacity: usize = 0, + /// An ArrayList containing no elements. + pub const empty: Self = .{ + .items = &.{}, + .capacity = 0, + }; + pub const Slice = if (alignment) |a| ([]align(a) T) else []T; pub fn SentinelSlice(comptime s: T) type { diff --git a/lib/std/hash_map.zig b/lib/std/hash_map.zig index 1c8a5d78afb9..7d7b2739c320 100644 --- a/lib/std/hash_map.zig +++ b/lib/std/hash_map.zig @@ -721,6 +721,8 @@ pub fn HashMap( /// the price of handling size with u32, which should be reasonable enough /// for almost all uses. /// Deletions are achieved with tombstones. +/// +/// Default initialization of this struct is deprecated; use `.empty` instead. pub fn HashMapUnmanaged( comptime K: type, comptime V: type, @@ -762,6 +764,13 @@ pub fn HashMapUnmanaged( /// Capacity of the first grow when bootstrapping the hashmap. const minimal_capacity = 8; + /// A map containing no keys or values. + pub const empty: Self = .{ + .metadata = null, + .size = 0, + .available = 0, + }; + // This hashmap is specially designed for sizes that fit in a u32. pub const Size = u32; diff --git a/lib/std/heap/general_purpose_allocator.zig b/lib/std/heap/general_purpose_allocator.zig index 61e256d29097..b760c9d85de4 100644 --- a/lib/std/heap/general_purpose_allocator.zig +++ b/lib/std/heap/general_purpose_allocator.zig @@ -157,6 +157,7 @@ pub const Config = struct { pub const Check = enum { ok, leak }; +/// Default initialization of this struct is deprecated; use `.init` instead. pub fn GeneralPurposeAllocator(comptime config: Config) type { return struct { backing_allocator: Allocator = std.heap.page_allocator, @@ -174,6 +175,16 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { const Self = @This(); + /// The initial state of a `GeneralPurposeAllocator`, containing no allocations and backed by the system page allocator. + pub const init: Self = .{ + .backing_allocator = std.heap.page_allocator, + .buckets = [1]Buckets{.{}} ** small_bucket_count, + .cur_buckets = [1]?*BucketHeader{null} ** small_bucket_count, + .large_allocations = .{}, + .empty_buckets = if (config.retain_metadata) .{} else {}, + .bucket_node_pool = .init(std.heap.page_allocator), + }; + const total_requested_bytes_init = if (config.enable_memory_limit) @as(usize, 0) else {}; const requested_memory_limit_init = if (config.enable_memory_limit) @as(usize, math.maxInt(usize)) else {};