diff options
Diffstat (limited to 'src/handle-pool.inl')
-rw-r--r-- | src/handle-pool.inl | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/handle-pool.inl b/src/handle-pool.inl new file mode 100644 index 00000000..5fe63c88 --- /dev/null +++ b/src/handle-pool.inl @@ -0,0 +1,47 @@ +#pragma once +#include "handle-pool.hpp" +#include "handle-page.hpp" +#include "compat/move.hpp" +#include <cr/GrowableArray.h> + +namespace floormat::Handle { + +template<typename Obj, uint32_t PageSize> +template<typename... Xs> +requires requires (Xs&&... xs) { + Obj{forward<Xs>(xs)...}; +} +Handle<Obj, PageSize> Pool<Obj, PageSize>::make_object(Xs&&... xs) +{ + auto ret = std::shared_ptr<T>(new Obj{forward<Xs>(xs)...}); + do_make_object(std::static_pointer_cast<object>(ret)); + return ret; +} + +template<typename Obj, uint32_t PageSize> +Pointer<Pool<Obj, PageSize>> +Pool<Obj, PageSize>::make_pool() +{ + auto pool = Pointer<Pool<Obj, PageSize>>{InPlace}; + arrayReserve(pool->pages, 16); + return pool; +} + +template<typename Obj, uint32_t PageSize> +Page<Obj, PageSize>& +Pool<Obj, PageSize>::find_page() +{ + auto& P = *pool; + auto sz = P.pages.size(); + for (auto i = 0uz; i < sz; i++) + { + auto& p = *P.pages.data()[i]; + if (!p.is_full()) + return p; + } + arrayAppend(P.pages, InPlace, InPlace, P.next_page_offset); + P.next_page_offset += PageSize; + return P.pages.back(); +} + +} // namespace floormat::Handle |