The Pedigree Project 0.1
UniqueResource.h
1/*
2 * Copyright (c) 2026, Pedigree Developers
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted.
6 */
7
8#ifndef PEDIGREE_KERNEL_UTILITIES_UNIQUERESOURCE_H
9#define PEDIGREE_KERNEL_UTILITIES_UNIQUERESOURCE_H
10#include "pedigree/kernel/compiler.h"
11
12#include <config.h>
13
25template <class T, class Releaser>
27 public:
28 UniqueResource() : m_Resource(nullptr) {}
29
30 UniqueResource(UniqueResource&& other) noexcept : m_Resource(other.release()) {}
31
33 reset();
34 }
35
36 UniqueResource& operator=(UniqueResource&& other) noexcept {
37 if (this != &other) {
38 reset();
39 m_Resource = other.release();
40 }
41 return *this;
42 }
43
45 MUST_USE_RESULT static UniqueResource adopt(T* resource) {
46 return UniqueResource(resource);
47 }
48
49 T* get() const {
50 return m_Resource;
51 }
52
53 T* operator->() const {
54 return m_Resource;
55 }
56
57 T& operator*() const {
58 return *m_Resource;
59 }
60
61 explicit operator bool() const {
62 return m_Resource != nullptr;
63 }
64
66 MUST_USE_RESULT T* release() noexcept {
67 T* resource = m_Resource;
68 m_Resource = nullptr;
69 return resource;
70 }
71
73 void reset(T* replacement = nullptr) noexcept {
74 if (replacement == m_Resource) {
75 return;
76 }
77 T* resource = m_Resource;
78 m_Resource = nullptr;
79 if (resource) {
80 Releaser::release(resource);
81 }
82 m_Resource = replacement;
83 }
84
85 private:
86 explicit UniqueResource(T* resource) : m_Resource(resource) {}
87
88 UniqueResource(const UniqueResource&) = delete;
89 UniqueResource& operator=(const UniqueResource&) = delete;
90
91 T* m_Resource;
92};
93
94#endif
static MUST_USE_RESULT UniqueResource adopt(T *resource)
MUST_USE_RESULT T * release() noexcept
void reset(T *replacement=nullptr) noexcept