mirror of
https://github.com/momo5502/emulator.git
synced 2026-01-11 16:46:16 +00:00
Use vector instead of large array
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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_{};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user