Foundation
Loading...
Searching...
No Matches
Functional.hpp
Go to the documentation of this file.
1#pragma once
2#include <variant>
3namespace Foundation::Bits {
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
Header-only convenience utilities.
Definition Chrono.hpp:3
std::unique_ptr< T, StlDeleter< T > > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:161
Extended std::variant with C++23 visit() behavior and convenience Get()/GetIf() methods.
Definition Functional.hpp:17
auto Visit(Visitors &&... visitors)
Definition Functional.hpp:23
auto VisitDefault(Visitors &&... visitors)
Definition Functional.hpp:32
constexpr const T & Get() const
Definition Functional.hpp:48
constexpr T & Get()
Definition Functional.hpp:42
auto VisitDefault(Visitors &&... visitors) const
Definition Functional.hpp:36
constexpr const T * GetIf() const
Definition Functional.hpp:60
auto Visit(Visitors &&... visitors) const
Definition Functional.hpp:27
constexpr T * GetIf()
Definition Functional.hpp:54