Add simple array test

This commit is contained in:
Konstantin Nazarov 2024-08-04 00:33:17 +01:00
parent 91280bc5aa
commit 7bcd6afeb2
Signed by: knazarov
GPG key ID: 4CFE0A42FA409C22
4 changed files with 40 additions and 2 deletions

View file

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

View file

@ -184,9 +184,12 @@ Result<Value> Array::get(Arena& arena, Value& key) {
Result<Array> Array::append(Arena& arena, Value& rhs) { Result<Array> Array::append(Arena& arena, Value& rhs) {
uint64_t res_size = size() + 1; uint64_t res_size = size() + 1;
auto pod = TRY(arena.alloc<PodArray>(res_size * sizeof(PodObject*))); auto pod = TRY(arena.alloc<PodArray>(res_size * sizeof(OffPtr<PodObject>)));
pod->header.tag = Tag::Array;
pod->size = res_size; pod->size = res_size;
memcpy(pod->data, _value->data, sizeof(PodObject*) * size()); for (uint64_t i = 0; i < size(); i++) {
pod->data[i] = OffPtr<PodObject>(pod, _value->data[i].get(_value.get()));
}
pod->data[size()] = OffPtr<PodObject>(pod, rhs.pod()); pod->data[size()] = OffPtr<PodObject>(pod, rhs.pod());
return Array(TRY(MkGcRoot(pod, arena))); return Array(TRY(MkGcRoot(pod, arena)));

View file

@ -140,6 +140,8 @@ class Array : public Object {
virtual Result<Value> get(Arena& arena, Value& key) final; virtual Result<Value> get(Arena& arena, Value& key) final;
Result<Array> append(Arena& arena, Value& rhs); Result<Array> append(Arena& arena, Value& rhs);
template <class V>
Result<Array> append(Arena& arena, const V& value);
Result<Array> concat(Arena& arena, Array& rhs) { Result<Array> concat(Arena& arena, Array& rhs) {
uint64_t rhs_size = rhs.size(); uint64_t rhs_size = rhs.size();
@ -766,3 +768,9 @@ Result<Dict> Dict::insert(Arena& arena, const K& key, const V& value) {
return insert(arena, k, v); return insert(arena, k, v);
} }
template <class V>
Result<Array> Array::append(Arena& arena, const V& value) {
Value v = TRY(Value::create(arena, value));
return append(arena, v);
}

26
test/array.cpp Normal file
View file

@ -0,0 +1,26 @@
#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(Array::create(arena));
a = DIEX(a.append(arena, 1));
a = DIEX(a.append(arena, 2));
a = DIEX(a.append(arena, 3));
DIEX(arena.gc());
auto s = DIEX(write_one(arena, a));
DIEX(arena.gc());
ASSERT_EQUALS(s, "[1 2 3]");
auto v = DIEX(a.get(arena, 1));
ASSERT_EQUALS(v, 2);
}