32#ifndef DELAYED_CONSTRUCT_H
33#define DELAYED_CONSTRUCT_H
47 using Base = std::optional<T>;
53 std::enable_if_t<std::is_assignable_v<T&, U&&>,
int> = 0>
55 Base::operator=(std::forward<U>(t));
59 using Base::operator->;
60 using Base::operator*;
62 using Base::operator bool;
64 return Base::has_value();
73# if 0 && KBLIB_USE_CXX20
82# define OVERLOAD_DEFER_OP(op) \
83 KBLIB_NODISCARD friend constexpr auto operator op( \
84 const delayed_construct& lhs, \
85 const delayed_construct& rhs) noexcept->bool { \
86 return static_cast<const Base&>(lhs) \
87 op static_cast<const Base&>(rhs); \
89 template <typename U> \
90 KBLIB_NODISCARD friend constexpr auto operator op( \
91 const delayed_construct& lhs, \
92 const delayed_construct<U>& rhs) noexcept->bool { \
93 return static_cast<const Base&>(lhs) \
94 op static_cast<const std::optional<U>&>(rhs); \
96 KBLIB_NODISCARD friend constexpr auto operator op( \
97 const delayed_construct& lhs, \
98 std::nullopt_t rhs) noexcept->bool { \
99 return static_cast<const Base&>(lhs) op rhs; \
101 KBLIB_NODISCARD friend constexpr auto operator op( \
102 std::nullopt_t lhs, \
103 const delayed_construct& rhs) noexcept->bool { \
104 return lhs op static_cast<const Base&>(rhs); \
106 template <typename U> \
107 KBLIB_NODISCARD friend constexpr auto operator op( \
108 const delayed_construct& opt, const U& value) noexcept->bool { \
109 return static_cast<const Base&>(opt) op value; \
111 template <typename U> \
112 KBLIB_NODISCARD friend constexpr auto operator op( \
113 const U& value, const delayed_construct& opt) noexcept->bool { \
114 return value op static_cast<const Base&>(opt); \
142# undef OVERLOAD_DEFER_OP
172struct hash<
kblib::delayed_construct<T>> : hash<T> {
175 return hash<optional<T>>{}(
static_cast<const optional<T>&
>(value));
auto operator=(U &&t) -> delayed_construct &
constexpr auto is_constructed() const noexcept -> bool
#define OVERLOAD_DEFER_OP(op)
Provides generic facilities for hashing data, and aliases for standard unordered containers using the...
The main namespace in which all entities from kblib are defined.
constexpr std::size_t operator()(const delayed_construct< T > &key, std::size_t offset=fnv::fnv_offset< std::size_t >::value) const noexcept
The primary template has to exist, but not be constructible, in order to be compatible with std::hash...
The starting value for the FNVa hash algorithm, as a type trait.
auto operator()(const argument_type &value) const noexcept -> std::size_t
Provides macros and basic templates used by the rest of kblib.
#define KBLIB_NODISCARD
This internal macro is used to provide a fallback for [[nodiscard]] in C++14.