|
|
|
|
@@ -73,8 +73,6 @@ terms of the MIT license. A copy of the license can be found in the file
|
|
|
|
|
#include <stdbool.h> // bool
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
#include <type_traits> // true_type
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
@@ -337,41 +335,33 @@ mi_decl_export void* mi_new_aligned_nothrow(size_t n, size_t alignment) mi_attr_
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------
|
|
|
|
|
// Implement the C++ std::allocator interface for use in STL containers.
|
|
|
|
|
// (note: see `mimalloc-new-delete.h` for overriding the new/delete operators globally)
|
|
|
|
|
// ---------------------------------------------------------------------------------------------
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
|
|
|
|
// ------------------------------------------------------
|
|
|
|
|
// STL allocator - an extension to hook mimalloc into STL
|
|
|
|
|
// containers in place of std::allocator.
|
|
|
|
|
// ------------------------------------------------------
|
|
|
|
|
#if (__cplusplus >= 201103L) || (_MSC_VER > 1900) // C++11
|
|
|
|
|
#include <type_traits> // true_type
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#pragma warning(disable: 4100)
|
|
|
|
|
template <class T>
|
|
|
|
|
struct mi_stl_allocator {
|
|
|
|
|
template<class T> struct mi_stl_allocator {
|
|
|
|
|
typedef T value_type;
|
|
|
|
|
|
|
|
|
|
#if (__cplusplus >= 201103L) || (_MSC_VER > 1900) // C++11
|
|
|
|
|
using propagate_on_container_copy_assignment = std::true_type;
|
|
|
|
|
using propagate_on_container_move_assignment = std::true_type;
|
|
|
|
|
using propagate_on_container_swap = std::true_type;
|
|
|
|
|
using is_always_equal = std::true_type;
|
|
|
|
|
|
|
|
|
|
mi_stl_allocator() noexcept {}
|
|
|
|
|
mi_stl_allocator(const mi_stl_allocator& other) noexcept {}
|
|
|
|
|
template <class U>
|
|
|
|
|
mi_stl_allocator(const mi_stl_allocator<U>& other) noexcept {}
|
|
|
|
|
|
|
|
|
|
T* allocate(size_t n, const void* hint = 0) {
|
|
|
|
|
return (T*)mi_mallocn(n, sizeof(T));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void deallocate(T* p, size_t n) {
|
|
|
|
|
mi_free(p);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
mi_stl_allocator() mi_attr_noexcept {}
|
|
|
|
|
mi_stl_allocator(const mi_stl_allocator& other) mi_attr_noexcept { (void)other; }
|
|
|
|
|
template<class U> mi_stl_allocator(const mi_stl_allocator<U>& other) mi_attr_noexcept { (void)other; }
|
|
|
|
|
T* allocate(size_t n, const void* hint = 0) { (void)hint; return (T*)mi_mallocn(n, sizeof(T)); }
|
|
|
|
|
void deallocate(T* p, size_t n) { mi_free_size(p,n); }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <class T1, class T2>
|
|
|
|
|
bool operator==(const mi_stl_allocator<T1>& lhs, const mi_stl_allocator<T2>& rhs) noexcept { return true; }
|
|
|
|
|
template <class T1, class T2>
|
|
|
|
|
bool operator!=(const mi_stl_allocator<T1>& lhs, const mi_stl_allocator<T2>& rhs) noexcept { return false; }
|
|
|
|
|
#endif
|
|
|
|
|
template<class T1,class T2> bool operator==(const mi_stl_allocator<T1>& lhs, const mi_stl_allocator<T2>& rhs) mi_attr_noexcept { (void)lhs; (void)rhs; return true; }
|
|
|
|
|
template<class T1,class T2> bool operator!=(const mi_stl_allocator<T1>& lhs, const mi_stl_allocator<T2>& rhs) mi_attr_noexcept { (void)lhs; (void)rhs; return false; }
|
|
|
|
|
#endif // __cplusplus
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|