From c455e7b67d2e55e6ed03e3449203d4e307f5a7dd Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 13 Sep 2024 20:18:08 -0400 Subject: Rename builtins/ -> stdlib/ --- stdlib/datatypes.h | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 stdlib/datatypes.h (limited to 'stdlib/datatypes.h') diff --git a/stdlib/datatypes.h b/stdlib/datatypes.h new file mode 100644 index 00000000..8c13d3c4 --- /dev/null +++ b/stdlib/datatypes.h @@ -0,0 +1,91 @@ +#pragma once + +// Common datastructures (arrays, tables, closures) + +#include +#include +#include +#include + +#define ARRAY_LENGTH_BITS 42 +#define ARRAY_FREE_BITS 6 +#define ARRAY_REFCOUNT_BITS 3 +#define ARRAY_STRIDE_BITS 12 + +#define MAX_FOR_N_BITS(N) ((1<<(N))-1) +#define ARRAY_MAX_STRIDE MAX_FOR_N_BITS(ARRAY_STRIDE_BITS-1) +#define ARRAY_MIN_STRIDE (~MAX_FOR_N_BITS(ARRAY_STRIDE_BITS-1)) +#define ARRAY_MAX_DATA_REFCOUNT MAX_FOR_N_BITS(ARRAY_REFCOUNT_BITS) +#define ARRAY_MAX_FREE_ENTRIES MAX_FOR_N_BITS(ARRAY_FREE_BITS) + +typedef union { + int64_t small; + mpz_t *big; +} Int_t; + +typedef struct { + void *data; + // All of the following fields add up to 64 bits, which means that array + // structs can be passed in two 64-bit registers. C will handle doing the + // bit arithmetic to extract the necessary values, which is cheaper than + // spilling onto the stack and needing to retrieve data from the stack. + int64_t length:ARRAY_LENGTH_BITS; + uint8_t free:ARRAY_FREE_BITS; + bool atomic:1; + uint8_t data_refcount:ARRAY_REFCOUNT_BITS; + int16_t stride:ARRAY_STRIDE_BITS; +} Array_t; + +typedef struct { + uint32_t occupied:1, index:31; + uint32_t next_bucket; +} bucket_t; + +#define TABLE_MAX_BUCKETS 0x7fffffff +#define TABLE_MAX_DATA_REFCOUNT 3 + +typedef struct { + uint32_t count:31, last_free:31; + uint8_t data_refcount:2; + bucket_t buckets[]; +} bucket_info_t; + +typedef struct table_s { + Array_t entries; + bucket_info_t *bucket_info; + struct table_s *fallback; +} Table_t; + +typedef struct { + void *fn, *userdata; +} Closure_t; + +typedef struct Range_s { + Int_t first, last, step; +} Range_t; + +typedef struct { + Array_t items; + pthread_mutex_t mutex; + pthread_cond_t cond; + int64_t max_size; +} Channel_t; + +enum text_type { TEXT_SHORT_ASCII, TEXT_ASCII, TEXT_SHORT_GRAPHEMES, TEXT_GRAPHEMES, TEXT_SUBTEXT }; + +typedef struct Text_s { + int64_t length; // Number of grapheme clusters + uint64_t hash:61; + uint8_t tag:3; + union { + char short_ascii[8]; + const char *ascii; + int32_t short_graphemes[2]; + const int32_t *graphemes; + struct Text_s *subtexts; + }; +} Text_t; + +#define Pattern_t Text_t + +// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0 -- cgit v1.2.3