source: icGREP/icgrep-devel/icgrep/util/aligned_allocator.h @ 5235

Last change on this file since 5235 was 5235, checked in by nmedfort, 2 years ago

Fix to support older BOOST version.

File size: 1.5 KB
Line 
1#ifndef ALIGNED_ALLOCATOR_H
2#define ALIGNED_ALLOCATOR_H
3
4#include <boost/version.hpp>
5#if BOOST_VERSION >= 105600
6#include <boost/align/aligned_allocator.hpp>
7template<typename T, unsigned Align>
8using AlignedAllocator = boost::alignment::aligned_allocator<T, Align>;
9#else
10
11template <typename T, unsigned Align>
12class AlignedAllocator
13{
14public:
15    typedef T         value_type;
16    typedef T*        pointer;
17    typedef const T*  const_pointer;
18    typedef T&        reference;
19    typedef const T&  const_reference;
20    typedef size_t    size_type;
21    typedef ptrdiff_t difference_type;
22
23    template <class U>
24    struct rebind { typedef AlignedAllocator<U, Align> other; };
25
26public:
27    AlignedAllocator() noexcept {}
28
29    pointer allocate(size_type n, const_pointer = 0) {
30        const auto size = n * sizeof(T);
31        if (size == 0) {
32            return nullptr;
33        }
34        void * ptr = nullptr;
35        int rc = posix_memalign(&ptr, Align, size);
36        if (rc != 0) {
37            throw std::bad_alloc();
38        }
39        return reinterpret_cast<pointer>(ptr);
40    }
41
42    template<typename Type, unsigned align>
43    inline bool operator==(AlignedAllocator<Type, align> const &) {
44        return false;
45    }
46
47    template<typename Type, unsigned align>
48    inline bool operator!=(AlignedAllocator<Type, align> const &) {
49        return true;
50    }
51
52
53    void deallocate(pointer p, size_type) noexcept {
54        return free(p);
55    }
56};
57
58#endif
59
60
61
62#endif // ALIGNED_ALLOCATOR_H
Note: See TracBrowser for help on using the repository browser.