diff --git a/rpp/alloc1.h b/rpp/alloc1.h index b43382a..5f84321 100644 --- a/rpp/alloc1.h +++ b/rpp/alloc1.h @@ -9,44 +9,59 @@ namespace rpp { namespace detail { -static consteval Literal pool_name(const Literal& name) { - Literal ret; - ret.c_string[0] = 'P'; - ret.c_string[1] = 'o'; - ret.c_string[2] = 'o'; - ret.c_string[3] = 'l'; - ret.c_string[4] = '<'; - u64 i = 0; - for(; i < Literal::max_len - 6 && name.c_string[i]; i++) { - ret.c_string[i + 5] = name.c_string[i]; +static consteval Literal pool_name(u64 N) { + Literal ret{"Pool<"}; + u64 n = 0; + for(u64 i = N; i > 0; i /= 10) { + n++; } - ret.c_string[i + 5] = '>'; + u64 i = 5; + for(; n > 0 && i < Literal::max_len - 1; n--, i++) { + ret.c_string[i] = '0' + (N / Math::pow(10, n - 1)) % 10; + } + ret.c_string[i] = '>'; return ret; } -template +template struct Pool { - static constexpr Literal name = pool_name(Reflect::Refl::name); + static constexpr Literal name = pool_name(N); - template - requires Constructable + template + requires(sizeof(T) == N) && Constructable static T* make(Args&&... args) { finalizer.keep_alive(); - Thread::Lock lock(mutex); - return list.make(forward(args)...); + Block* block = null; + { + Thread::Lock lock(mutex); + block = list.make(); + } + new(block->data) T{forward(args)...}; + return reinterpret_cast(block); } + template + requires(sizeof(T) == N) static void destroy(T* value) { finalizer.keep_alive(); - Thread::Lock lock(mutex); - list.destroy(value); + if constexpr(Must_Destruct) { + value->~T(); + } + { + Thread::Lock lock(mutex); + list.destroy(reinterpret_cast(value)); + } } private: using Backing = Mallocator; + struct Block { + alignas(N) u8 data[N]; + }; + struct Finalizer { - Finalizer(Free_List& l) { + Finalizer(Free_List& l) { Profile::finalizer([&l]() { l.clear(); }); } RPP_FORCE_INLINE void keep_alive() { @@ -54,7 +69,7 @@ struct Pool { }; static inline Thread::Mutex mutex; - static inline Free_List list; + static inline Free_List list; static inline Finalizer finalizer{list}; }; @@ -64,12 +79,12 @@ struct Mpool { template requires Constructable static T* make(Args&&... args) { - return detail::Pool::make(forward(args)...); + return detail::Pool::template make(forward(args)...); } template static void destroy(T* value) { - detail::Pool::destroy(value); + detail::Pool::template destroy(value); } }; diff --git a/rpp/math.h b/rpp/math.h index 8c370ec..69cfb87 100644 --- a/rpp/math.h +++ b/rpp/math.h @@ -60,6 +60,19 @@ constexpr T degrees(T v) { return v * T{180.0f / PI32}; } +template +constexpr I pow(I base, I exp) { + I result = 1; + while(exp) { + if(exp & 1) { + result *= base; + } + exp >>= 1; + base *= base; + } + return result; +} + f32 cos(f32 v); f64 cos(f64 v); f32 sin(f32 v);