Arduino KVComm  master
Key-Value pair communication library for Arduino
UniquePtr.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 AH_DIAGNOSTIC_WERROR() // Enable errors on warnings
5 
6 #include <AH/STL/type_traits>
7 #include <AH/STL/utility> // std::forward
8 
10 
13 
20 template <class T>
21 class UniquePtr {
22  public:
23  UniquePtr() = default;
24  explicit UniquePtr(T *p) : p(p) {}
25  UniquePtr(const UniquePtr &) = delete;
26  template <class U>
28  reset(r.release());
29  }
30 
31  ~UniquePtr() { delete p; }
32 
33  UniquePtr &operator=(const UniquePtr &) = delete;
35  reset(r.release());
36  return *this;
37  }
38 
39  void reset(T *newP = nullptr) {
40  T *old_ptr = p;
41  p = newP;
42  delete old_ptr;
43  }
44 
45  T *release() {
46  T *old_ptr = p;
47  p = nullptr;
48  return old_ptr;
49  }
50 
51  explicit operator bool() const { return p != nullptr; }
52 
53  T *get() { return p; }
54  const T *get() const { return p; }
55 
56  T *operator->() { return p; }
57  const T *operator->() const { return p; }
58  T &operator*() { return *p; }
59  const T &operator*() const { return *p; }
60 
61  private:
62  T *p = nullptr;
63 };
64 
65 template <typename T, typename... Args>
66 UniquePtr<T> MakeUnique(Args &&... args) {
67  return UniquePtr<T>(new T(std::forward<Args>(args)...));
68 }
69 
71 
73 
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition: NamespaceSettings.hpp:9
AH::UniquePtr::release
T * release()
Definition: UniquePtr.hpp:45
Warnings.hpp
AH::UniquePtr::operator*
T & operator*()
Definition: UniquePtr.hpp:58
AH::UniquePtr::operator=
UniquePtr< T > & operator=(UniquePtr< T > &&r)
Definition: UniquePtr.hpp:34
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:17
AH::UniquePtr::operator->
const T * operator->() const
Definition: UniquePtr.hpp:57
AH::UniquePtr::operator*
const T & operator*() const
Definition: UniquePtr.hpp:59
AH::UniquePtr::get
const T * get() const
Definition: UniquePtr.hpp:54
AH::UniquePtr::get
T * get()
Definition: UniquePtr.hpp:53
AH::UniquePtr::operator->
T * operator->()
Definition: UniquePtr.hpp:56
AH::UniquePtr::reset
void reset(T *newP=nullptr)
Definition: UniquePtr.hpp:39
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:16
AH::UniquePtr
Very basic smart pointer.
Definition: UniquePtr.hpp:21
END_AH_NAMESPACE
#define END_AH_NAMESPACE
Definition: NamespaceSettings.hpp:10
AH::UniquePtr::UniquePtr
UniquePtr(UniquePtr< U > &&r)
Definition: UniquePtr.hpp:27
AH::MakeUnique
UniquePtr< T > MakeUnique(Args &&... args)
Definition: UniquePtr.hpp:66
AH::UniquePtr::UniquePtr
UniquePtr(T *p)
Definition: UniquePtr.hpp:24
AH::UniquePtr::~UniquePtr
~UniquePtr()
Definition: UniquePtr.hpp:31