/** * \file libpmr/new.h * \author mutouyun (orz@orzz.org) * \brief Global object creation function. * \date 2024-01-01 */ #pragma once #include #include "libimp/aligned.h" #include "libimp/uninitialized.h" #include "libpmr/def.h" #include "libpmr/block_pool.h" #include "libpmr/memory_resource.h" LIBPMR_NAMESPACE_BEG_ constexpr inline std::size_t regular_level(std::size_t s) noexcept { if (s <= 128 ) return 0; if (s <= 1024 ) return 1; if (s <= 8192 ) return 2; if (s <= 65536) return 3; return 4; } constexpr inline std::size_t regular_sizeof(std::size_t s) noexcept { switch (regular_level(s)) { case 0 : return ::LIBIMP::round_up(s, 8); case 1 : return ::LIBIMP::round_up(s, 128); case 2 : return ::LIBIMP::round_up(s, 1024); case 3 : return ::LIBIMP::round_up(s, 8192); default: return 0; } } template constexpr inline std::size_t regular_sizeof() noexcept { return regular_sizeof(sizeof(T)); } template class block_pool_resource : public block_pool { public: static block_pool_resource *get() noexcept { thread_local block_pool_resource instance; return &instance; } void *allocate(std::size_t /*bytes*/, std::size_t /*alignment*/ = alignof(std::max_align_t)) noexcept { return block_pool::allocate(); } void deallocate(void *p, std::size_t /*bytes*/, std::size_t /*alignment*/ = alignof(std::max_align_t)) noexcept { block_pool::deallocate(p); } }; template class regular_resource : public new_delete_resource {}; template class regular_resource : public block_pool_resource {}; template class regular_resource : public block_pool_resource {}; template class regular_resource : public block_pool_resource {}; template class regular_resource : public block_pool_resource {}; template T *new_(A &&... args) noexcept { auto *mem_res = regular_resource()>::get(); return ::LIBIMP::construct(mem_res->allocate(sizeof(T), alignof(T)), std::forward(args)...); } template void delete_(T *p) noexcept { if (p == nullptr) return; auto *mem_res = regular_resource()>::get(); mem_res->deallocate(::LIBIMP::destroy(p), sizeof(T), alignof(T)); } LIBPMR_NAMESPACE_END_