13#ifndef IOX2_INCLUDE_GUARD_BB_STL_OPTIONAL_HPP
14#define IOX2_INCLUDE_GUARD_BB_STL_OPTIONAL_HPP
56 bool m_is_empty =
true;
67 : m_u_value(std::move(value))
72 if (!rhs.m_is_empty) {
79 if (!rhs.m_is_empty) {
81 set(std::move(rhs.m_u_value));
104 if (rhs.m_is_empty) {
108 set(std::move(rhs.m_u_value));
118 constexpr auto set(T
const& value) ->
void {
122 new (&m_u_value) T { value };
129 constexpr auto set(T&& value) ->
void {
133 new (&m_u_value) T { std::move(value) };
136 m_u_value = std::move(value);
152 return std::move(m_u_value);
157 return std::move(m_u_value);
192 template <
typename U = std::remove_cv_t<T>,
193 std::enable_if_t<std::is_constructible<T, U>::value && !std::is_same<std::decay_t<U>, Optional<T>>::value
194 && !std::is_same<std::decay_t<U>, NulloptT>::value,
198 : m_value(std::forward<U>(value)) {
201 template <
typename... Args>
202 constexpr auto emplace(Args&&... args)
noexcept -> T& {
207 m_value.
set(std::forward<Args>(args)...);
233 constexpr auto operator*() const& noexcept -> const T& {
236 "Optional::has_value()",
237 "Trying to access the value on an empty Optional!");
244 "Optional::has_value()",
245 "Trying to access the value on an empty Optional!");
252 "Optional::has_value()",
253 "Trying to access the value on an empty Optional!");
254 return std::move(m_value).unchecked_get();
257 constexpr auto operator*() const&& noexcept -> const T&& {
260 "Optional::has_value()",
261 "Trying to access the value on an empty Optional!");
262 return std::move(m_value).unchecked_get();
265 constexpr explicit operator bool() const noexcept {
276 location, has_value(),
"Optional::has_value()",
"Trying to access the value on an empty Optional!");
282 location, has_value(),
"Optional::has_value()",
"Trying to access the value on an empty Optional!");
288 location, has_value(),
"Optional::has_value()",
"Trying to access the value on an empty Optional!");
289 return std::move(m_value).unchecked_get();
295 location, has_value(),
"Optional::has_value()",
"Trying to access the value on an empty Optional!");
296 return std::move(m_value).unchecked_get();
299 template <
class U = std::remove_cv_t<T>>
300 constexpr auto value_or(U&& fallback)
const& -> T {
302 return std::forward<U>(fallback);
308 template <
class U = std::remove_cv_t<T>>
311 return std::forward<U>(fallback);
313 return std::move(m_value).unchecked_get();
318 constexpr auto reset() noexcept ->
void {
324 return !lhs.has_value();
327 return !rhs.has_value();
330 return lhs.has_value();
333 return rhs.has_value();
339 if (lhs.has_value() != rhs.has_value()) {
341 }
else if (lhs.has_value()) {
342 return lhs.value() == rhs.value();
350 if (lhs.has_value() != rhs.has_value()) {
352 }
else if (lhs.has_value()) {
353 return lhs.value() != rhs.value();
359#if __cplusplus >= 201703L
#define IOX2_ENFORCE_INTERNAL(location, condition, stringified_condition, message)
Only for internal usage.
#define IOX2_CONSTEXPR_DTOR
A drop-in replacement for C++17 std::optional.
constexpr auto has_value() const noexcept -> bool
constexpr Optional(const NulloptT &) noexcept
constexpr auto value_or(U &&fallback) const &-> T
constexpr auto operator=(NulloptT &) noexcept -> Optional &
constexpr auto value(const bb::detail::SourceLocation location=bb::detail::SourceLocation::current()) &-> T &
friend auto operator!=(NulloptT, const Optional< T > &rhs) noexcept -> bool
constexpr auto value(const bb::detail::SourceLocation location=bb::detail::SourceLocation::current()) const &-> const T &
constexpr auto operator*() &noexcept -> T &
constexpr auto operator=(Optional &&rhs) -> Optional &=default
constexpr auto operator->() noexcept -> T *
constexpr Optional(const Optional &rhs)=default
constexpr auto reset() noexcept -> void
IOX2_CONSTEXPR_DTOR ~Optional()=default
constexpr auto operator*() const &noexcept -> const T &
friend auto operator==(const Optional< T > &lhs, NulloptT) noexcept -> bool
constexpr Optional() noexcept
constexpr auto emplace(Args &&... args) noexcept -> T &
friend auto operator!=(const Optional< T > &lhs, NulloptT) noexcept -> bool
constexpr auto value(const bb::detail::SourceLocation location=bb::detail::SourceLocation::current()) &&-> T &&
constexpr Optional(Optional &&rhs)=default
constexpr auto value_or(U &&fallback) &&-> T
constexpr auto operator->() const noexcept -> const T *
friend auto operator==(NulloptT, const Optional< T > &rhs) noexcept -> bool
constexpr auto operator*() &&noexcept -> T &&
constexpr auto operator=(const Optional &rhs) -> Optional &=default
constexpr Optional(U &&value)
constexpr auto operator*() const &&noexcept -> const T &&
constexpr auto value(const bb::detail::SourceLocation location=bb::detail::SourceLocation::current()) const &&-> const T &&
IOX2_CONSTEXPR_DTOR ~OptionalValueHolder()
constexpr auto unchecked_get() const &-> T const &
constexpr OptionalValueHolder() noexcept
constexpr auto reset() -> void
constexpr auto unchecked_get() &&-> T &&
constexpr OptionalValueHolder(T &&value)
std::remove_cv_t< T > m_u_value
constexpr OptionalValueHolder(OptionalValueHolder &&rhs) noexcept(std::is_nothrow_move_constructible< T >::value)
constexpr OptionalValueHolder(OptionalValueHolder const &rhs)
constexpr OptionalValueHolder(T const &value)
constexpr auto set(T const &value) -> void
constexpr auto set(T &&value) -> void
constexpr auto is_empty() const -> bool
constexpr auto unchecked_get() const &&-> T const &&
constexpr auto operator=(OptionalValueHolder const &rhs) -> OptionalValueHolder &
constexpr auto unchecked_get() &-> T &
constexpr auto operator=(OptionalValueHolder &&rhs) noexcept(std::is_nothrow_move_assignable< T >::value) -> OptionalValueHolder &
auto operator!=(const Optional< T > &lhs, const Optional< T > &rhs) noexcept -> bool
constexpr NulloptT NULLOPT
auto operator==(const Optional< T > &lhs, const Optional< T > &rhs) noexcept -> bool
iox2::bb::variation::Optional< T > Optional
A drop-in replacement for C++17 std::nullopt_t for use with Optional.
constexpr NulloptT(detail::NulloptTConstructorTag) noexcept
NulloptTConstructorTag() noexcept=default