LeviLamina
Loading...
Searching...
No Matches
EventVariantImpl.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4#include "mc/world/events/details/ValueOrRef.h"
5
6template <typename... Xs>
8 using variant_t = std::variant<Details::ValueOrRef<Xs>...>;
9
10public:
11 template <typename T>
12 EventVariantImpl(std::reference_wrapper<T> event) : variant_{std::in_place_type<Details::ValueOrRef<T>>, event} {}
13
15 : variant_(const_cast<EventVariantImpl&>(other).visit([](auto&& arg) -> variant_t {
16 using T = std::remove_reference_t<decltype(arg.value())>;
17 if constexpr (std::is_const_v<T>) {
18 return variant_t{std::in_place_type<Details::ValueOrRef<T>>, std::cref(arg.value())};
19 } else {
20 return variant_t{std::in_place_type<Details::ValueOrRef<T>>, std::ref(arg.value())};
21 }
22 })) {}
23
24 template <typename F>
25 auto visit(F&& visitor) {
26 return std::visit(std::forward<F>(visitor), variant_);
27 }
28
29 template <typename F>
30 auto visit(F&& visitor) const {
31 return std::visit(std::forward<F>(visitor), variant_);
32 }
33
34private:
35 variant_t variant_;
36};
37
38template <typename... Events>
40
41template <typename... Events>
42using MutableEventVariant = EventVariantImpl<Events...>;
Definition EventVariantImpl.h:7