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

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

Initial modifications to Pablo Compiler and Kernel Builder to support circular buffers for Lookahead.

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