diff options
Diffstat (limited to 'lang/zig/arrays.zig')
-rw-r--r-- | lang/zig/arrays.zig | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lang/zig/arrays.zig b/lang/zig/arrays.zig new file mode 100644 index 0000000..d2658c2 --- /dev/null +++ b/lang/zig/arrays.zig @@ -0,0 +1,100 @@ +const expect = @import("std").testing.expect; +const mem = @import("std").mem; + +// array literal +const message = [_]u8{ 'h', 'e', 'l', 'l', 'o' }; + +// get the size of an array +comptime { + expect(message.len == 5); +} + +// A string literal is a pointer to an array literal. +const same_message = "hello"; + +comptime { + expect(mem.eql(u8, &message, same_message)); +} + +test "iterate over an array" { + var sum: usize = 0; + for (message) |byte| + sum += byte; + expect(sum == 'h' + 'e' + 'l' * 2 + 'o'); +} + +// modifiable array +var some_integers: [100]i32 = undefined; + +test "modify an array" { + for (some_integers) |*item, i| + item.* = @intCast(i32, i); + expect(some_integers[10] == 10); + expect(some_integers[99] == 99); +} + +// array concatenation works if the values are known +// at compile time +const part_one = [_]i32{ 1, 2, 3, 4 }; +const part_two = [_]i32{ 5, 6, 7, 8 }; +const all_of_it = part_one ++ part_two; +comptime { + expect(mem.eql(i32, &all_of_it, &[_]i32{ 1, 2, 3, 4, 5, 6, 7, 8 })); +} + +// remember that string literals are arrays +const hello = "hello"; +const world = "world"; +const hello_world = hello ++ " " ++ world; +comptime { + expect(mem.eql(u8, hello_world, "hello world")); +} + +// ** does repeating patterns +const pattern = "ab" ** 3; +comptime { + expect(mem.eql(u8, pattern, "ababab")); +} + +// initialize an array to zero +const all_zero = [_]u16{0} ** 10; + +comptime { + expect(all_zero.len == 10); + expect(all_zero[5] == 0); +} + +// use compile-time code to initialize an array +var fancy_array = init: { + var initial_value: [10]Point = undefined; + for (initial_value) |*pt, i| { + pt.* = Point{ + .x = @intCast(i32, i), + .y = @intCast(i32, i) * 2, + }; + } + break :init initial_value; +}; +const Point = struct { + x: i32, + y: i32, +}; + +test "compile-time array initialization" { + expect(fancy_array[4].x == 4); + expect(fancy_array[4].y == 8); +} + +// call a function to initialize an array +var more_points = [_]Point{makePoint(3)} ** 10; +fn makePoint(x: i32) Point { + return Point{ + .x = x, + .y = x * 2, + }; +} +test "array initialization with function calls" { + expect(more_points[4].x == 3); + expect(more_points[4].y == 6); + expect(more_points.len == 10); +} |