|
|
- #pragma once
- #include "gp_config.hpp"
- #include "gp/exception.hpp"
- #include <type_traits>
-
- namespace gp{
- template<class T, typename I = std::enable_if_t<gp_config::memory_module::is_ok,int>>
- class default_memory_allocator
- {
- public:
- using pointer_type = T*;
- using reference_type = T&;
- using const_pointer_type = const T*;
- using const_reference_type = const T&;
-
- pointer_type allocate(size_t sz)
- {
- return reinterpret_cast <pointer_type> (gp_config::memory_module::memory_allocator<gp_config::memory_module::memory_mode>(sizeof(T) * sz));
- }
-
- void deallocate(pointer_type ptr)
- {
- gp_config::memory_module::memory_deallocator<gp_config::memory_module::memory_mode>(ptr);
- }
-
- template<typename ...params>
- pointer_type construct(pointer_type ptr, params... args)
- {
- new(ptr) T(args...);
- return ptr;
- }
-
- void destroy(pointer_type v)
- {
- v->~T();
- }
- };
- }
-
- void* operator new(size_t sz)
- {
- auto ptr = gp_config::memory_module::memory_allocator<gp_config::memory_module::memory_mode>(sz);
- if constexpr (gp_config::has_exceptions)
- {
- if(!ptr)
- {
- throw gp::bad_alloc{};
- }
- }
- return ptr;
- }
-
- void operator delete (void* ptr) noexcept
- {
- gp_config::memory_module::memory_deallocator<gp_config::memory_module::memory_mode>(ptr);
- }
|