fx: pointer: implement hash() and compare()

This commit is contained in:
2026-05-29 19:59:00 +01:00
parent e78241c051
commit bbb26c5ee5
+34
View File
@@ -1,17 +1,51 @@
#include <fx/comparable.h>
#include <fx/pointer.h>
#include <fx/value-type.h>
#include <fx/value.h>
static fx_status hash(const fx_value *v, uint64_t *out_hash)
{
*out_hash = (uint64_t)v->v_pointer;
return FX_SUCCESS;
}
static i32 compare(const fx_value *left, const fx_value *right)
{
void *left_v = left->v_pointer;
void *right_v = 0;
if (!FX_OK(fx_value_get_pointer(right, &right_v))) {
return -1;
}
uintptr_t left_p = (uintptr_t)left_v;
uintptr_t right_p = (uintptr_t)right_v;
if (left_p < right_p) {
return -1;
} else if (left_p > right_p) {
return 1;
} else {
return 0;
}
}
/*** CLASS DEFINITION *********************************************************/
FX_TYPE_CLASS_BEGIN(fx_pointer)
FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT)
FX_INTERFACE_ENTRY(to_string) = NULL;
FX_INTERFACE_ENTRY(hash) = hash;
FX_TYPE_VTABLE_INTERFACE_END(fx_object, FX_TYPE_OBJECT)
FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_comparable, FX_TYPE_COMPARABLE)
FX_INTERFACE_ENTRY(c_compare) = compare;
FX_TYPE_VTABLE_INTERFACE_END(fx_comparable, FX_TYPE_COMPARABLE)
FX_TYPE_CLASS_END(fx_pointer)
FX_TYPE_DEFINITION_BEGIN(fx_pointer)
__FX_VALUE_TYPE_ID(POINTER);
FX_TYPE_EXTENDS(FX_TYPE_VALUE_TYPE);
FX_TYPE_IMPLEMENTS(FX_TYPE_COMPARABLE);
FX_TYPE_NAME("fx.pointer");
FX_TYPE_CLASS(fx_pointer_class);
FX_TYPE_INSTANCE_PRIVATE(void *);