thread
Brett 2024-08-13 13:40:34 -04:00
parent 6e45ea3d6d
commit 804378f2a6
4 changed files with 27 additions and 39 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
project(blt-gp VERSION 0.0.140) project(blt-gp VERSION 0.0.141)
include(CTest) include(CTest)

View File

@ -60,31 +60,6 @@ namespace blt::gp
{ {
using iter_type = std::vector<op_container_t>::const_iterator; using iter_type = std::vector<op_container_t>::const_iterator;
public: 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<op_container_t>& get_operations() [[nodiscard]] inline std::vector<op_container_t>& get_operations()
{ {
return operations; return operations;
@ -142,7 +117,8 @@ namespace blt::gp
bool check(gp_program& program, void* context) const; 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) // valid for [begin, end)
static blt::size_t total_value_bytes(iter_type begin, iter_type 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); void drop(gp_program& program);
~tree_t()
{
if (reference_counter == nullptr)
return;
reference_counter->operator--();
if (*reference_counter == 0)
delete reference_counter;
}
private: private:
std::vector<op_container_t> operations; std::vector<op_container_t> operations;
blt::gp::stack_allocator values; blt::gp::stack_allocator values;

@ -1 +1 @@
Subproject commit 644f42684320edc95f9fd5fc3b203bda3c4e6633 Subproject commit 6f06647a21f7f29e99ef8e45e1d3c08db0b46038

View File

@ -207,7 +207,7 @@ namespace blt::gp
return depth; 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; blt::i64 children_left = 0;
@ -225,6 +225,28 @@ namespace blt::gp
return index; 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 bool tree_t::check(gp_program& program, void* context) const
{ {
static thread_local detail::bitmask_t bitfield; static thread_local detail::bitmask_t bitfield;