From d14ccfd1da376ad0f202ab56e672764c8938548d Mon Sep 17 00:00:00 2001 From: Brett Date: Tue, 8 Apr 2025 01:50:23 -0400 Subject: [PATCH] add ability to write trees to file --- .idea/editor.xml | 239 ----------------------------------------- .idea/vcs.xml | 110 ------------------- CMakeLists.txt | 2 +- default.nix | 28 +++-- include/blt/gp/stack.h | 13 +++ include/blt/gp/tree.h | 11 +- lib/blt | 2 +- src/transformers.cpp | 1 - src/tree.cpp | 85 +++++++++++++++ 9 files changed, 127 insertions(+), 364 deletions(-) diff --git a/.idea/editor.xml b/.idea/editor.xml index 04cdbc9..b465c40 100644 --- a/.idea/editor.xml +++ b/.idea/editor.xml @@ -1,245 +1,6 @@ - diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 90587b6..0a294a1 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,116 +2,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CMakeLists.txt b/CMakeLists.txt index 26048fc..c459ccd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ macro(compile_options target_name) sanitizers(${target_name}) endmacro() -project(blt-gp VERSION 0.4.10) +project(blt-gp VERSION 0.5.0) include(CTest) diff --git a/default.nix b/default.nix index dd3cde3..e91d468 100644 --- a/default.nix +++ b/default.nix @@ -12,27 +12,33 @@ pkgs.mkShell ninja renderdoc valgrind - opentelemetry-cpp - opentelemetry-cpp.dev + gtest + opentelemetry-cpp + opentelemetry-cpp.dev ]; nativeBuildInputs = with pkgs; [ pkg-config - abseil-cpp opentelemetry-cpp opentelemetry-cpp.dev ]; propagatedBuildInputs = with pkgs; [ - gtest - gtest.dev - grpc - protobuf - curl abseil-cpp + protobuf + grpc + prometheus-cpp + prometheus-cpp.dev + openssl + openssl.dev opentelemetry-cpp opentelemetry-cpp.dev - opentelemetry-collector - protobufc - protobufc.dev + civetweb + civetweb.dev + c-ares + c-ares.dev + nlohmann_json + glibc + glibc.dev + curl ]; LD_LIBRARY_PATH="/run/opengl-driver/lib:/run/opengl-driver-32/lib"; } diff --git a/include/blt/gp/stack.h b/include/blt/gp/stack.h index a83457c..e815dcb 100644 --- a/include/blt/gp/stack.h +++ b/include/blt/gp/stack.h @@ -307,6 +307,12 @@ namespace blt::gp expand_raw(bytes); } + void resize(const size_t bytes) + { + reserve(bytes); + bytes_stored = bytes; + } + [[nodiscard]] size_t stored() const { return bytes_stored; @@ -322,6 +328,13 @@ namespace blt::gp bytes_stored = 0; } + [[nodiscard]] auto* data() const + { + return data_; + } + + + private: void expand(const size_t bytes) { diff --git a/include/blt/gp/tree.h b/include/blt/gp/tree.h index 18e75be..b92f5b0 100644 --- a/include/blt/gp/tree.h +++ b/include/blt/gp/tree.h @@ -242,7 +242,6 @@ namespace blt::gp bytes = 0; } } - private: tree_t& tree; u8* data; @@ -608,6 +607,16 @@ namespace blt::gp }; } + [[nodiscard]] size_t required_size() const; + + void to_byte_array(std::byte* out) const; + + void to_file(FILE* file) const; + + void from_byte_array(const std::byte* in); + + void from_file(FILE* file); + ~tree_t() { clear(*m_program); diff --git a/lib/blt b/lib/blt index 2d9b96f..322a533 160000 --- a/lib/blt +++ b/lib/blt @@ -1 +1 @@ -Subproject commit 2d9b96f1155427fdcc0491aadce93394503f6d66 +Subproject commit 322a533fd9412167e216188a4713a5aa4a99c2cd diff --git a/src/transformers.cpp b/src/transformers.cpp index 2b9221d..b7bf704 100644 --- a/src/transformers.cpp +++ b/src/transformers.cpp @@ -24,7 +24,6 @@ #include #include - namespace blt::gp { #if BLT_DEBUG_LEVEL >= 2 || defined(BLT_TRACK_ALLOCATIONS) diff --git a/src/tree.cpp b/src/tree.cpp index 7a45418..a5ebcfc 100644 --- a/src/tree.cpp +++ b/src/tree.cpp @@ -668,6 +668,91 @@ namespace blt::gp return {point, m_program->get_operator_info(operations[point].id()).return_type}; } + size_t tree_t::required_size() const + { + // 2 size_t used to store expected_length of operations + size of the values stack + return 2 * sizeof(size_t) + operations.size() * sizeof(size_t) + values.bytes_in_head(); + } + + void tree_t::to_byte_array(std::byte* out) const + { + const auto op_size = operations.size(); + std::memcpy(out, &op_size, sizeof(size_t)); + out += sizeof(size_t); + for (const auto& op : operations) + { + constexpr auto size_of_op = sizeof(operator_id); + auto id = op.id(); + std::memcpy(out, &id, size_of_op); + out += size_of_op; + } + const auto val_size = values.bytes_in_head(); + std::memcpy(out, &val_size, sizeof(size_t)); + out += sizeof(size_t); + std::memcpy(out, values.data(), val_size); + } + + void tree_t::to_file(FILE* file) const + { + const auto op_size = operations.size(); + BLT_ASSERT(std::fwrite(&op_size, sizeof(size_t), 1, file) == sizeof(size_t)); + for (const auto& op : operations) + { + auto id = op.id(); + std::fwrite(&id, sizeof(operator_id), 1, file); + } + const auto val_size = values.bytes_in_head(); + BLT_ASSERT(std::fwrite(&val_size, sizeof(size_t), 1, file) == sizeof(size_t)); + BLT_ASSERT(std::fwrite(values.data(), val_size, 1, file) == val_size); + } + + void tree_t::from_byte_array(const std::byte* in) + { + size_t ops_to_read; + std::memcpy(&ops_to_read, in, sizeof(size_t)); + in += sizeof(size_t); + operations.reserve(ops_to_read); + for (size_t i = 0; i < ops_to_read; i++) + { + operator_id id; + std::memcpy(&id, in, sizeof(operator_id)); + in += sizeof(operator_id); + operations.push_back({ + m_program->get_typesystem().get_type(m_program->get_operator_info(id).return_type).size(), + id, + m_program->is_operator_ephemeral(id), + m_program->get_operator_flags(id) + }); + } + size_t val_size; + std::memcpy(&val_size, in, sizeof(size_t)); + in += sizeof(size_t); + // TODO replace instances of u8 that are used to alias types with the proper std::byte + values.copy_from(reinterpret_cast(in), val_size); + } + + void tree_t::from_file(FILE* file) + { + size_t ops_to_read; + BLT_ASSERT(std::fread(&ops_to_read, sizeof(size_t), 1, file) == sizeof(size_t)); + operations.reserve(ops_to_read); + for (size_t i = 0; i < ops_to_read; i++) + { + operator_id id; + BLT_ASSERT(std::fread(&id, sizeof(operator_id), 1, file) == sizeof(operator_id)); + operations.push_back({ + m_program->get_typesystem().get_type(m_program->get_operator_info(id).return_type).size(), + id, + m_program->is_operator_ephemeral(id), + m_program->get_operator_flags(id) + }); + } + size_t val_size; + BLT_ASSERT(std::fread(&val_size, sizeof(size_t), 1, file) == sizeof(size_t)); + values.resize(val_size); + BLT_ASSERT(std::fread(values.data(), val_size, 1, file) == val_size); + } + void tree_t::modify_operator(const size_t point, operator_id new_id, std::optional return_type) { if (!return_type)