#pragma once #include #include inline void* operator new(size_t, void* ptr) { return ptr; } namespace types { template class allocator_traits; template class kernel_allocator { public: using value_type = T; static value_type* allocate_memory(size_t count) { return static_cast(::k_malloc(sizeof(value_type) * count)); } static void deallocate_memory(value_type* ptr) { ::k_free(ptr); } }; template T* kernel_allocator_new(Args... args) { return allocator_traits>::allocate_and_construct(args...); } template class allocator_traits { public: using value_type = typename Allocator::value_type; static value_type* allocate(size_t count) { if (count == 0) return nullptr; return Allocator::allocate_memory(sizeof(value_type) * count); } template static value_type* construct(value_type* ptr, Args... args) { new (ptr) value_type(args...); return ptr; } template static value_type* allocate_and_construct(Args... args) { auto* ptr = allocate(1); construct(ptr, args...); return ptr; } static void deconstruct(value_type* ptr) { if (!ptr) return; ptr->~value_type(); } static void deallocate(value_type* ptr) { if (!ptr) return; Allocator::deallocate_memory(ptr); } static void deconstruct_and_deallocate(value_type* ptr) { if (!ptr) return; deconstruct(ptr); deallocate(ptr); } }; } // namespace types