libvisual  0.5.0
lv_aligned_allocator.hpp
1 #ifndef _LV_ALIGNED_ALLOCATOR_HPP
2 #define _LV_ALIGNED_ALLOCATOR_HPP
3 
4 #include <cstddef>
5 #include <cstdlib>
6 #include <new>
7 #include <libvisual/lv_mem.h>
8 
9 namespace LV {
10 
11  template <typename T, std::size_t alignment>
13 
14  template <std::size_t alignment>
15  struct AlignedAllocator<void, alignment>
16  {
17  typedef void value_type;
18  typedef void* pointer;
19  typedef void const* const_pointer;
20 
21  template <typename U>
22  struct rebind { typedef AlignedAllocator<U, alignment> other; };
23  };
24 
32  template <typename T, std::size_t alignment>
33  struct AlignedAllocator
34  {
35  typedef T* pointer;
36  typedef T& reference;
37  typedef T const* const_pointer;
38  typedef T const& const_reference;
39  typedef T value_type;
40  typedef std::size_t size_type;
41  typedef std::ptrdiff_t difference_type;
42 
43  template <typename U>
45 
47  {}
48 
49  template <typename U>
51  {}
52 
53  pointer address (reference x) const
54  {
55  return &x;
56  }
57 
58  const_pointer address (const_reference x) const
59  {
60  return &x;
61  }
62 
63  pointer allocate (size_type n, typename AlignedAllocator<void, alignment>::pointer = nullptr)
64  {
65  void* ptr = visual_mem_malloc_aligned (n * sizeof (T), alignment);
66 
67  if (!ptr)
68  throw std::bad_alloc ();
69 
70  return pointer (ptr);
71  }
72 
73  void deallocate (pointer ptr, size_type) noexcept
74  {
76  }
77 
78  size_type max_size () const
79  {
80  return size_type (-1) / sizeof (T);
81  }
82 
83  void construct (pointer p, const_reference x)
84  {
85  new (p) T (x);
86  }
87 
88  void destroy (pointer p)
89  {
90  p->~T ();
91  }
92  };
93 
94  template <typename T, typename U, std::size_t alignment>
95  bool operator== (AlignedAllocator<T, alignment> const&, AlignedAllocator<U, alignment> const&)
96  {
97  return true;
98  }
99 
100  template <typename T, typename U, std::size_t alignment>
101  bool operator!= (AlignedAllocator<T, alignment> const&, AlignedAllocator<U, alignment> const&)
102  {
103  return false;
104  }
105 
106 } // LV namespace
107 
108 #endif // LV_ALIGNED_ALLOCATOR_HPP