commit 9a7ddd7cdb6386ae07b7ebc2316de106a93b42c5
parent 0b448340e8390de6132c11d27e7d6397d0997d23
Author: Oshgnacknak <osh@oshgnacknak.de>
Date: Mon, 3 Jan 2022 14:28:32 +0100
Add AutoDestruct mechanism
Diffstat:
M | osh.h | | | 28 | ++++++++++++++++++++++++++++ |
1 file changed, 28 insertions(+), 0 deletions(-)
diff --git a/osh.h b/osh.h
@@ -70,6 +70,21 @@ namespace osh {
void assert(bool condition, Args&&... args);
template<typename T>
+ concept Destructible = requires(T t) {
+ t.destruct();
+ };
+
+ template<Destructible T>
+ struct AutoDestruct : public T {
+ template<typename... Args>
+ AutoDestruct(Args&&... args);
+
+ ~AutoDestruct();
+ };
+
+ template<Destructible T>
+ AutoDestruct<T> autoDestruct(T t);
+ template<typename T>
void swap(T& a, T& b);
}
@@ -210,6 +225,19 @@ namespace osh {
}
template<typename T>
+ template<typename... Args>
+ AutoDestruct<T>::AutoDestruct(Args&&... args) : T(args...) {}
+
+ template<Destructible T>
+ AutoDestruct<T>::~AutoDestruct() {
+ this->destruct();
+ }
+
+ template<Destructible T>
+ AutoDestruct<T> autoDestruct(T t) {
+ return (AutoDestruct<T>) t;
+ }
+ template<typename T>
void swap(T& a, T& b) {
T t = a;
a = b;