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

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

Fix for slab allocator on Mac OS

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