L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
elide_dtor
1// vi:set ft=cpp: -*- Mode: C++ -*-
2/*
3 * Copyright (C) 2026 Kernkonzept GmbH.
4 * Author(s): Jan Klötzke <jan.kloetzke@kernkonzept.com>
5 *
6 * License: see LICENSE.spdx (in this directory or the directories above)
7 */
8
9#pragma once
10
11#include <l4/cxx/type_traits>
12#include <stddef.h>
13
14namespace cxx {
15
27template< typename T >
28class Elide_dtor
29{
30private:
31 // Small helper struct so that we don't have to define a global operator new.
32 struct X : T
33 {
34 constexpr void *operator new (size_t, void *p) noexcept { return p; }
35 constexpr void operator delete (void *) {}
36
37 constexpr X() = default;
38
39 template<typename ...Args>
40 constexpr X(Args && ...a) : T(cxx::forward<Args>(a)...) {}
41
42 constexpr X(T const &o) : T(o) {}
43
44 constexpr X(T &&o) : T(cxx::move(o)) {}
45 };
46
47public:
48 template< typename ...Args >
49 explicit constexpr Elide_dtor(Args && ...args)
50 { new (_s) X(cxx::forward<Args>(args)...); }
51
52 explicit constexpr Elide_dtor(T const &o)
53 { new (_s) X(o); }
54
55 explicit constexpr Elide_dtor(T &&o)
56 { new (_s) X(cxx::move(o)); }
57
58 Elide_dtor(Elide_dtor const &) = delete;
59 Elide_dtor(Elide_dtor &&) = delete;
60
61 ~Elide_dtor() = default;
62
63 T *operator -> () { return get(); }
64 const T *operator -> () const { return get(); }
65
66 T *operator & () { return get(); }
67 const T *operator & () const { return get(); }
68
69private:
70 T *get() { return reinterpret_cast<X *>(_s); }
71 const T *get() const { return reinterpret_cast<X const *>(_s); }
72
73 alignas(X) char _s[sizeof(X)];
74};
75
76}
Our C++ library.
Definition arith:11