31#ifndef FENNEC_CONTAINERS_OPTIONAL_H
32#define FENNEC_CONTAINERS_OPTIONAL_H
43constexpr nullopt_t nullopt_v = {};
45#define nullopt nullopt_v
55 using reference_t = T&;
57 using const_reference_t = T&;
58 using const_pointer_t =
const T*;
119 template<
typename...ArgsT>
121 : _val(fennec::
forward<ArgsT>(args)...)
125 constexpr ~optional() {
126 if constexpr(is_fundamental_v<T>) {
130 fennec::destruct(&_val);
144 constexpr operator bool()
const {
166 if constexpr(not is_fundamental_v<T>) {
168 fennec::destruct(&_val);
179 constexpr optional&
operator=(
const T& val)
requires is_copy_constructible_v<T> and is_copy_assignable_v<T> {
183 fennec::construct(&_val, val);
192 constexpr optional&
operator=(T&& val)
requires is_move_constructible_v<T> and is_move_assignable_v<T> {
194 _val = fennec::forward<T>(val);
196 fennec::construct(&_val, fennec::forward<T>(val));
206 if (_set != opt._set) {
209 fennec::construct(&_val, opt._val);
211 fennec::destruct(&_val);
224 if (_set != opt._set) {
229 fennec::destruct(&_val);
249 return _set ? &_val :
nullptr;
255 return _set ? &_val :
nullptr;
262 assertd(_set,
"Attempted to reference the value of an unset optional");
270 assertd(_set,
"Attempted to reference the value of an unset optional");
278 assertd(_set,
"Attempted to reference the value of an unset optional");
286 assertd(_set,
"Attempted to reference the value of an unset optional");
302 _val = fennec::forward<T>(val);
304 fennec::construct(&_val, fennec::forward<T>(val));
317 fennec::construct(&_val, val);
326 template<
typename...ArgsT>
329 _val = T(fennec::forward<ArgsT>(args)...);
331 fennec::construct(&_val, fennec::forward<ArgsT>(args)...);
This header contains functions related to analyzing, modifying or copying buffers interpreted as byte...
Structure to hold an optional value.
Definition optional.h:51
constexpr const_pointer_t operator->() const noexcept
Definition optional.h:254
constexpr pointer_t operator->() noexcept
Definition optional.h:248
constexpr optional & operator=(nullopt_t)
Fundamental Type Assignment.
Definition optional.h:165
constexpr T & emplace(T &&val)
Emplace Assignment, Move overload.
Definition optional.h:300
constexpr optional(T &&val)
Type Move Constructor.
Definition optional.h:91
constexpr T & operator*() &noexcept
Dereference Operator.
Definition optional.h:261
constexpr optional(const optional &opt)
Copy Constructor.
Definition optional.h:99
constexpr T && operator*() &&noexcept
Dereference Operator.
Definition optional.h:277
constexpr optional(const T &val)
Type Copy Constructor.
Definition optional.h:83
constexpr T & emplace(const T &val)
Emplace Assignment, Copy overload.
Definition optional.h:313
void reset()
Reset the Optional.
Definition optional.h:339
constexpr optional()
Default Constructor.
Definition optional.h:68
constexpr const T && operator*() const &&noexcept
Const Dereference Operator.
Definition optional.h:285
constexpr T & emplace(ArgsT &&...args)
Emplace Assignment.
Definition optional.h:327
constexpr bool empty() const
Definition optional.h:150
constexpr optional & operator=(optional &&opt) noexcept and is_move_assignable_v< T >
Move Assignment.
Definition optional.h:223
constexpr optional(optional &&opt) noexcept
Move Constructor.
Definition optional.h:110
constexpr const T & operator*() const &noexcept
Const Dereference Operator.
Definition optional.h:269
constexpr optional & operator=(const T &val) and is_copy_assignable_v< T >
Type Copy Assignment.
Definition optional.h:179
constexpr optional(nullopt_t)
Default Constructor.
Definition optional.h:75
constexpr optional & operator=(T &&val) and is_move_assignable_v< T >
Type Move Assignment.
Definition optional.h:192
constexpr optional & operator=(const optional &opt) and is_copy_assignable_v< T >
Copy Assignment.
Definition optional.h:205
constexpr T && forward(remove_reference_t< T > &x) noexcept
forwards reference types to extend their lifetime
Definition utility.h:75
constexpr remove_reference_t< T > && move(T &&x) noexcept
produces an x-value type to indicate x may be "moved"
Definition utility.h:92