aboutsummaryrefslogtreecommitdiff
path: root/exercises/55_unions.zig
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/55_unions.zig')
-rw-r--r--exercises/55_unions.zig76
1 files changed, 0 insertions, 76 deletions
diff --git a/exercises/55_unions.zig b/exercises/55_unions.zig
deleted file mode 100644
index 5e08aa1..0000000
--- a/exercises/55_unions.zig
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-// A union lets you store different types and sizes of data at
-// the same memory address. How is this possible? The compiler
-// sets aside enough memory for the largest thing you might want
-// to store.
-//
-// In this example, an instance of Foo always takes up u64 of
-// space memory even if you're currently storing a u8.
-//
-// const Foo = union {
-// small: u8,
-// medium: u32,
-// large: u64,
-// };
-//
-// The syntax looks just like a struct, but a Foo can only hold a
-// small OR a medium OR a large value. Once a field becomes
-// active, the other inactive fields cannot be accessed. To
-// change active fields, assign a whole new instance:
-//
-// var f = Foo{ .small = 5 };
-// f.small += 5; // OKAY
-// f.medium = 5432; // ERROR!
-// f = Foo{ .medium = 5432 }; // OKAY
-//
-// Unions can save space in memory because they let you "re-use"
-// a space in memory. They also provide a sort of primitive
-// polymorphism. Here fooBar() can take a Foo no matter what size
-// of unsigned integer it holds:
-//
-// fn fooBar(f: Foo) void { ... }
-//
-// Oh, but how does fooBar() know which field is active? Zig has
-// a neat way of keeping track, but for now, we'll just have to
-// do it manually.
-//
-// Let's see if we can get this program working!
-//
-const std = @import("std");
-
-// We've just started writing a simple ecosystem simulation.
-// Insects will be represented by either bees or ants. Bees store
-// the number of flowers they've visited that day and ants just
-// store whether or not they're still alive.
-const Insect = union {
- flowers_visited: u16,
- still_alive: bool,
-};
-
-// Since we need to specify the type of insect, we'll use an
-// enum (remember those?).
-const AntOrBee = enum { a, b };
-
-pub fn main() void {
- // We'll just make one bee and one ant to test them out:
- var ant = Insect{ .still_alive = true };
- var bee = Insect{ .flowers_visited = 15 };
-
- std.debug.print("Insect report! ", .{});
-
- // Oops! We've made a mistake here.
- printInsect(ant, AntOrBee.c);
- printInsect(bee, AntOrBee.c);
-
- std.debug.print("\n", .{});
-}
-
-// Eccentric Doctor Zoraptera says that we can only use one
-// function to print our insects. Doctor Z is small and sometimes
-// inscrutable but we do not question her.
-fn printInsect(insect: Insect, what_it_is: AntOrBee) void {
- switch (what_it_is) {
- .a => std.debug.print("Ant alive is: {}. ", .{insect.still_alive}),
- .b => std.debug.print("Bee visited {} flowers. ", .{insect.flowers_visited}),
- }
-}