Update examples for Zig (#287)
* update zig in chapters 1-6 * fix zig dijkstras algo * fix zig greedy algo * fix longest_common_subsequence in zig * cleanup * test: use testing allocator
This commit is contained in:
@@ -17,7 +17,7 @@ fn sum(comptime T: type, arr: []T) T {
|
||||
test "sum" {
|
||||
var arr0 = [_]i32{ 1, 2, 3, 4 };
|
||||
var arr1 = [_]i32{};
|
||||
var tests = [_]struct {
|
||||
const tests = [_]struct {
|
||||
arr: []i32,
|
||||
exp: i32,
|
||||
}{
|
||||
@@ -32,7 +32,7 @@ test "sum" {
|
||||
};
|
||||
|
||||
for (tests) |t| {
|
||||
var n = sum(@TypeOf(t.exp), t.arr);
|
||||
const n = sum(@TypeOf(t.exp), t.arr);
|
||||
try expect(n == t.exp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ fn sum(comptime T: type, list: []T) T {
|
||||
test "sum" {
|
||||
var arr0 = [_]i32{ 1, 2, 3, 4 };
|
||||
var arr1 = [_]i32{};
|
||||
var tests = [_]struct {
|
||||
const tests = [_]struct {
|
||||
arr: []i32,
|
||||
exp: i32,
|
||||
}{
|
||||
@@ -31,7 +31,7 @@ test "sum" {
|
||||
};
|
||||
|
||||
for (tests) |t| {
|
||||
var n = sum(@TypeOf(t.exp), t.arr);
|
||||
const n = sum(@TypeOf(t.exp), t.arr);
|
||||
try expect(n == t.exp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ test "count" {
|
||||
var arr0 = [_]i32{};
|
||||
var arr1 = [_]i32{42};
|
||||
var arr2 = [_]i32{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||
var tests = [_]struct {
|
||||
const tests = [_]struct {
|
||||
arr: []i32,
|
||||
exp: i32,
|
||||
}{
|
||||
|
||||
@@ -32,8 +32,8 @@ fn quicksort(comptime T: type, allocator: mem.Allocator, s: []const T) anyerror!
|
||||
}
|
||||
}
|
||||
|
||||
var low = try quicksort(T, allocator, lower.items);
|
||||
var high = try quicksort(T, allocator, higher.items);
|
||||
const low = try quicksort(T, allocator, lower.items);
|
||||
const high = try quicksort(T, allocator, higher.items);
|
||||
|
||||
var res = std.ArrayList(T).init(allocator);
|
||||
try res.appendSlice(low);
|
||||
@@ -44,13 +44,8 @@ fn quicksort(comptime T: type, allocator: mem.Allocator, s: []const T) anyerror!
|
||||
}
|
||||
|
||||
test "quicksort" {
|
||||
var gpa = heap.GeneralPurposeAllocator(.{}){};
|
||||
var arena = heap.ArenaAllocator.init(gpa.allocator());
|
||||
defer {
|
||||
arena.deinit();
|
||||
const leaked = gpa.deinit();
|
||||
if (leaked) std.testing.expect(false) catch @panic("TEST FAIL"); //fail test; can't try in defer as defer is executed after we return
|
||||
}
|
||||
var arena = heap.ArenaAllocator.init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
|
||||
const tests = [_]struct {
|
||||
s: []const u8,
|
||||
@@ -71,9 +66,9 @@ test "quicksort" {
|
||||
};
|
||||
|
||||
for (tests) |t| {
|
||||
var res = try quicksort(u8, arena.allocator(), t.s);
|
||||
const res = try quicksort(u8, arena.allocator(), t.s);
|
||||
try expect(res.len == t.exp.len);
|
||||
for (res) |e, i|
|
||||
for (res, 0..) |e, i|
|
||||
try expect(e == t.exp[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,32 +4,31 @@ const expect = std.testing.expect;
|
||||
const heap = std.heap;
|
||||
const mem = std.mem;
|
||||
|
||||
pub const io_mode = .evented;
|
||||
|
||||
pub const Error = error{OutOfMemory};
|
||||
// pub const io_mode = .evented;
|
||||
|
||||
pub fn main() !void {
|
||||
var gpa = heap.GeneralPurposeAllocator(.{}){};
|
||||
var arena = heap.ArenaAllocator.init(gpa.allocator());
|
||||
defer arena.deinit();
|
||||
|
||||
var s = [_]u8{ 5, 3, 6, 2, 10 };
|
||||
var u = [_]u8{ 5, 3, 6, 2, 10 };
|
||||
|
||||
print("{d}\n", .{try quicksort(arena.allocator(), &s)});
|
||||
var s = try std.ArrayList(u8).initCapacity(arena.allocator(), u.len);
|
||||
try quicksort(u8, arena.allocator(), &u, &s);
|
||||
print("{d}\n", .{s.items});
|
||||
}
|
||||
|
||||
// NOTE: this async version cannot be generic because allocating a frame for a
|
||||
// generic function is not trivial.
|
||||
fn quicksort(allocator: mem.Allocator, s: []const u8) Error![]const u8 {
|
||||
if (s.len < 2) {
|
||||
return s;
|
||||
fn quicksort(comptime T: type, allocator: mem.Allocator, u: []const T, s: *std.ArrayList(T)) !void {
|
||||
if (u.len < 2) {
|
||||
try s.appendSlice(u);
|
||||
return;
|
||||
}
|
||||
|
||||
var lower = std.ArrayList(u8).init(allocator);
|
||||
var higher = std.ArrayList(u8).init(allocator);
|
||||
var lower = std.ArrayList(T).init(allocator);
|
||||
var higher = std.ArrayList(T).init(allocator);
|
||||
|
||||
const pivot = s[0];
|
||||
for (s[1..]) |item| {
|
||||
const pivot = u[0];
|
||||
for (u[1..]) |item| {
|
||||
if (item <= pivot) {
|
||||
try lower.append(item);
|
||||
} else {
|
||||
@@ -37,27 +36,41 @@ fn quicksort(allocator: mem.Allocator, s: []const u8) Error![]const u8 {
|
||||
}
|
||||
}
|
||||
|
||||
const low_frame = try allocator.create(@Frame(quicksort));
|
||||
low_frame.* = async quicksort(allocator, lower.items);
|
||||
var high = try quicksort(allocator, higher.items);
|
||||
var low = try await low_frame;
|
||||
// NOTE: zig has temporary removed the async/await syntax since v0.11.0
|
||||
//
|
||||
// const low_frame = try allocator.create(@Frame(quicksort));
|
||||
// low_frame.* = async quicksort(allocator, lower.items);
|
||||
// const high = try quicksort(allocator, higher.items);
|
||||
// const low = try await low_frame;
|
||||
|
||||
var res = std.ArrayList(u8).init(allocator);
|
||||
try res.appendSlice(low);
|
||||
try res.append(pivot);
|
||||
try res.appendSlice(high);
|
||||
var low = try std.ArrayList(T).initCapacity(allocator, lower.items.len);
|
||||
var high = try std.ArrayList(T).initCapacity(allocator, higher.items.len);
|
||||
|
||||
return res.items;
|
||||
var low_handle = try std.Thread.spawn(
|
||||
.{},
|
||||
quicksort,
|
||||
.{ T, allocator, lower.items, &low },
|
||||
);
|
||||
var high_handle = try std.Thread.spawn(
|
||||
.{},
|
||||
quicksort,
|
||||
.{ T, allocator, higher.items, &high },
|
||||
);
|
||||
low_handle.join();
|
||||
high_handle.join();
|
||||
|
||||
const lows = try low.toOwnedSlice();
|
||||
const highs = try high.toOwnedSlice();
|
||||
try s.appendSlice(lows);
|
||||
try s.append(pivot);
|
||||
try s.appendSlice(highs);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
test "quicksort" {
|
||||
var gpa = heap.GeneralPurposeAllocator(.{}){};
|
||||
var arena = heap.ArenaAllocator.init(gpa.allocator());
|
||||
defer {
|
||||
arena.deinit();
|
||||
const leaked = gpa.deinit();
|
||||
if (leaked) std.testing.expect(false) catch @panic("TEST FAIL"); //fail test; can't try in defer as defer is executed after we return
|
||||
}
|
||||
var arena = heap.ArenaAllocator.init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
|
||||
const tests = [_]struct {
|
||||
s: []const u8,
|
||||
@@ -78,9 +91,10 @@ test "quicksort" {
|
||||
};
|
||||
|
||||
for (tests) |t| {
|
||||
var res = try quicksort(arena.allocator(), t.s);
|
||||
try expect(res.len == t.exp.len);
|
||||
for (res) |e, i|
|
||||
try expect(e == t.exp[i]);
|
||||
var res = std.ArrayList(u8).init(arena.allocator());
|
||||
try quicksort(u8, arena.allocator(), t.s, &res);
|
||||
try expect(res.items.len == t.exp.len); // length not matching
|
||||
for (res.items, 0..) |e, i|
|
||||
try expect(e == t.exp[i]); // element not matching
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user