Use vector instead of large array

This commit is contained in:
Igor Pissolati
2026-01-04 22:45:41 -03:00
parent 7112d619b4
commit d51f890197
2 changed files with 53 additions and 3 deletions

View File

@@ -160,6 +160,36 @@ namespace utils
this->write_span(std::span(vec));
}
void write_vector(const std::vector<bool>& vec)
{
this->write(static_cast<uint64_t>(vec.size()));
uint8_t byte = 0;
uint8_t bit_index = 0;
for (const bool b : vec)
{
if (b)
{
byte |= (1u << bit_index);
}
++bit_index;
if (bit_index == 8)
{
this->write<uint8_t>(byte);
byte = 0;
bit_index = 0;
}
}
if (bit_index != 0)
{
this->write<uint8_t>(byte);
}
}
template <typename T>
void write_list(const std::list<T>& vec)
{
@@ -385,6 +415,25 @@ namespace utils
}
}
void read_vector(std::vector<bool>& result)
{
const auto bit_count = this->read<uint64_t>();
result.clear();
result.reserve(static_cast<size_t>(bit_count));
const auto size = (bit_count + 7) / 8;
for (uint64_t i = 0; i < size; ++i)
{
const auto byte = this->read<uint8_t>();
for (uint8_t bit = 0; bit < 8 && result.size() < bit_count; ++bit)
{
result.push_back((byte >> bit) & 1u);
}
}
}
template <typename T>
std::vector<T> read_vector()
{

View File

@@ -10,6 +10,7 @@ class user_handle_table
void setup(memory_manager& memory)
{
memory_ = &memory;
used_indices_.resize(MAX_HANDLES, false);
const auto server_info_size = static_cast<size_t>(page_align_up(sizeof(USER_SERVERINFO)));
server_info_addr_ = memory.allocate_memory(server_info_size, memory_permission::read);
@@ -87,7 +88,7 @@ class user_handle_table
buffer.write(server_info_addr_);
buffer.write(handle_table_addr_);
buffer.write(display_info_addr_);
buffer.write(used_indices_);
buffer.write_vector(used_indices_);
}
void deserialize(utils::buffer_deserializer& buffer)
@@ -95,7 +96,7 @@ class user_handle_table
buffer.read(server_info_addr_);
buffer.read(handle_table_addr_);
buffer.read(display_info_addr_);
buffer.read(used_indices_);
buffer.read_vector(used_indices_);
}
private:
@@ -127,7 +128,7 @@ class user_handle_table
uint64_t server_info_addr_{};
uint64_t handle_table_addr_{};
uint64_t display_info_addr_{};
std::array<bool, MAX_HANDLES> used_indices_{};
std::vector<bool> used_indices_{};
memory_manager* memory_{};
};