DASH  0.3.0
UniquePtr.h
1 #ifndef DASH__MEMORY__UNIQUE_PTR_H__INCLUDED
2 #define DASH__MEMORY__UNIQUE_PTR_H__INCLUDED
3 
4 #include <memory>
5 
6 namespace dash {
7 
8 template <class Allocator>
10 
11 template <class Allocator>
12 constexpr bool operator==(
14  DefaultDeleter<Allocator> const &) noexcept;
15 
16 template <class Allocator>
17 class DefaultDeleter {
18 public:
19  using memory = typename Allocator::memory_resource;
20  using pointer = typename std::allocator_traits<Allocator>::pointer;
21 
22  template <class Allocator_>
23  friend constexpr bool operator==(
25  DefaultDeleter<Allocator_> const &) noexcept;
26 
27  constexpr DefaultDeleter() = default;
28 
29  DefaultDeleter(const Allocator &alloc, std::size_t nels)
30  : m_alloc(alloc)
31  , m_nels(nels)
32  {
33  }
34 
35  void operator()(pointer p)
36  {
37  m_alloc.deallocate(p, m_nels);
38  }
39 
40 private:
41  Allocator m_alloc{nullptr};
42  std::size_t m_nels{};
43 };
44 
45 template <class Allocator>
46 constexpr bool operator==(
47  DefaultDeleter<Allocator> const &lhs,
48  DefaultDeleter<Allocator> const &rhs) noexcept
49 {
50  return lhs.m_alloc == rhs.m_alloc && lhs.m_nels == rhs.m_nels;
51 }
52 
53 template <
55  class T,
57  class AllocatorT,
59  template <class> class Deleter = dash::DefaultDeleter>
60 auto allocate_unique(const AllocatorT &alloc, std::size_t n)
61 {
62  using allocator =
63  typename std::allocator_traits<AllocatorT>::template rebind_alloc<T>;
64  using deleter = Deleter<allocator>;
65  using unique_ptr = std::unique_ptr<T, deleter>;
66 
67  allocator _alloc{alloc};
68  return unique_ptr{_alloc.allocate(n), deleter{_alloc, n}};
69 }
70 
71 } // namespace dash
72 #endif
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8