diff --git a/CMakeLists.txt b/CMakeLists.txt index 46822a9..1aa6f62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.25) -project(blt-gp VERSION 0.0.140) +project(blt-gp VERSION 0.0.141) include(CTest) diff --git a/include/blt/gp/tree.h b/include/blt/gp/tree.h index 841aed1..d1293ff 100644 --- a/include/blt/gp/tree.h +++ b/include/blt/gp/tree.h @@ -60,31 +60,6 @@ namespace blt::gp { using iter_type = std::vector::const_iterator; public: - tree_t(): reference_counter(new std::atomic_int64_t(1)) - {} - - tree_t(const tree_t& copy): operations(copy.operations), values(copy.values), reference_counter(copy.reference_counter) - { - reference_counter->operator++(); - } - - tree_t(tree_t&& move) noexcept: - operations(std::move(move.operations)), values(std::move(move.values)), reference_counter(move.reference_counter) - { - move.reference_counter = nullptr; - } - - tree_t& operator=(const tree_t& copy) = delete; - - tree_t& operator=(tree_t&& move) noexcept - { - operations = std::exchange(operations, std::move(move.operations)); - values = std::exchange(values, std::move(move.values)); - reference_counter = std::exchange(reference_counter, move.reference_counter); - return *this; - } - - [[nodiscard]] inline std::vector& get_operations() { return operations; @@ -142,7 +117,8 @@ namespace blt::gp bool check(gp_program& program, void* context) const; - blt::ptrdiff_t find_endpoint(blt::gp::gp_program& program, blt::ptrdiff_t start); + blt::ptrdiff_t find_endpoint(blt::gp::gp_program& program, blt::ptrdiff_t start) const; + blt::ptrdiff_t find_parent(blt::gp::gp_program& program, blt::ptrdiff_t start) const; // valid for [begin, end) static blt::size_t total_value_bytes(iter_type begin, iter_type end) @@ -173,16 +149,6 @@ namespace blt::gp } void drop(gp_program& program); - - ~tree_t() - { - if (reference_counter == nullptr) - return; - reference_counter->operator--(); - if (*reference_counter == 0) - delete reference_counter; - } - private: std::vector operations; blt::gp::stack_allocator values; diff --git a/lib/blt b/lib/blt index 644f426..6f06647 160000 --- a/lib/blt +++ b/lib/blt @@ -1 +1 @@ -Subproject commit 644f42684320edc95f9fd5fc3b203bda3c4e6633 +Subproject commit 6f06647a21f7f29e99ef8e45e1d3c08db0b46038 diff --git a/src/tree.cpp b/src/tree.cpp index 5514847..4bbd49c 100644 --- a/src/tree.cpp +++ b/src/tree.cpp @@ -207,7 +207,7 @@ namespace blt::gp return depth; } - blt::ptrdiff_t tree_t::find_endpoint(gp_program& program, blt::ptrdiff_t index) + blt::ptrdiff_t tree_t::find_endpoint(gp_program& program, blt::ptrdiff_t index) const { blt::i64 children_left = 0; @@ -225,6 +225,28 @@ namespace blt::gp return index; } + blt::ptrdiff_t tree_t::find_parent(gp_program& program, blt::ptrdiff_t index) const + { + if (index == 0) + return 0; + blt::i64 children_left = 1; + // move to the left + --index; + do + { + const auto& type = program.get_operator_info(operations[index].id); + BLT_TRACE_STREAM << "Operating on index " << index << " with children left: " << children_left << " and argc = " << type.argc.argc << "\n"; + --index; + if (type.argc.argc > 0) + children_left -= type.argc.argc; + if (children_left <= 0) + break; + children_left++; + } while (children_left > 0); + + return index; + } + bool tree_t::check(gp_program& program, void* context) const { static thread_local detail::bitmask_t bitfield;