From b8323f7e0edfbc50248e77d2b399d50dd79edfbd Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Fri, 14 Oct 2022 01:09:28 -0700 Subject: [PATCH] [util] Move util::vector to allocator api Now that the allocator API exists for node_map, have vector use it as well. --- src/libraries/util/util/node_map.h | 2 +- src/libraries/util/util/vector.h | 29 ++++++++++++++--------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/libraries/util/util/node_map.h b/src/libraries/util/util/node_map.h index 1d6bd2a..be06197 100644 --- a/src/libraries/util/util/node_map.h +++ b/src/libraries/util/util/node_map.h @@ -72,7 +72,7 @@ public: virtual ~node_map() { for (size_t i = 0; i < m_capacity; ++i) m_nodes[i].~node_type(); - delete [] reinterpret_cast(m_nodes); + alloc::free(m_nodes); } class iterator diff --git a/src/libraries/util/util/vector.h b/src/libraries/util/util/vector.h index abfa9a3..120f701 100644 --- a/src/libraries/util/util/vector.h +++ b/src/libraries/util/util/vector.h @@ -2,24 +2,24 @@ /// \file vector.h /// Definition of a simple dynamic vector collection for use in kernel space -#include #include #include #include +#include #include namespace util { /// A dynamic array. -template +template class vector { +public: using count_t = S; static constexpr count_t min_capacity = 4; static constexpr count_t cap_mask = static_cast(-1) >> 1; -public: /// Default constructor. Creates an empty vector with no capacity. vector() : m_size(0), @@ -75,7 +75,7 @@ public: bool was_static = m_capacity & ~cap_mask; if (!was_static) - delete [] m_elements; + alloc::free(m_elements); } /// Get the size of the array. @@ -272,20 +272,19 @@ public: /// \arg capacity Number of elements to allocate void set_capacity(count_t capacity) { + while (capacity < m_size) remove(); + bool was_static = m_capacity & ~cap_mask; - T *new_array = reinterpret_cast(new uint8_t [capacity * sizeof(T)]); - count_t size = capacity > m_size ? m_size : capacity; + if (was_static) { + T *new_array = reinterpret_cast(alloc::allocate(capacity * sizeof(T))); + memcpy(new_array, m_elements, m_size * sizeof(T)); + m_elements = new_array; + } else { + m_elements = reinterpret_cast( + alloc::realloc(m_elements, m_capacity * sizeof(T), capacity * sizeof(T))); + } - memcpy(new_array, m_elements, size * sizeof(T)); - - while (size < m_size) remove(); - m_size = size; m_capacity = capacity; - - if (!was_static) - delete [] m_elements; - - m_elements = new_array; } private: