From 549e1b6029efc161e5346ef9af8ed750bd02780d Mon Sep 17 00:00:00 2001 From: Dmitry Atamanov Date: Sat, 4 Mar 2023 21:17:37 +0500 Subject: [PATCH] Added `std::collections::enummap`. --- lib/std/collections/enummap.c3 | 18 +++++++++++++++ test/unit/stdlib/collections/enummap.c3 | 29 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 lib/std/collections/enummap.c3 create mode 100644 test/unit/stdlib/collections/enummap.c3 diff --git a/lib/std/collections/enummap.c3 b/lib/std/collections/enummap.c3 new file mode 100644 index 000000000..59239a1a4 --- /dev/null +++ b/lib/std/collections/enummap.c3 @@ -0,0 +1,18 @@ +module std::collections::enummap; + +struct EnumMap +{ + ValueType[Enum.len] values; +} + +fn void EnumMap.init(EnumMap* this, ValueType init_value) +{ + foreach(&a : this.values) + { + *a = init_value; + } +} + +fn uint EnumMap.len(EnumMap* this) @operator(len) => this.values.len; +fn ValueType EnumMap.get(EnumMap* this, Enum key) @operator([]) => this.values[key.ordinal]; +fn void EnumMap.set(EnumMap* this, Enum key, ValueType value) @operator([]=) => this.values[key.ordinal] = value; diff --git a/test/unit/stdlib/collections/enummap.c3 b/test/unit/stdlib/collections/enummap.c3 new file mode 100644 index 000000000..97f2f0c2d --- /dev/null +++ b/test/unit/stdlib/collections/enummap.c3 @@ -0,0 +1,29 @@ +module enummap_test @test; +import std::collections::enummap; + +enum FooEnum +{ + ONE, + TWO, + THREE, +} + +typedef FooEnumMap = EnumMap; + +fn void! enums() +{ + FooEnumMap nm; + nm.set(ONE, 1); + nm.set(TWO, 2); + nm.set(THREE, 3); + + assert(nm[FooEnum.ONE] == 1); + assert(nm[FooEnum.TWO] == 2); + assert(nm[FooEnum.THREE] == 3); + + nm.init(0); + + assert(nm[FooEnum.ONE] == 0); + assert(nm[FooEnum.TWO] == 0); + assert(nm[FooEnum.THREE] == 0); +}