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

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

More multiplexing changes.

File size: 3.2 KB
RevLine 
[4272]1#ifndef SLAB_ALLOCATOR_H
2#define SLAB_ALLOCATOR_H
3
[4510]4#include <llvm/Support/Allocator.h>
[4272]5
[4536]6using LLVMAllocator = llvm::BumpPtrAllocator;
7
[4526]8namespace {
9
10class __BumpPtrAllocatorProxy {
11public:
12    template <typename T>
13    static inline T * Allocate(const size_t n) {
[4586]14        return static_cast<T*>(mAllocator.Allocate(n * sizeof(T), sizeof(void*)));
[4526]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:
[4586]27    static LLVMAllocator mAllocator;
[4526]28};
29
30LLVMAllocator __BumpPtrAllocatorProxy::mAllocator;
31
32}
33
[4432]34template <typename T>
[4525]35class SlabAllocator {
[4272]36public:
37
[4432]38    using value_type = T;
[4526]39    using pointer = value_type*;
40    using const_pointer = const value_type*;
41    using reference = value_type&;
42    using const_reference = const value_type&;
[4432]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
[4525]51    inline pointer allocate(size_type n, const_pointer = nullptr) noexcept {
[4526]52        return mAllocator.Allocate<T>(n);
[4272]53    }
54
[4536]55    inline void deallocate(pointer p, size_type = 0) noexcept {
[4526]56        mAllocator.Deallocate<T>(p);
[4272]57    }
58
[4510]59    inline size_type max_size() const {
60        return std::numeric_limits<size_type>::max();
61    }
[4272]62
[4526]63    inline LLVMAllocator & get_allocator() {
64        return mAllocator.get_allocator();
[4510]65    }
[4272]66
[4510]67    inline bool operator==(SlabAllocator<T> const&) { return true; }
68    inline bool operator!=(SlabAllocator<T> const&) { return false; }
[4272]69
[4525]70    inline SlabAllocator() noexcept {}
71    inline SlabAllocator(const SlabAllocator &) noexcept {}
72    template <class U> inline SlabAllocator (const std::allocator<U>&) noexcept {}
73    inline ~SlabAllocator() { }
[4510]74private:
[4526]75    __BumpPtrAllocatorProxy mAllocator;
[4510]76};
[4272]77
[4526]78inline void releaseSlabAllocatorMemory() {
79    __BumpPtrAllocatorProxy::Reset();
80}
[4272]81
[4536]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
[4272]121#endif // SLAB_ALLOCATOR_H
Note: See TracBrowser for help on using the repository browser.