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); }