6#ifndef METALL_STL_ALLOCATOR_HPP
7#define METALL_STL_ALLOCATOR_HPP
33template <
typename T,
typename metall_manager_kernel_type>
40 using pointer =
typename std::pointer_traits<
41 typename metall_manager_kernel_type::void_pointer>::
46 typename std::pointer_traits<pointer>::template
rebind<void>;
50 typename std::pointer_traits<pointer>::difference_type;
51 using size_type =
typename std::make_unsigned<difference_type>::type;
56 template <
typename T2>
77 : m_ptr_manager_kernel_address(pointer_manager_kernel_address) {}
80 template <
typename T2>
83 : m_ptr_manager_kernel_address(
84 allocator_instance.get_pointer_to_manager_kernel()) {}
99 template <typename T2>
102 m_ptr_manager_kernel_address = other.m_ptr_manager_kernel_address;
110 template <
typename T2>
113 m_ptr_manager_kernel_address = other.m_ptr_manager_kernel_address;
126 return priv_deallocate(ptr, size);
137 template <
class... Args>
139 priv_construct(ptr, std::forward<Args>(args)...);
150 return to_raw_pointer(m_ptr_manager_kernel_address);
163 if (priv_max_size() < n) {
164 throw std::bad_array_new_length();
169 "nullptr: cannot access to manager kernel");
170 throw std::bad_alloc();
173 if (!manager_kernel) {
175 "nullptr: cannot access to manager kernel");
176 throw std::bad_alloc();
180 static_cast<value_type *
>(manager_kernel->allocate(n *
sizeof(T))));
182 throw std::bad_alloc();
188 void priv_deallocate(
pointer ptr,
189 [[maybe_unused]]
const size_type size)
const noexcept {
190 if (ptr ==
nullptr) {
196 "nullptr: cannot access to manager kernel");
200 if (!manager_kernel) {
202 "nullptr: cannot access to manager kernel");
205 manager_kernel->deallocate(to_raw_pointer(ptr));
208 size_type priv_max_size() const noexcept {
209 return std::numeric_limits<size_type>::max() /
sizeof(
value_type);
212 template <
class... arg_types>
213 void priv_construct(
const pointer &ptr, arg_types &&...args)
const {
214 ::new ((
void *)to_raw_pointer(ptr))
218 void priv_destroy(
const pointer &ptr)
const {
221 "pointer is nullptr");
223 (*ptr).~value_type();
232 typename std::pointer_traits<typename manager_kernel_type::void_pointer>::
233 template rebind<manager_kernel_type *const>
234 m_ptr_manager_kernel_address;
237template <
typename T,
typename kernel>
245template <
typename T,
typename kernel>
248 return !(rhd == lhd);