source: icGREP/icgrep-devel/icgrep/slab_allocator.h @ 4813

Last change on this file since 4813 was 4588, checked in by nmedfort, 4 years ago

More multiplexing changes.

File size: 3.2 KB
Line 
1#ifndef SLAB_ALLOCATOR_H
2#define SLAB_ALLOCATOR_H
3
4#include <llvm/Support/Allocator.h>
5
6using LLVMAllocator = llvm::BumpPtrAllocator;
7
8namespace {
9
10class __BumpPtrAllocatorProxy {
11public:
12    template <typename T>
13    static inline T * Allocate(const size_t n) {
14        return static_cast<T*>(mAllocator.Allocate(n * sizeof(T), sizeof(void*)));
15    }
16    template <typename T>
17    static inline void Deallocate(const T * pointer) {
18        mAllocator.Deallocate(pointer);
19    }
20    static inline void Reset() {
21        mAllocator.Reset();
22    }
23    static LLVMAllocator & get_allocator() {
24        return mAllocator;
25    }
26private:
27    static LLVMAllocator mAllocator;
28};
29
30LLVMAllocator __BumpPtrAllocatorProxy::mAllocator;
31
32}
33
34template <typename T>
35class SlabAllocator {
36public:
37
38    using value_type = T;
39    using pointer = value_type*;
40    using const_pointer = const value_type*;
41    using reference = value_type&;
42    using const_reference = const value_type&;
43    using size_type = std::size_t;
44    using difference_type = std::ptrdiff_t;
45
46    template<class U>
47    struct rebind {
48        typedef SlabAllocator<U> other;
49    };
50
51    inline pointer allocate(size_type n, const_pointer = nullptr) noexcept {
52        return mAllocator.Allocate<T>(n);
53    }
54
55    inline void deallocate(pointer p, size_type = 0) noexcept {
56        mAllocator.Deallocate<T>(p);
57    }
58
59    inline size_type max_size() const {
60        return std::numeric_limits<size_type>::max();
61    }
62
63    inline LLVMAllocator & get_allocator() {
64        return mAllocator.get_allocator();
65    }
66
67    inline bool operator==(SlabAllocator<T> const&) { return true; }
68    inline bool operator!=(SlabAllocator<T> const&) { return false; }
69
70    inline SlabAllocator() noexcept {}
71    inline SlabAllocator(const SlabAllocator &) noexcept {}
72    template <class U> inline SlabAllocator (const std::allocator<U>&) noexcept {}
73    inline ~SlabAllocator() { }
74private:
75    __BumpPtrAllocatorProxy mAllocator;
76};
77
78inline void releaseSlabAllocatorMemory() {
79    __BumpPtrAllocatorProxy::Reset();
80}
81
82template <typename T>
83class LLVMAllocatorProxy {
84public:
85
86    using value_type = T;
87    using pointer = value_type*;
88    using const_pointer = const value_type*;
89    using reference = value_type&;
90    using const_reference = const value_type&;
91    using size_type = std::size_t;
92    using difference_type = std::ptrdiff_t;
93
94    template<class U>
95    struct rebind {
96        typedef SlabAllocator<U> other;
97    };
98
99    inline pointer allocate(size_type n, const_pointer = nullptr) noexcept {
100        return mAllocator.Allocate<T>(n);
101    }
102
103    inline void deallocate(pointer p, size_type = 0) noexcept {
104        mAllocator.Deallocate(p);
105    }
106
107    inline size_type max_size() const {
108        return std::numeric_limits<size_type>::max();
109    }
110
111    inline bool operator==(SlabAllocator<T> const&) { return true; }
112    inline bool operator!=(SlabAllocator<T> const&) { return false; }
113
114    inline LLVMAllocatorProxy(LLVMAllocator & allocator) noexcept : mAllocator(allocator) {}
115    inline LLVMAllocatorProxy(const LLVMAllocatorProxy & proxy) noexcept : mAllocator(proxy.mAllocator) {}
116    inline ~LLVMAllocatorProxy() { }
117private:
118    LLVMAllocator & mAllocator;
119};
120
121#endif // SLAB_ALLOCATOR_H
Note: See TracBrowser for help on using the repository browser.