source: icGREP/icgrep-devel/icgrep-1.00/slab_allocator.h @ 4529

Last change on this file since 4529 was 4526, checked in by nmedfort, 4 years ago

Slab allocator now uses a single BumpPtrAllocator?.

File size: 2.1 KB
Line 
1#ifndef SLAB_ALLOCATOR_H
2#define SLAB_ALLOCATOR_H
3
4#include <llvm/Support/Allocator.h>
5
6namespace {
7
8using LLVMAllocator = llvm::BumpPtrAllocator;
9
10class __BumpPtrAllocatorProxy {
11public:
12    template <typename T>
13    static inline T * Allocate(const size_t n) {
14        return mAllocator.Allocate<T>(n);
15    }
16    template <typename T>
17    static inline void Deallocate(const T * pointer) {
18        mAllocator.Deallocate(pointer);
19    }
20    static inline void Reset() {
21        #ifndef NDEBUG
22        mAllocator.PrintStats();
23        #endif
24        mAllocator.Reset();
25    }
26    static LLVMAllocator & get_allocator() {
27        return mAllocator;
28    }
29private:
30    static llvm::BumpPtrAllocator mAllocator;
31};
32
33LLVMAllocator __BumpPtrAllocatorProxy::mAllocator;
34
35}
36
37template <typename T>
38class SlabAllocator {
39public:
40
41    using value_type = T;
42    using pointer = value_type*;
43    using const_pointer = const value_type*;
44    using reference = value_type&;
45    using const_reference = const value_type&;
46    using size_type = std::size_t;
47    using difference_type = std::ptrdiff_t;
48
49    template<class U>
50    struct rebind {
51        typedef SlabAllocator<U> other;
52    };
53
54    inline pointer allocate(size_type n, const_pointer = nullptr) noexcept {
55        return mAllocator.Allocate<T>(n);
56    }
57
58    inline void deallocate(pointer p, size_type n) noexcept {
59        mAllocator.Deallocate<T>(p);
60    }
61
62    inline size_type max_size() const {
63        return std::numeric_limits<size_type>::max();
64    }
65
66    inline LLVMAllocator & get_allocator() {
67        return mAllocator.get_allocator();
68    }
69
70    inline bool operator==(SlabAllocator<T> const&) { return true; }
71    inline bool operator!=(SlabAllocator<T> const&) { return false; }
72
73    inline SlabAllocator() noexcept {}
74    inline SlabAllocator(const SlabAllocator &) noexcept {}
75    template <class U> inline SlabAllocator (const std::allocator<U>&) noexcept {}
76    inline ~SlabAllocator() { }
77private:
78    __BumpPtrAllocatorProxy mAllocator;
79};
80
81inline void releaseSlabAllocatorMemory() {
82    __BumpPtrAllocatorProxy::Reset();
83}
84
85#endif // SLAB_ALLOCATOR_H
Note: See TracBrowser for help on using the repository browser.