mimic++ v10.0.1
Loading...
Searching...
No Matches
CopyableBox.hpp
Go to the documentation of this file.
1// Copyright Dominic (DNKpp) Koepke 2026.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// https://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef MIMICPP_UTILITIES_COPYABLE_BOX_HPP
7#define MIMICPP_UTILITIES_COPYABLE_BOX_HPP
8
9#pragma once
10
11#include "mimic++/Fwd.hpp"
13
14#ifndef MIMICPP_DETAIL_IS_MODULE
15 #include <concepts>
16 #include <memory>
17 #include <type_traits>
18#endif
19
21{
29 template <typename T>
31 {
32 public:
33 constexpr ~CopyableBox() noexcept
34 {
35 delete m_Data;
36 }
37
38 [[nodiscard]]
39 constexpr CopyableBox(CopyableBox const& other)
40 : m_Data{other.m_Data ? new T{*other} : nullptr}
41 {
42 }
43
44 [[nodiscard]]
45 constexpr CopyableBox(CopyableBox&& other) noexcept
46 : m_Data{std::exchange(other.m_Data, nullptr)}
47 {
48 }
49
50 constexpr CopyableBox& operator=(CopyableBox other) noexcept
51 {
52 std::ranges::swap(m_Data, other.m_Data);
53 return *this;
54 }
55
56 [[nodiscard]]
57 constexpr CopyableBox()
58 : m_Data{new T{}}
59 {
60 }
61
62 [[nodiscard]]
63 explicit(false) constexpr CopyableBox(T const& value)
64 : m_Data{new T{value}}
65 {
66 }
67
68 [[nodiscard]]
69 explicit(false) constexpr CopyableBox(T&& value)
70 : m_Data{new T{std::move(value)}}
71 {
72 }
73
74 [[nodiscard]]
75 constexpr T& operator*() noexcept
76 {
77 MIMICPP_ASSERT(m_Data, "Data is null.");
78 return *m_Data;
79 }
80
81 [[nodiscard]]
82 constexpr T const& operator*() const noexcept
83 {
84 MIMICPP_ASSERT(m_Data, "Data is null.");
85 return *m_Data;
86 }
87
88 [[nodiscard]]
89 constexpr T* operator->() noexcept
90 {
91 return m_Data;
92 }
93
94 [[nodiscard]]
95 constexpr T const* operator->() const noexcept
96 {
97 return m_Data;
98 }
99
100 [[nodiscard]]
101 explicit constexpr operator bool() const noexcept
102 {
103 return m_Data != nullptr;
104 }
105
106 [[nodiscard]]
107 friend constexpr bool operator==(CopyableBox const& lhs, CopyableBox const& rhs)
108 {
109 return *lhs == *rhs;
110 }
111
112 private:
113 T* m_Data{};
114 };
115}
116
117#endif
#define MIMICPP_ASSERT(condition, msg)
Definition Config.hpp:54
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
constexpr T & operator*() noexcept
Definition CopyableBox.hpp:75
friend constexpr bool operator==(CopyableBox const &lhs, CopyableBox const &rhs)
Definition CopyableBox.hpp:107
constexpr ~CopyableBox() noexcept
Definition CopyableBox.hpp:33
constexpr CopyableBox(CopyableBox &&other) noexcept
Definition CopyableBox.hpp:45
constexpr CopyableBox()
Definition CopyableBox.hpp:57
constexpr CopyableBox & operator=(CopyableBox other) noexcept
Definition CopyableBox.hpp:50
constexpr T const * operator->() const noexcept
Definition CopyableBox.hpp:95
constexpr T const & operator*() const noexcept
Definition CopyableBox.hpp:82
constexpr CopyableBox(CopyableBox const &other)
Definition CopyableBox.hpp:39
constexpr T * operator->() noexcept
Definition CopyableBox.hpp:89
Definition Fwd.hpp:451