From 7e8b5c0b64165144b2c960f340ed283ed71f8d9f Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 17 Jul 2016 21:55:29 -0400 Subject: [PATCH] Allow PagedBuffer to hold non-power-of-2-sized objects --- src/core/PagedBuffer.h | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/core/PagedBuffer.h b/src/core/PagedBuffer.h index 0ba04b0..da2d1eb 100644 --- a/src/core/PagedBuffer.h +++ b/src/core/PagedBuffer.h @@ -4,6 +4,7 @@ #include "System.h" #include #include +#include template class PagedBuffer @@ -11,14 +12,10 @@ class PagedBuffer public: /** * Create a PagedBuffer. - * - * Note: sizeof(T) must be a power of 2. A single page can hold - * System::page_size / sizeof(T) entries. */ PagedBuffer() { - static_assert((sizeof(T) & (sizeof(T) - 1)) == 0, - "sizeof(T) must be a power of 2"); + m_n_per_page = System::page_size / sizeof(T); m_size = 0u; } @@ -32,7 +29,7 @@ public: const T & operator[](unsigned int index) const { - while (index >= (m_pages.size() * n_per_page())) + while (index >= (m_pages.size() * m_n_per_page)) { grow(); } @@ -41,7 +38,7 @@ public: T & operator[](unsigned int index) { - while (index >= (m_pages.size() * n_per_page())) + while (index >= (m_pages.size() * m_n_per_page)) { grow(); } @@ -51,29 +48,25 @@ public: size_t size() { return m_size; } protected: - unsigned int n_per_page() - { - return System::page_size / sizeof(T); - } - unsigned int page_index(unsigned int index) { - return index / n_per_page(); + return index / m_n_per_page; } unsigned int index_in_page(unsigned int index) { - return index % n_per_page(); + return index % m_n_per_page; } void grow() { m_pages.push_back((T *)System::alloc_pages(1)); - m_size += n_per_page(); + m_size += m_n_per_page; } std::vector m_pages; unsigned long m_size; + unsigned int m_n_per_page; }; #endif