pocketpy/src/objects/bintree.c
blueloveTH 4fd47072fc fix py_name2ref
Update vm.c

backup
2025-06-13 17:29:42 +08:00

72 lines
2.0 KiB
C

#include "pocketpy/objects/bintree.h"
#include "pocketpy/common/vector.h"
#include "pocketpy/objects/object.h"
void BinTree__ctor(BinTree* self, void* key, py_Ref value, const BinTreeConfig* config) {
self->key = key;
self->value = *value;
self->config = config;
self->left = NULL;
self->right = NULL;
}
void BinTree__dtor(BinTree* self) {
if(self->config->need_free_key) PK_FREE(self->key);
if(self->left) {
BinTree__dtor(self->left);
PK_FREE(self->left);
}
if(self->right) {
BinTree__dtor(self->right);
PK_FREE(self->right);
}
}
void BinTree__set(BinTree* self, void* key, py_Ref value) {
int cmp = self->config->f_cmp(key, self->key);
if(cmp < 0) {
if(self->left) {
BinTree__set(self->left, key, value);
} else {
self->left = PK_MALLOC(sizeof(BinTree));
BinTree__ctor(self->left, key, value, self->config);
}
} else if(cmp > 0) {
if(self->right) {
BinTree__set(self->right, key, value);
} else {
self->right = PK_MALLOC(sizeof(BinTree));
BinTree__ctor(self->right, key, value, self->config);
}
} else {
self->value = *value;
}
}
py_Ref BinTree__try_get(BinTree* self, void* key) {
int cmp = self->config->f_cmp(key, self->key);
if(cmp < 0) {
if(self->left) {
return BinTree__try_get(self->left, key);
} else {
return NULL;
}
} else if(cmp > 0) {
if(self->right) {
return BinTree__try_get(self->right, key);
} else {
return NULL;
}
} else {
return &self->value;
}
}
bool BinTree__contains(BinTree* self, void* key) { return BinTree__try_get(self, key) != NULL; }
void BinTree__apply_mark(BinTree* self, c11_vector* p_stack) {
pk__mark_value(&self->value);
if(self->left) BinTree__apply_mark(self->left, p_stack);
if(self->right) BinTree__apply_mark(self->right, p_stack);
}