Foundation
Loading...
Searching...
No Matches
Variant.hpp
Go to the documentation of this file.
1#pragma once
2#include <variant>
3namespace Foundation::Core {
5 template <typename ...T> struct Visitor : T... {
6 using T::operator()...;
7 };
8 template <typename ...T> struct VisitorDefault : T... {
9 using T::operator()...;
10 template<typename Arg> requires (!std::is_invocable_v<T, Arg&> && ...) auto operator()(Arg&) { /* nop */ };
11 };
17 template<typename ...Args> struct Variant : public std::variant<Args...> {
18 using std::variant<Args...>::variant;
19 using std::variant<Args...>::operator=;
20
21 // C++23 visit() behavior
22 template<typename ...Visitors>
23 auto Visit(Visitors&&... visitors) {
24 return std::visit(Visitor{ std::forward<Visitors>(visitors)... }, *this);
25 }
26 template<typename ...Visitors>
27 auto Visit(Visitors&&... visitors) const {
28 return std::visit(Visitor{ std::forward<Visitors>(visitors)... }, *this);
29 }
30 // C++23 visit() behavior with default no-op visitor.
31 template<typename ...Visitors>
33 return std::visit(VisitorDefault{ std::forward<Visitors>(visitors)... }, *this);
34 }
35 template<typename ...Visitors>
36 auto VisitDefault(Visitors&&... visitors) const {
37 return std::visit(VisitorDefault{ std::forward<Visitors>(visitors)... }, *this);
38 }
39
40 // std::get<T>
41 template<typename T>
42 constexpr T& Get() {
43 return std::get<T>(*this);
44 }
45
46 // std::get<T>
47 template<typename T>
48 [[nodiscard]] constexpr const T& Get() const {
49 return std::get<T>(*this);
50 }
51
52 // std::get_if<T>
53 template<typename T>
54 constexpr T* GetIf() {
55 return std::get_if<T>(this);
56 }
57
58 // std::get_if<T>
59 template<typename T>
60 [[nodiscard]] constexpr const T* GetIf() const {
61 return std::get_if<T>(this);
62 }
63 };
64}
65
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:5
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:149
Extended std::variant with C++23 visit() behavior and convenience Get()/GetIf() methods.
Definition Variant.hpp:17
constexpr T * GetIf()
Definition Variant.hpp:54
auto VisitDefault(Visitors &&... visitors) const
Definition Variant.hpp:36
auto Visit(Visitors &&... visitors)
Definition Variant.hpp:23
constexpr const T & Get() const
Definition Variant.hpp:48
constexpr const T * GetIf() const
Definition Variant.hpp:60
auto Visit(Visitors &&... visitors) const
Definition Variant.hpp:27
auto VisitDefault(Visitors &&... visitors)
Definition Variant.hpp:32
constexpr T & Get()
Definition Variant.hpp:42