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 {...@@ -85,7 +85,7 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
85 try self.ensureCapacity(self.len + 1);85 try self.ensureCapacity(self.len + 1);
86 self.len += 1;86 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]);
89 self.items[n] = item;89 self.items[n] = item;
90 }90 }
9191
...@@ -93,7 +93,7 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {...@@ -93,7 +93,7 @@ pub fn AlignedArrayList(comptime T: type, comptime A: u29) type {
93 try self.ensureCapacity(self.len + items.len);93 try self.ensureCapacity(self.len + items.len);
94 self.len += items.len;94 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]);
97 mem.copy(T, self.items[n .. n + items.len], items);97 mem.copy(T, self.items[n .. n + items.len], items);
98 }98 }
9999
std/mem.zig+18
...@@ -125,6 +125,7 @@ pub const Allocator = struct {...@@ -125,6 +125,7 @@ pub const Allocator = struct {
125125
126/// Copy all of source into dest at position 0.126/// Copy all of source into dest at position 0.
127/// dest.len must be >= source.len.127/// dest.len must be >= source.len.
128/// dest.ptr must be <= src.ptr.
128pub fn copy(comptime T: type, dest: []T, source: []const T) void {129pub fn copy(comptime T: type, dest: []T, source: []const T) void {
129 // TODO instead of manually doing this check for the whole array130 // TODO instead of manually doing this check for the whole array
130 // and turning off runtime safety, the compiler should detect loops like131 // 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 {...@@ -135,6 +136,23 @@ pub fn copy(comptime T: type, dest: []T, source: []const T) void {
135 dest[i] = s;136 dest[i] = s;
136}137}
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
138pub fn set(comptime T: type, dest: []T, value: T) void {156pub fn set(comptime T: type, dest: []T, value: T) void {
139 for (dest) |*d|157 for (dest) |*d|
140 d.* = value;158 d.* = value;