SlHelpers
Loading...
Searching...
No Matches
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
10namespace SlHelpers {
11
15template <typename T, typename Deleter>
16class PtrStore {
17public:
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 }
83private:
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
93template<typename T, typename Deleter>
94requires std::same_as<T, char>
95std::ostream &operator<<(std::ostream &os, const PtrStore<T, Deleter> &err)
96{
97 return os << err.str();
98}
99
100}
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
void reset(T *t=nullptr)
Set the pointer to t.
Definition PtrStore.h:68
PtrStore(PtrStore &&other) noexcept
Move constructor.
Definition PtrStore.h:27
bool operator!() const
! wrapper around valid()
Definition PtrStore.h:40
std::string_view str() const noexcept
Return the current pointer as string.
Definition PtrStore.h:46
T * release()
Return the pointer and stop owning it.
Definition PtrStore.h:63
T * get() noexcept
Get the stored pointer.
Definition PtrStore.h:52
const T * operator->() const noexcept
Get the stored pointer.
Definition PtrStore.h:60
bool valid() const
Does this instance hold a valid pointer?
Definition PtrStore.h:36
const T * get() const noexcept
Get the stored pointer.
Definition PtrStore.h:50
T * operator*() noexcept
Get the stored pointer.
Definition PtrStore.h:54
PtrStore & operator=(PtrStore &&other) noexcept
Move assignment.
Definition PtrStore.h:29
T * operator->() noexcept
Get the stored pointer.
Definition PtrStore.h:58
T ** ptr() noexcept
Get a pointer to the internal pointer.
Definition PtrStore.h:79
PtrStore(T *t) noexcept
Construct a new PtrStore with pointer set to t.
Definition PtrStore.h:20
const T * operator*() const noexcept
Get the stored pointer.
Definition PtrStore.h:56