CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
Optional.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
10#include <optional>
11
12namespace CeresEngine {
13
14 using std::nullopt;
15 using std::nullopt_t;
16
17 template<typename T> class Optional : private std::optional<T> {
18 private:
19 using Base = std::optional<T>;
20
21 public: // Imported methods
22 using Base::Base;
23 using Base::emplace;
24 using Base::reset;
25 using Base::swap;
26 using Base::operator bool;
27 using Base::operator*;
28 using Base::operator->;
29
30 public:
31 [[nodiscard]] constexpr bool hasValue() const { return base().has_value(); }
32
33 [[nodiscard]] constexpr T& get() & { return base().value(); }
34 [[nodiscard]] constexpr T&& get() && { return std::move(base().value()); }
35
36 [[nodiscard]] constexpr const T& get() const& { return base().value(); }
37 [[nodiscard]] constexpr const T& get() const&& { return base().value(); }
38
39 [[nodiscard]] constexpr std::remove_cv_t<T> get(T&& defaultValue) const& { return base().value_or(defaultValue); }
40 [[nodiscard]] constexpr std::remove_cv_t<T> get(T&& defaultValue) const&& { return base().value_or(defaultValue); }
41
42 public: // Operators
43 template<typename A, typename B> friend constexpr bool operator==(const Optional<A>& lhs, const Optional<B>& rhs);
44 template<typename A, typename B> friend constexpr bool operator==(const Optional<A>& lhs, const B& rhs);
45 template<typename A, typename B> friend constexpr bool operator==(const A& lhs, const Optional<B>& rhs);
46 template<typename A> friend constexpr bool operator==(const Optional<A>& lhs, const std::nullopt_t&);
47
48 template<typename A, typename B> friend constexpr bool operator!=(const Optional<A>& lhs, const Optional<B>& rhs);
49 template<typename A, typename B> friend constexpr bool operator!=(const Optional<A>& lhs, const B& rhs);
50 template<typename A, typename B> friend constexpr bool operator!=(const A& lhs, const Optional<B>& rhs);
51 template<typename A> friend constexpr bool operator!=(const Optional<A>& lhs, const std::nullopt_t&);
52
53 template<typename A, typename B> friend constexpr bool operator>(const Optional<A>& lhs, const Optional<B>& rhs);
54 template<typename A, typename B> friend constexpr bool operator>(const Optional<A>& lhs, const B& rhs);
55 template<typename A, typename B> friend constexpr bool operator>(const A& lhs, const Optional<B>& rhs);
56 template<typename A> friend constexpr bool operator>(const Optional<A>& lhs, const std::nullopt_t&);
57
58 template<typename A, typename B> friend constexpr bool operator>=(const Optional<A>& lhs, const Optional<B>& rhs);
59 template<typename A, typename B> friend constexpr bool operator>=(const Optional<A>& lhs, const B& rhs);
60 template<typename A, typename B> friend constexpr bool operator>=(const A& lhs, const Optional<B>& rhs);
61 template<typename A> friend constexpr bool operator>=(const Optional<A>& lhs, const std::nullopt_t&);
62
63 template<typename A, typename B> friend constexpr bool operator<(const Optional<A>& lhs, const Optional<B>& rhs);
64 template<typename A, typename B> friend constexpr bool operator<(const Optional<A>& lhs, const B& rhs);
65 template<typename A, typename B> friend constexpr bool operator<(const A& lhs, const Optional<B>& rhs);
66 template<typename A> friend constexpr bool operator<(const Optional<A>& lhs, const std::nullopt_t&);
67
68 template<typename A, typename B> friend constexpr bool operator<=(const Optional<A>& lhs, const Optional<B>& rhs);
69 template<typename A, typename B> friend constexpr bool operator<=(const Optional<A>& lhs, const B& rhs);
70 template<typename A, typename B> friend constexpr bool operator<=(const A& lhs, const Optional<B>& rhs);
71 template<typename A> friend constexpr bool operator<=(const Optional<A>& lhs, const std::nullopt_t&);
72
73 private:
74 [[nodiscard]] Base& base() & { return static_cast<Base&>(*this); }
75 [[nodiscard]] Base&& base() && { return static_cast<Base&&>(*this); }
76 [[nodiscard]] const Base& base() const& { return static_cast<const Base&>(*this); }
77 [[nodiscard]] const Base&& base() const&& { return static_cast<const Base&&>(*this); }
78 };
79
80 template<typename T> class Optional<T&> : private std::optional<std::reference_wrapper<T>> {
81 private:
82 using Base = std::optional<std::reference_wrapper<T>>;
83
84 public: // Imported methods
85 using Base::Base;
86 Optional(T* pointer) : Base(pointer != nullptr ? Base(*pointer) : nullopt) {}
87
88 using Base::emplace;
89 using Base::reset;
90 using Base::swap;
91 using Base::operator bool;
92
93 public:
94 [[nodiscard]] constexpr bool hasValue() const { return base().has_value(); }
95
96 [[nodiscard]] constexpr T& get() const { return base().value().get(); }
97
98 [[nodiscard]] T& operator*() { return get(); }
99 [[nodiscard]] const T& operator*() const { return get(); }
100
101 [[nodiscard]] T* operator->() { return &get(); }
102 [[nodiscard]] const T* operator->() const { return &get(); }
103
104 public: // Operators
105 template<typename A, typename B> friend constexpr bool operator==(const Optional<A>& lhs, const Optional<B>& rhs);
106 template<typename A, typename B> friend constexpr bool operator==(const Optional<A>& lhs, const B& rhs);
107 template<typename A, typename B> friend constexpr bool operator==(const A& lhs, const Optional<B>& rhs);
108 template<typename A> friend constexpr bool operator==(const Optional<A>& lhs, const std::nullopt_t&);
109
110 template<typename A, typename B> friend constexpr bool operator!=(const Optional<A>& lhs, const Optional<B>& rhs);
111 template<typename A, typename B> friend constexpr bool operator!=(const Optional<A>& lhs, const B& rhs);
112 template<typename A, typename B> friend constexpr bool operator!=(const A& lhs, const Optional<B>& rhs);
113 template<typename A> friend constexpr bool operator!=(const Optional<A>& lhs, const std::nullopt_t&);
114
115 template<typename A, typename B> friend constexpr bool operator>(const Optional<A>& lhs, const Optional<B>& rhs);
116 template<typename A, typename B> friend constexpr bool operator>(const Optional<A>& lhs, const B& rhs);
117 template<typename A, typename B> friend constexpr bool operator>(const A& lhs, const Optional<B>& rhs);
118 template<typename A> friend constexpr bool operator>(const Optional<A>& lhs, const std::nullopt_t&);
119
120 template<typename A, typename B> friend constexpr bool operator>=(const Optional<A>& lhs, const Optional<B>& rhs);
121 template<typename A, typename B> friend constexpr bool operator>=(const Optional<A>& lhs, const B& rhs);
122 template<typename A, typename B> friend constexpr bool operator>=(const A& lhs, const Optional<B>& rhs);
123 template<typename A> friend constexpr bool operator>=(const Optional<A>& lhs, const std::nullopt_t&);
124
125 template<typename A, typename B> friend constexpr bool operator<(const Optional<A>& lhs, const Optional<B>& rhs);
126 template<typename A, typename B> friend constexpr bool operator<(const Optional<A>& lhs, const B& rhs);
127 template<typename A, typename B> friend constexpr bool operator<(const A& lhs, const Optional<B>& rhs);
128 template<typename A> friend constexpr bool operator<(const Optional<A>& lhs, const std::nullopt_t&);
129
130 template<typename A, typename B> friend constexpr bool operator<=(const Optional<A>& lhs, const Optional<B>& rhs);
131 template<typename A, typename B> friend constexpr bool operator<=(const Optional<A>& lhs, const B& rhs);
132 template<typename A, typename B> friend constexpr bool operator<=(const A& lhs, const Optional<B>& rhs);
133 template<typename A> friend constexpr bool operator<=(const Optional<A>& lhs, const std::nullopt_t&);
134
135 private:
136 [[nodiscard]] Base& base() & { return static_cast<Base&>(*this); }
137 [[nodiscard]] Base&& base() && { return static_cast<Base&&>(*this); }
138 [[nodiscard]] const Base& base() const& { return static_cast<const Base&>(*this); }
139 [[nodiscard]] const Base&& base() const&& { return static_cast<const Base&&>(*this); }
140 };
141
142 template<typename A, typename B> constexpr bool operator==(const Optional<A>& lhs, const Optional<B>& rhs) { return lhs.base() == rhs.base(); }
143 template<typename A, typename B> constexpr bool operator==(const Optional<A>& lhs, const B& rhs) { return lhs.base() == rhs; }
144 template<typename A, typename B> constexpr bool operator==(const A& lhs, const Optional<B>& rhs) { return lhs == rhs.base(); }
145 template<typename A> constexpr bool operator==(const Optional<A>& lhs, const std::nullopt_t&) { return lhs.base() == std::nullopt; }
146
147 template<typename A, typename B> constexpr bool operator!=(const Optional<A>& lhs, const Optional<B>& rhs) { return lhs.base() != rhs.base(); }
148 template<typename A, typename B> constexpr bool operator!=(const Optional<A>& lhs, const B& rhs) { return lhs.base() != rhs; }
149 template<typename A, typename B> constexpr bool operator!=(const A& lhs, const Optional<B>& rhs) { return lhs != rhs.base(); }
150 template<typename A> constexpr bool operator!=(const Optional<A>& lhs, const std::nullopt_t&) { return lhs.base() != std::nullopt; }
151
152 template<typename A, typename B> constexpr bool operator>(const Optional<A>& lhs, const Optional<B>& rhs) { return lhs.base() > rhs.base(); }
153 template<typename A, typename B> constexpr bool operator>(const Optional<A>& lhs, const B& rhs) { return lhs.base() > rhs; }
154 template<typename A, typename B> constexpr bool operator>(const A& lhs, const Optional<B>& rhs) { return lhs > rhs.base(); }
155 template<typename A> constexpr bool operator>(const Optional<A>& lhs, const std::nullopt_t&) { return lhs.base() > std::nullopt; }
156
157 template<typename A, typename B> constexpr bool operator>=(const Optional<A>& lhs, const Optional<B>& rhs) { return lhs.base() >= rhs.base(); }
158 template<typename A, typename B> constexpr bool operator>=(const Optional<A>& lhs, const B& rhs) { return lhs.base() >= rhs; }
159 template<typename A, typename B> constexpr bool operator>=(const A& lhs, const Optional<B>& rhs) { return lhs >= rhs.base(); }
160 template<typename A> constexpr bool operator>=(const Optional<A>& lhs, const std::nullopt_t&) { return lhs.base() >= std::nullopt; }
161
162 template<typename A, typename B> constexpr bool operator<(const Optional<A>& lhs, const Optional<B>& rhs) { return lhs.base() < rhs.base(); }
163 template<typename A, typename B> constexpr bool operator<(const Optional<A>& lhs, const B& rhs) { return lhs.base() < rhs; }
164 template<typename A, typename B> constexpr bool operator<(const A& lhs, const Optional<B>& rhs) { return lhs < rhs.base(); }
165 template<typename A> constexpr bool operator<(const Optional<A>& lhs, const std::nullopt_t&) { return lhs.base() < std::nullopt; }
166
167 template<typename A, typename B> constexpr bool operator<=(const Optional<A>& lhs, const Optional<B>& rhs) { return lhs.base() <= rhs.base(); }
168 template<typename A, typename B> constexpr bool operator<=(const Optional<A>& lhs, const B& rhs) { return lhs.base() <= rhs; }
169 template<typename A, typename B> constexpr bool operator<=(const A& lhs, const Optional<B>& rhs) { return lhs <= rhs.base(); }
170 template<typename A> constexpr bool operator<=(const Optional<A>& lhs, const std::nullopt_t&) { return lhs.base() <= std::nullopt; }
171
172} // namespace CeresEngine
173
174template<typename T> struct std::hash<CeresEngine::Optional<T>> {
175 inline size_t operator()(const CeresEngine::Optional<T>& value) const noexcept { return value ? std::hash<T>{}(value.get()) : 0; }
176};
const T & operator*() const
Definition Optional.hpp:99
T * operator->()
Definition Optional.hpp:101
Optional(T *pointer)
Definition Optional.hpp:86
Base & base() &
Definition Optional.hpp:136
const Base & base() const &
Definition Optional.hpp:138
const Base && base() const &&
Definition Optional.hpp:139
const T * operator->() const
Definition Optional.hpp:102
constexpr bool hasValue() const
Definition Optional.hpp:94
std::optional< std::reference_wrapper< T > > Base
Definition Optional.hpp:82
Base && base() &&
Definition Optional.hpp:137
T & operator*()
Definition Optional.hpp:98
constexpr T & get() const
Definition Optional.hpp:96
Definition Optional.hpp:17
std::optional< T > Base
Definition Optional.hpp:19
friend constexpr bool operator==(const Optional< A > &lhs, const B &rhs)
Definition Optional.hpp:143
constexpr T & get() &
Definition Optional.hpp:33
friend constexpr bool operator>=(const Optional< A > &lhs, const std::nullopt_t &)
Definition Optional.hpp:160
const Base && base() const &&
Definition Optional.hpp:77
friend constexpr bool operator<=(const Optional< A > &lhs, const B &rhs)
Definition Optional.hpp:168
friend constexpr bool operator==(const A &lhs, const Optional< B > &rhs)
Definition Optional.hpp:144
constexpr T && get() &&
Definition Optional.hpp:34
friend constexpr bool operator>(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:152
constexpr std::remove_cv_t< T > get(T &&defaultValue) const &
Definition Optional.hpp:39
friend constexpr bool operator>(const Optional< A > &lhs, const B &rhs)
Definition Optional.hpp:153
constexpr std::remove_cv_t< T > get(T &&defaultValue) const &&
Definition Optional.hpp:40
friend constexpr bool operator<(const Optional< A > &lhs, const B &rhs)
Definition Optional.hpp:163
friend constexpr bool operator>=(const Optional< A > &lhs, const B &rhs)
Definition Optional.hpp:158
constexpr const T & get() const &&
Definition Optional.hpp:37
friend constexpr bool operator<=(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:167
friend constexpr bool operator>(const Optional< A > &lhs, const std::nullopt_t &)
Definition Optional.hpp:155
friend constexpr bool operator!=(const Optional< A > &lhs, const B &rhs)
Definition Optional.hpp:148
friend constexpr bool operator>(const A &lhs, const Optional< B > &rhs)
Definition Optional.hpp:154
friend constexpr bool operator<=(const A &lhs, const Optional< B > &rhs)
Definition Optional.hpp:169
constexpr bool hasValue() const
Definition Optional.hpp:31
constexpr const T & get() const &
Definition Optional.hpp:36
friend constexpr bool operator<(const A &lhs, const Optional< B > &rhs)
Definition Optional.hpp:164
friend constexpr bool operator==(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:142
friend constexpr bool operator<=(const Optional< A > &lhs, const std::nullopt_t &)
Definition Optional.hpp:170
const Base & base() const &
Definition Optional.hpp:76
Base & base() &
Definition Optional.hpp:74
friend constexpr bool operator!=(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:147
friend constexpr bool operator==(const Optional< A > &lhs, const std::nullopt_t &)
Definition Optional.hpp:145
friend constexpr bool operator>=(const A &lhs, const Optional< B > &rhs)
Definition Optional.hpp:159
Base && base() &&
Definition Optional.hpp:75
friend constexpr bool operator!=(const Optional< A > &lhs, const std::nullopt_t &)
Definition Optional.hpp:150
friend constexpr bool operator<(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:162
friend constexpr bool operator!=(const A &lhs, const Optional< B > &rhs)
Definition Optional.hpp:149
friend constexpr bool operator<(const Optional< A > &lhs, const std::nullopt_t &)
Definition Optional.hpp:165
friend constexpr bool operator>=(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:157
Definition Application.hpp:19
constexpr bool operator<(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:162
decltype(auto) get(BezierPath::Element &element) noexcept
Decomposes a bezier path element.
Definition BezierPath.hpp:723
bool operator!=(const ShortAllocator< T, N, A1 > &x, const ShortAllocator< U, M, A2 > &y) noexcept
Definition Allocator.hpp:416
constexpr bool operator>=(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:157
bool operator==(const ShortAllocator< T, N, A1 > &x, const ShortAllocator< U, M, A2 > &y) noexcept
Definition Allocator.hpp:411
constexpr bool operator>(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:152
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
constexpr bool operator<=(const Optional< A > &lhs, const Optional< B > &rhs)
Definition Optional.hpp:167