Ziglings
:
001_hello.zig
002_std.zig
003_assignment.zig
004_arrays.zig
005_arrays2.zig
006_strings.zig
007_strings2.zig
008_quiz.zig
009_if.zig
010_if2.zig
011_while.zig
012_while2.zig
013_while3.zig
014_while4.zig
015_for.zig
016_for2.zig
017_quiz2.zig
018_functions.zig
019_functions2.zig
020_quiz3.zig
021_errors.zig
022_errors2.zig
023_errors3.zig
024_errors4.zig
025_errors5.zig
026_hello2.zig
027_defer.zig
028_defer2.zig
029_errdefer.zig
030_switch.zig
031_switch2.zig
032_unreachable.zig
033_iferror.zig
034_quiz4.zig
035_enums.zig
036_enums2.zig
037_structs.zig
038_structs2.zig
039_pointers.zig
040_pointers2.zig
041_pointers3.zig
042_pointers4.zig
043_pointers5.zig
044_quiz5.zig
045_optionals.zig
046_optionals2.zig
047_methods.zig
048_methods2.zig
049_quiz6.zig
050_no_value.zig
051_values.zig
052_slices.zig
053_slices2.zig
054_manypointers.zig
055_unions.zig
056_unions2.zig
057_unions3.zig
058_quiz7.zig
059_integers.zig
060_floats.zig
061_coercions.zig
062_loop_expressions.zig
063_labels.zig
064_builtins.zig
065_builtins2.zig
066_comptime.zig
067_comptime2.zig
068_comptime3.zig
069_comptime4.zig
070_comptime5.zig
071_comptime6.zig
072_comptime7.zig
073_comptime8.zig
074_comptime9.zig
075_quiz8.zig
076_sentinels.zig
077_sentinels2.zig
078_sentinels3.zig
079_quoted_identifiers.zig
080_anonymous_structs.zig
081_anonymous_structs2.zig
082_anonymous_structs3.zig
083_anonymous_lists.zig
084_async.zig
085_async2.zig
086_async3.zig
087_async4.zig
088_async5.zig
089_async6.zig
090_async7.zig
091_async8.zig
092_interfaces.zig
093_hello_c.zig
094_c_math.zig
095_for3.zig
096_memory_allocation.zig
097_bit_manipulation.zig
098_bit_manipulation2.zig
099_formatting.zig
100_for4.zig
101_for5.zig
102_testing.zig
103_tokenization.zig
104_threading.zig
105_threading2.zig
106_files.zig
107_files2.zig
108_labeled_switch.zig
109_vectors.zig
110_quiz9.zig
999_the_end.zig
const std = @import("std"); const testing = std.testing; const RoundRobinError = error{ NotExists, }; pub const RoundRobin = struct { const Self = @This(); ips: []std.net.Address = undefined, var atomic: u32 = undefined; pub fn init(ips: []std.net.Address) RoundRobinError!RoundRobin { if (ips.len == 0) { return RoundRobinError.NotExists; } return .{ .ips = ips }; } pub fn next(self: Self) std.net.Address { @atomicStore(u32, &atomic, atomic + 1, .release); const n = atomic; return self.ips[(n - 1) % self.ips.len]; } }; pub fn main() !void { var ips = [_]std.net.Address{ try std.net.Address.parseIp("100.123.10.20", 0), try std.net.Address.parseIp("100.123.30.40", 0), try std.net.Address.parseIp("100.123.50.60", 0), try std.net.Address.parseIp("100.123.70.80", 0), }; const rr = try RoundRobin.init(&ips); _ = rr.next(); // "100.123.50.60" _ = rr.next(); // "100.123.70.80" _ = rr.next(); // "100.123.10.20" const lastIP = rr.next(); // "100.123.30.40" std.debug.print("available ips {any}\n", .{ips}); std.testing.expect(std.net.Address.eql(lastIP, try std.net.Address.parseIp("100.123.30.40", 0))) catch { std.debug.print("got unexpected ip {?}", .{lastIP}); return; }; std.debug.print("last ip: {?}", .{lastIP}); }