Implemented stack transfert
This commit is contained in:
parent
8e9f1f3af0
commit
dae0b3d39c
1 changed files with 49 additions and 2 deletions
|
@ -74,8 +74,55 @@ pub const Stack = struct {
|
||||||
try s.swap();
|
try s.swap();
|
||||||
try std.testing.expectEqual(s.popVector(), @as(vector, [2]i64{ 2, 0 }));
|
try std.testing.expectEqual(s.popVector(), @as(vector, [2]i64{ 2, 0 }));
|
||||||
}
|
}
|
||||||
//pub fn transfert(toss: *Stack, soss: *Stack, n: u64) !void {
|
pub fn transfert(toss: *Stack, soss: *Stack, n: u64) !void {
|
||||||
//}
|
// Implements a value transfert between two stacks, intended for use with the '{'
|
||||||
|
// (aka begin) and '}' (aka end) stackstack commands
|
||||||
|
try toss.data.ensureUnusedCapacity(n);
|
||||||
|
var i: usize = n;
|
||||||
|
while (i >= std.math.min(soss.data.items.len, n) + 1) : (i -= 1) {
|
||||||
|
toss.data.appendAssumeCapacity(0);
|
||||||
|
}
|
||||||
|
while (i >= 1) : (i -= 1) {
|
||||||
|
toss.data.appendAssumeCapacity(soss.data.items[soss.data.items.len - i]);
|
||||||
|
}
|
||||||
|
if (soss.data.items.len >= n) {
|
||||||
|
soss.data.items.len -= n;
|
||||||
|
} else {
|
||||||
|
soss.data.items.len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
test "transfert" {
|
||||||
|
var empty = try Stack.init(std.testing.allocator);
|
||||||
|
defer empty.deinit();
|
||||||
|
var empty2 = try Stack.init(std.testing.allocator);
|
||||||
|
defer empty2.deinit();
|
||||||
|
try empty.transfert(empty2, 4);
|
||||||
|
const emptyResult = [_]i64{ 0, 0, 0, 0 };
|
||||||
|
try std.testing.expectEqualSlices(i64, empty.data.items, emptyResult[0..]);
|
||||||
|
const empty2Result = [_]i64{};
|
||||||
|
try std.testing.expectEqualSlices(i64, empty2.data.items, empty2Result[0..]);
|
||||||
|
try empty.transfert(empty2, 32);
|
||||||
|
try std.testing.expectEqual(empty.data.items.len, 36);
|
||||||
|
empty.clear();
|
||||||
|
var some = try Stack.init(std.testing.allocator);
|
||||||
|
defer some.deinit();
|
||||||
|
try some.push(2);
|
||||||
|
try empty.transfert(some, 3);
|
||||||
|
const emptyResult2 = [_]i64{ 0, 0, 2 };
|
||||||
|
try std.testing.expectEqualSlices(i64, empty.data.items, emptyResult2[0..]);
|
||||||
|
try std.testing.expectEqualSlices(i64, some.data.items, empty2Result[0..]);
|
||||||
|
empty.clear();
|
||||||
|
var full = try Stack.init(std.testing.allocator);
|
||||||
|
defer full.deinit();
|
||||||
|
try full.push(1);
|
||||||
|
try full.push(2);
|
||||||
|
try full.push(3);
|
||||||
|
try empty.transfert(full, 2);
|
||||||
|
const emptyResult3 = [_]i64{ 2, 3 };
|
||||||
|
try std.testing.expectEqualSlices(i64, empty.data.items, emptyResult3[0..]);
|
||||||
|
const fullResult = [_]i64{1};
|
||||||
|
try std.testing.expectEqualSlices(i64, full.data.items, fullResult[0..]);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
test "all" {
|
test "all" {
|
||||||
|
|
Loading…
Add table
Reference in a new issue