aboutsummaryrefslogtreecommitdiff
path: root/stdlib/enums.c
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/enums.c')
-rw-r--r--stdlib/enums.c120
1 files changed, 0 insertions, 120 deletions
diff --git a/stdlib/enums.c b/stdlib/enums.c
deleted file mode 100644
index b66a1711..00000000
--- a/stdlib/enums.c
+++ /dev/null
@@ -1,120 +0,0 @@
-// Metamethods for enums
-
-#include <stdint.h>
-#include <string.h>
-
-#include "arrays.h"
-#include "bools.h"
-#include "functiontype.h"
-#include "integers.h"
-#include "metamethods.h"
-#include "optionals.h"
-#include "pointers.h"
-#include "siphash.h"
-#include "tables.h"
-#include "text.h"
-#include "util.h"
-
-PUREFUNC public uint64_t Enum$hash(const void *obj, const TypeInfo_t *type)
-{
- int32_t tag = *(int32_t*)obj;
- uint32_t components[2] = {(uint32_t)tag, 0};
-
- const TypeInfo_t *value = type->EnumInfo.tags[tag-1].type;
- if (value && value->size > 0) {
- ptrdiff_t byte_offset = sizeof(int32_t);
- if (value->align && byte_offset % value->align > 0)
- byte_offset += value->align - (byte_offset % value->align);
- components[1] = generic_hash(obj + byte_offset, value);
- }
- return siphash24((void*)components, sizeof(components));
-}
-
-PUREFUNC public int32_t Enum$compare(const void *x, const void *y, const TypeInfo_t *type)
-{
- if (x == y) return 0;
-
- int32_t x_tag = *(int32_t*)x;
- int32_t y_tag = *(int32_t*)y;
- if (x_tag != y_tag)
- return x_tag > y_tag ? 1 : -1;
-
- const TypeInfo_t *value = type->EnumInfo.tags[x_tag-1].type;
- if (value && value->size > 0) {
- ptrdiff_t byte_offset = sizeof(int32_t);
- if (value->align && byte_offset % value->align > 0)
- byte_offset += value->align - (byte_offset % value->align);
- return generic_compare(x + byte_offset, y + byte_offset, value);
- }
- return 0;
-}
-
-PUREFUNC public bool Enum$equal(const void *x, const void *y, const TypeInfo_t *type)
-{
- if (x == y) return true;
-
- int32_t x_tag = *(int32_t*)x;
- int32_t y_tag = *(int32_t*)y;
- if (x_tag != y_tag)
- return false;
-
- const TypeInfo_t *value = type->EnumInfo.tags[x_tag-1].type;
- if (value && value->size > 0) {
- ptrdiff_t byte_offset = sizeof(int32_t);
- if (value->align && byte_offset % value->align > 0)
- byte_offset += value->align - (byte_offset % value->align);
- return generic_equal(x + byte_offset, y + byte_offset, value);
- }
- return true;
-}
-
-public Text_t Enum$as_text(const void *obj, bool colorize, const TypeInfo_t *type)
-{
- if (!obj) return Text$from_str(type->EnumInfo.name);
-
- int32_t tag = *(int32_t*)obj;
- NamedType_t value = type->EnumInfo.tags[tag-1];
- if (!value.type || value.type->size == 0)
- return Text$format(colorize ? "\x1b[1m%s\x1b[m" : "%s", value.name);
-
- ptrdiff_t byte_offset = sizeof(int32_t);
- if (value.type->align && byte_offset % value.type->align > 0)
- byte_offset += value.type->align - (byte_offset % value.type->align);
- return generic_as_text(obj + byte_offset, colorize, value.type);
-}
-
-PUREFUNC public bool Enum$is_none(const void *x, const TypeInfo_t*)
-{
- return *(int32_t*)x == 0;
-}
-
-public void Enum$serialize(const void *obj, FILE *out, Table_t *pointers, const TypeInfo_t *type)
-{
- int32_t tag = *(int32_t*)obj;
- Int32$serialize(&tag, out, pointers, &Int32$info);
-
- NamedType_t value = type->EnumInfo.tags[tag-1];
- if (value.type && value.type->size > 0) {
- ptrdiff_t byte_offset = sizeof(int32_t);
- if (value.type->align && byte_offset % value.type->align > 0)
- byte_offset += value.type->align - (byte_offset % value.type->align);
- _serialize(obj + byte_offset, out, pointers, value.type);
- }
-}
-
-public void Enum$deserialize(FILE *in, void *outval, Array_t *pointers, const TypeInfo_t *type)
-{
- int32_t tag = 0;
- Int32$deserialize(in, &tag, pointers, &Int32$info);
- *(int32_t*)outval = tag;
-
- NamedType_t value = type->EnumInfo.tags[tag-1];
- if (value.type && value.type->size > 0) {
- ptrdiff_t byte_offset = sizeof(int32_t);
- if (value.type->align && byte_offset % value.type->align > 0)
- byte_offset += value.type->align - (byte_offset % value.type->align);
- _deserialize(in, outval + byte_offset, pointers, value.type);
- }
-}
-
-// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0