aboutsummaryrefslogtreecommitdiff
path: root/src/value.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/value.c')
-rw-r--r--src/value.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/value.c b/src/value.c
index 690527f..c08048a 100644
--- a/src/value.c
+++ b/src/value.c
@@ -12,19 +12,23 @@ static uint64_t hash_range(const uint8_t *data, size_t size) {
}
uint64_t tsl_value_hash(const TslValue *key) {
- switch(key->type) {
+ switch((TslType)key->type) {
case TSL_TYPE_NULL:
return 0;
case TSL_TYPE_NUMBER:
return *(uint64_t*)&key->data.number;
case TSL_TYPE_STRING:
return hash_range(key->data.string->data, key->data.string->size);
+ case TSL_TYPE_STRING_VIEW:
+ return hash_range((uint8_t*)key->data.string_view.data, key->data.string_view.size);
case TSL_TYPE_BOOL:
return key->data.boolean;
case TSL_TYPE_LIST:
return (uint64_t)key->data.list;
case TSL_TYPE_MAP:
return (uint64_t)key->data.map;
+ case TSL_TYPE_FUNCTION:
+ return key->data.function;
case TSL_TYPE_USERDATA:
return (uint64_t)key->data.userdata;
}
@@ -36,10 +40,23 @@ int tsl_value_equals(const TslValue *lhs, const TslValue *rhs) {
if(lhs->type == TSL_TYPE_STRING) {
return lhs->data.string->size == rhs->data.string->size
&& memcmp(lhs->data.string->data, rhs->data.string->data, lhs->data.string->size) == 0;
+ } else if(lhs->type == TSL_TYPE_STRING_VIEW) {
+ return lhs->data.string_view.size == rhs->data.string_view.size
+ && memcmp(lhs->data.string_view.data, rhs->data.string_view.data, lhs->data.string_view.size) == 0;
} else {
return *(uint64_t*)&lhs->data == *(uint64_t*)&rhs->data;
}
+ } else if(lhs->type == TSL_TYPE_STRING && rhs->type == TSL_TYPE_STRING_VIEW) {
+ return lhs->data.string->size == rhs->data.string_view.size
+ && memcmp(lhs->data.string->data, rhs->data.string_view.data, lhs->data.string->size) == 0;
+ } else if(lhs->type == TSL_TYPE_STRING_VIEW && rhs->type == TSL_TYPE_STRING) {
+ return lhs->data.string_view.size == rhs->data.string->size
+ && memcmp(lhs->data.string_view.data, rhs->data.string->data, lhs->data.string_view.size) == 0;
} else {
return 0;
}
}
+
+void tsl_value_clear(TslValue *self) {
+ memset(self, 0, sizeof(TslValue));
+}