const expect = @import("std").testing.expect; const assert = @import("std").debug.assert; const mem = @import("std").mem; // array literal const message = [_]u8{ 'h', 'e', 'l', 'l', 'o' }; // alternative initialization using result location const alt_message: [5]u8 = .{ 'h', 'e', 'l', 'l', 'o' }; comptime { assert(mem.eql(u8, &message, &alt_message)); } // get the size of an array comptime { assert(message.len == 5); } // A string literal is a single-item pointer to an array. const same_message = "hello"; comptime { assert(mem.eql(u8, &message, same_message)); } test "iterate over an array" { var sum: usize = 0; for (message) |byte| { sum += byte; } try expect(sum == 'h' + 'e' + 'l' * 2 + 'o'); } // modifiable array var some_integers: [100]i32 = undefined; test "modify an array" { for (&some_integers, 0..) |*item, i| { item.* = @intCast(i); } try expect(some_integers[10] == 10); try 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 { assert(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 { assert(mem.eql(u8, hello_world, "hello world")); } // ** does repeating patterns const pattern = "ab" ** 3; comptime { assert(mem.eql(u8, pattern, "ababab")); } // initialize an array to zero const all_zero = [_]u16{0} ** 10; comptime { assert(all_zero.len == 10); assert(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, 0..) |*pt, i| { pt.* = Point{ .x = @intCast(i), .y = @intCast(i * 2), }; } break :init initial_value; }; const Point = struct { x: i32, y: i32, }; test "compile-time array initialization" { try expect(fancy_array[4].x == 4); try 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" { try expect(more_points[4].x == 3); try expect(more_points[4].y == 6); try expect(more_points.len == 10); } // test