mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 15:09:31 +03:00
Merge pull request #653 from vmarkovtsev/fix-const
Make "destroy" a compile-time constant + fix const allocator comparisons
This commit is contained in:
commit
95e88a699e
1 changed files with 13 additions and 15 deletions
|
@ -473,7 +473,7 @@ template<class T1,class T2> bool operator!=(const mi_stl_allocator<T1>& , const
|
||||||
#include <memory> // std::shared_ptr
|
#include <memory> // std::shared_ptr
|
||||||
|
|
||||||
// Common base class for STL allocators in a specific heap
|
// Common base class for STL allocators in a specific heap
|
||||||
template<class T> struct _mi_heap_stl_allocator_common : public _mi_stl_allocator_common<T> {
|
template<class T, bool destroy> struct _mi_heap_stl_allocator_common : public _mi_stl_allocator_common<T> {
|
||||||
using typename _mi_stl_allocator_common<T>::size_type;
|
using typename _mi_stl_allocator_common<T>::size_type;
|
||||||
using typename _mi_stl_allocator_common<T>::value_type;
|
using typename _mi_stl_allocator_common<T>::value_type;
|
||||||
using typename _mi_stl_allocator_common<T>::pointer;
|
using typename _mi_stl_allocator_common<T>::pointer;
|
||||||
|
@ -492,18 +492,18 @@ template<class T> struct _mi_heap_stl_allocator_common : public _mi_stl_allocato
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void collect(bool force) { mi_heap_collect(this->heap.get(), force); }
|
void collect(bool force) { mi_heap_collect(this->heap.get(), force); }
|
||||||
template<class U> bool is_equal(const _mi_heap_stl_allocator_common<U>& x) { return (this->heap == x.heap); }
|
template<class U> bool is_equal(const _mi_heap_stl_allocator_common<U, destroy>& x) const { return (this->heap == x.heap); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<mi_heap_t> heap;
|
std::shared_ptr<mi_heap_t> heap;
|
||||||
template<class U> friend struct _mi_heap_stl_allocator_common;
|
template<class U, bool D> friend struct _mi_heap_stl_allocator_common;
|
||||||
|
|
||||||
_mi_heap_stl_allocator_common(bool destroy) {
|
_mi_heap_stl_allocator_common() {
|
||||||
mi_heap_t* hp = mi_heap_new();
|
mi_heap_t* hp = mi_heap_new();
|
||||||
this->heap.reset(hp, (destroy ? &heap_destroy : &heap_delete)); /* calls heap_delete/destroy when the refcount drops to zero */
|
this->heap.reset(hp, (destroy ? &heap_destroy : &heap_delete)); /* calls heap_delete/destroy when the refcount drops to zero */
|
||||||
}
|
}
|
||||||
_mi_heap_stl_allocator_common(const _mi_heap_stl_allocator_common& x) mi_attr_noexcept : heap(x.heap) { }
|
_mi_heap_stl_allocator_common(const _mi_heap_stl_allocator_common& x) mi_attr_noexcept : heap(x.heap) { }
|
||||||
template<class U> _mi_heap_stl_allocator_common(const _mi_heap_stl_allocator_common<U>& x) mi_attr_noexcept : heap(x.heap) { }
|
template<class U> _mi_heap_stl_allocator_common(const _mi_heap_stl_allocator_common<U, destroy>& x) mi_attr_noexcept : heap(x.heap) { }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void heap_delete(mi_heap_t* hp) { if (hp != NULL) { mi_heap_delete(hp); } }
|
static void heap_delete(mi_heap_t* hp) { if (hp != NULL) { mi_heap_delete(hp); } }
|
||||||
|
@ -511,11 +511,10 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
// STL allocator allocation in a specific heap
|
// STL allocator allocation in a specific heap
|
||||||
template<class T> struct mi_heap_stl_allocator : public _mi_heap_stl_allocator_common<T> {
|
template<class T> struct mi_heap_stl_allocator : public _mi_heap_stl_allocator_common<T, false> {
|
||||||
using typename _mi_heap_stl_allocator_common<T>::size_type;
|
using typename _mi_heap_stl_allocator_common<T, false>::size_type;
|
||||||
mi_heap_stl_allocator() : _mi_heap_stl_allocator_common<T>(false) { } /* delete on destruction */
|
mi_heap_stl_allocator(mi_heap_t* hp) : _mi_heap_stl_allocator_common<T, false>(hp) { } /* no delete or destroy on the passed in heap */
|
||||||
mi_heap_stl_allocator(mi_heap_t* hp) : _mi_heap_stl_allocator_common<T>(hp) { } /* no delete or destroy on the passed in heap */
|
template<class U> mi_heap_stl_allocator(const mi_heap_stl_allocator<U>& x) mi_attr_noexcept : _mi_heap_stl_allocator_common<T, false>(x) { }
|
||||||
template<class U> mi_heap_stl_allocator(const mi_heap_stl_allocator<U>& x) mi_attr_noexcept : _mi_heap_stl_allocator_common<T>(x) { }
|
|
||||||
|
|
||||||
mi_heap_stl_allocator select_on_container_copy_construction() const { return *this; }
|
mi_heap_stl_allocator select_on_container_copy_construction() const { return *this; }
|
||||||
void deallocate(T* p, size_type) { mi_free(p); }
|
void deallocate(T* p, size_type) { mi_free(p); }
|
||||||
|
@ -528,10 +527,9 @@ template<class T1, class T2> bool operator!=(const mi_heap_stl_allocator<T1>& x,
|
||||||
|
|
||||||
// STL allocator allocation in a specific heap, where `free` does nothing and
|
// STL allocator allocation in a specific heap, where `free` does nothing and
|
||||||
// the heap is destroyed in one go on destruction -- use with care!
|
// the heap is destroyed in one go on destruction -- use with care!
|
||||||
template<class T> struct mi_heap_destroy_stl_allocator : public _mi_heap_stl_allocator_common<T> {
|
template<class T> struct mi_heap_destroy_stl_allocator : public _mi_heap_stl_allocator_common<T, true> {
|
||||||
using typename _mi_heap_stl_allocator_common<T>::size_type;
|
using typename _mi_heap_stl_allocator_common<T, true>::size_type;
|
||||||
mi_heap_destroy_stl_allocator() : _mi_heap_stl_allocator_common<T>(true) { } /* destroy on destruction */
|
template<class U> mi_heap_destroy_stl_allocator(const mi_heap_destroy_stl_allocator<U>& x) mi_attr_noexcept : _mi_heap_stl_allocator_common<T, true>(x) { }
|
||||||
template<class U> mi_heap_destroy_stl_allocator(const mi_heap_destroy_stl_allocator<U>& x) mi_attr_noexcept : _mi_heap_stl_allocator_common<T>(x) { }
|
|
||||||
|
|
||||||
mi_heap_destroy_stl_allocator select_on_container_copy_construction() const { return *this; }
|
mi_heap_destroy_stl_allocator select_on_container_copy_construction() const { return *this; }
|
||||||
void deallocate(T*, size_type) { /* do nothing as we destroy the heap on destruct. */ }
|
void deallocate(T*, size_type) { /* do nothing as we destroy the heap on destruct. */ }
|
||||||
|
|
Loading…
Add table
Reference in a new issue