From feea5d3aa53398425919dab8902101df93672469 Mon Sep 17 00:00:00 2001 From: Harry Rose Date: Fri, 22 May 2026 19:13:08 +0100 Subject: [PATCH] avl_array balance_ expects to be a signed value to function correctly, 'char' making this explicit fixes memory corruption issues on some embedded arm devices like the Playdate --- inkcpp/avl_array.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/inkcpp/avl_array.h b/inkcpp/avl_array.h index b015e517..7e0581ef 100644 --- a/inkcpp/avl_array.h +++ b/inkcpp/avl_array.h @@ -67,13 +67,15 @@ class avl_array // 'node' structure ink::runtime::internal::if_t key_; ink::runtime::internal::if_t val_; - ink::runtime::internal::if_t balance_; ink::runtime::internal::if_t child_; size_type size_; // actual size size_type _capacity; size_type root_; // root node ink::runtime::internal::if_t parent_; + using balance_type = signed char; + ink::runtime::internal::if_t balance_; + // invalid index (like 'nullptr' in a pointer implementation) static const size_type INVALID_IDX = ~static_cast(0); @@ -197,7 +199,7 @@ class avl_array if constexpr (dynamic) { key_ = new Key[Size]; val_ = new T[Size]; - balance_ = new char[Size]; + balance_ = new balance_type[Size]; child_ = new child_type[Size]; if constexpr (Fast) { parent_ = new size_type[Size]; @@ -285,7 +287,7 @@ class avl_array val_ = new_data; } { - char* new_data = new char[new_size]; + balance_type* new_data = new balance_type[new_size]; for (size_type i = 0; i < _capacity; ++i) { new_data[i] = balance_[i]; } @@ -660,7 +662,7 @@ class avl_array set_parent(target, get_parent(source)); } - void insert_balance(size_type node, char balance) + void insert_balance(size_type node, balance_type balance) { while (node != INVALID_IDX) { balance = (balance_[node] += balance); @@ -691,7 +693,7 @@ class avl_array } } - void delete_balance(size_type node, char balance) + void delete_balance(size_type node, balance_type balance) { while (node != INVALID_IDX) { balance = (balance_[node] += balance);