SlHelpers
PtrStore.h
1 // SPDX-License-Identifier: GPL-2.0-only
2 
3 #pragma once
4 
5 #include <concepts>
6 #include <iostream>
7 #include <string_view>
8 #include <utility>
9 
10 namespace SlHelpers {
11 
15 template <typename T, typename Deleter>
16 class PtrStore {
17 public:
18  PtrStore() noexcept : PtrStore(nullptr) {}
20  explicit PtrStore(T *t) noexcept : m_ptr(t), m_deleter(Deleter{}) {}
21  ~PtrStore() { free(); }
22 
23  PtrStore(const PtrStore &) = delete;
24  PtrStore &operator=(const PtrStore &) = delete;
25 
27  PtrStore(PtrStore &&other) noexcept : m_ptr(other.release()) {}
29  PtrStore &operator=(PtrStore &&other) noexcept {
30  if (this != &other)
31  reset(other.release());
32  return *this;
33  }
34 
36  bool valid() const { return m_ptr; }
38  operator bool() const { return valid(); }
40  bool operator!() const { return !valid(); }
41 
46  std::string_view str() const noexcept
47  requires std::same_as<T, char> { return m_ptr ? : ""; }
48 
50  const T *get() const noexcept { return m_ptr; }
52  T *get() noexcept { return m_ptr; }
54  T *operator*() noexcept { return m_ptr; }
56  const T *operator*() const noexcept { return m_ptr; }
58  T *operator->() noexcept { return m_ptr; }
60  const T *operator->() const noexcept { return m_ptr; }
61 
63  T *release() {
64  return std::exchange(m_ptr, nullptr);
65  }
66 
68  void reset(T *t = nullptr) {
69  free();
70  m_ptr = t;
71  }
72 
79  T **ptr() noexcept {
80  free();
81  return &m_ptr;
82  }
83 private:
84  void free() {
85  m_deleter(m_ptr);
86  m_ptr = nullptr;
87  }
88 
89  T *m_ptr;
90  [[no_unique_address]] Deleter m_deleter;
91 };
92 
93 template<typename T, typename Deleter>
94 requires std::same_as<T, char>
95 std::ostream &operator<<(std::ostream &os, const PtrStore<T, Deleter> &err)
96 {
97  return os << err.str();
98 }
99 
100 }
T ** ptr() noexcept
Get a pointer to the internal pointer.
Definition: PtrStore.h:79
std::string_view str() const noexcept requires std
Return the current pointer as string.
Definition: PtrStore.h:46
bool operator!() const
! wrapper around valid()
Definition: PtrStore.h:40
The Deleter for UniqueHolder types.
Definition: Unique.h:15
A store for a pointer which is freed in the destructor using sqlite3_free()
Definition: PtrStore.h:16
PtrStore(PtrStore &&other) noexcept
Move constructor.
Definition: PtrStore.h:27
PtrStore & operator=(PtrStore &&other) noexcept
Move assignment.
Definition: PtrStore.h:29
PtrStore(T *t) noexcept
Construct a new PtrStore with pointer set to t.
Definition: PtrStore.h:20
bool valid() const
Does this instance hold a valid pointer?
Definition: PtrStore.h:36
void reset(T *t=nullptr)
Set the pointer to t.
Definition: PtrStore.h:68
Definition: Color.h:8