Add symbol comparison and test for it

This commit is contained in:
Konstantin Nazarov 2024-08-04 01:03:01 +01:00
parent 7bcd6afeb2
commit ae6f86e4f7
Signed by: knazarov
GPG key ID: 4CFE0A42FA409C22
3 changed files with 51 additions and 1 deletions

View file

@ -48,6 +48,7 @@ enable_testing()
set(CPP_TESTS set(CPP_TESTS
dict dict
array array
symbol
) )

View file

@ -480,8 +480,26 @@ class Symbol : public Object {
virtual Result<short> cmp(Arena& arena, Object& rhs) final { virtual Result<short> cmp(Arena& arena, Object& rhs) final {
return -TRY(rhs.cmp(arena, *this)); return -TRY(rhs.cmp(arena, *this));
} }
virtual Result<short> cmp(Arena&, Symbol& rhs) final { return 0; } virtual Result<short> cmp(Arena&, Symbol& rhs) final {
auto lsize = size();
auto rsize = rhs.size();
uint64_t i = 0;
uint64_t j = 0;
while (1) {
if (i == lsize && j == lsize) return 0;
short cmp = short(i == lsize) - short(j == rsize);
if (cmp != 0) return cmp;
char32_t lc = _value->data[i];
char32_t rc = rhs._value->data[j];
cmp = (lc > rc) - (lc < rc);
if (cmp != 0) return cmp;
i++;
j++;
}
return 0;
}
virtual void move(Object* obj) final { new (obj) Symbol(std::move(_value)); } virtual void move(Object* obj) final { new (obj) Symbol(std::move(_value)); }
static Result<Symbol> create(Arena& arena, PodSymbol* obj) { static Result<Symbol> create(Arena& arena, PodSymbol* obj) {
@ -497,6 +515,17 @@ class Symbol : public Object {
return Symbol(TRY(MkGcRoot(pod, arena))); return Symbol(TRY(MkGcRoot(pod, arena)));
} }
static Result<Symbol> create(Arena& arena, const char* str) {
uint64_t size = strlen(str);
auto pod = TRY(arena.alloc<PodSymbol>(size * sizeof(char32_t)));
pod->header.tag = Tag::Symbol;
for (uint64_t i = 0; i < size; i++) pod->data[i] = str[i];
pod->size = size;
return Symbol(TRY(MkGcRoot(pod, arena)));
}
static Result<Symbol> create(Arena& arena, String& rhs); static Result<Symbol> create(Arena& arena, String& rhs);
virtual Result<Value> copy(Arena& arena) const final; virtual Result<Value> copy(Arena& arena) const final;

20
test/symbol.cpp Normal file
View file

@ -0,0 +1,20 @@
#include "common.hpp"
#include "die.hpp"
#include "reader.hpp"
#include "test.hpp"
#include "writer.hpp"
StaticArena<64 * 1024 * 1024> arena;
TEST_CASE(array_append) {
auto a = DIEX(Symbol::create(arena, "foo"));
auto b = DIEX(Symbol::create(arena, "foo"));
ASSERT_EQUALS(a, b);
auto s = DIEX(write_one(arena, a));
DIEX(arena.gc());
ASSERT_EQUALS(s, "foo");
}