authorgravatar for mailbasvandenberg@gmail.comBas van den Berg <mailbasvandenberg@gmail.com> 2018-07-13 23:01:21+02:00
committergravatar for mailbasvandenberg@gmail.comBas van den Berg <mailbasvandenberg@gmail.com> 2018-07-13 23:01:21+02:00
logfe98a2da70cedaad47ea70d58399e04eb1c7ead2
tree6f988b74cced8f996c137223f2a6bf776c7fc2c0
parenta1cafa650d4ba64404f5db932a40c67b96ccfd1e

Add a copyBackwards to fix the broken insert methods for ArrayList.


2 files changed, 20 insertions(+), 2 deletions(-)

std/array_list.zig+2-2
......@@ -85,7 +85,7 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
8585 try self.ensureCapacity(self.len + 1);
8686 self.len += 1;
8787
88 mem.copy(T, self.items[n + 1 .. self.len], self.items[n .. self.len - 1]);
88 mem.copyBackwards(T, self.items[n + 1 .. self.len], self.items[n .. self.len - 1]);
8989 self.items[n] = item;
9090 }
9191
......@@ -93,7 +93,7 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
9393 try self.ensureCapacity(self.len + items.len);
9494 self.len += items.len;
9595
96 mem.copy(T, self.items[n + items.len .. self.len], self.items[n .. self.len - items.len]);
96 mem.copyBackwards(T, self.items[n + items.len .. self.len], self.items[n .. self.len - items.len]);
9797 mem.copy(T, self.items[n .. n + items.len], items);
9898 }
9999
std/mem.zig+18
......@@ -125,6 +125,7 @@ pub const Allocator = struct {
125125
126126/// Copy all of source into dest at position 0.
127127/// dest.len must be >= source.len.
128/// dest.ptr must be <= src.ptr.
128129pub fn copy(comptime T: type, dest: []T, source: []const T) void {
129130 // TODO instead of manually doing this check for the whole array
130131 // and turning off runtime safety, the compiler should detect loops like
......@@ -135,6 +136,23 @@ pub fn copy(comptime T: type, dest: []T, source: []const T) void {
135136 dest[i] = s;
136137}
137138
139/// Copy all of source into dest at position 0.
140/// dest.len must be >= source.len.
141/// dest.ptr must be >= src.ptr.
142pub fn copyBackwards(comptime T: type, dest: []T, source: []const T) void {
143 // TODO instead of manually doing this check for the whole array
144 // and turning off runtime safety, the compiler should detect loops like
145 // this and automatically omit safety checks for loops
146 @setRuntimeSafety(false);
147 assert(dest.len >= source.len);
148 var i = source.len;
149 while(i > 0){
150 i -= 1;
151 dest[i] = source[i];
152 }
153}
154
155
138156pub fn set(comptime T: type, dest: []T, value: T) void {
139157 for (dest) |*d|
140158 d.* = value;