roar
Loading...
Searching...
No Matches
flexible_provider.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <variant>
6#include <functional>
7#include <type_traits>
8#include <optional>
9
10namespace Roar
11{
12 namespace Detail
13 {
14 template <bool Optional, typename... Retrievers>
16 {
17 using type = std::variant<Retrievers...>;
18 };
19 template <typename... Retrievers>
20 struct MakeVariantFromRetrievers<true, Retrievers...>
21 {
22 using type = std::variant<std::monostate, Retrievers...>;
23 };
24 template <bool Optional, typename... Retrievers>
25 using MakeVariantFromRetrievers_v = typename MakeVariantFromRetrievers<Optional, Retrievers...>::type;
26 }
27
28 template <typename HolderClassT, typename T, bool Optional = false>
30 Optional,
31 std::function<T(HolderClassT&)>,
32 std::function<T const&(HolderClassT&)>,
33 T const& (HolderClassT::*)(),
34 T const& (HolderClassT::*)() const,
35 T (HolderClassT::*)(),
36 T (HolderClassT::*)() const,
37 T HolderClassT::*,
38 T>;
39
40 template <typename HolderClassT, typename T, bool Optional>
42 {
43 static std::optional<T> getValue(HolderClassT& holder, FlexibleProvider<HolderClassT, T, true> const& provider)
44 {
45 return std::visit(
47 [](std::monostate) -> std::optional<T> {
48 return std::nullopt;
49 },
50 [&holder](std::function<T(HolderClassT&)> const& fn) -> std::optional<T> {
51 return fn(holder);
52 },
53 [&holder](std::function<T const&(HolderClassT&)> const& fn) -> std::optional<T> {
54 return fn(holder);
55 },
56 [&holder](T const& (HolderClassT::*fn)()) -> std::optional<T> {
57 return (holder.*fn)();
58 },
59 [&holder](T const& (HolderClassT::*fn)() const) -> std::optional<T> {
60 return (holder.*fn)();
61 },
62 [&holder](T (HolderClassT::*fn)()) -> std::optional<T> {
63 return (holder.*fn)();
64 },
65 [&holder](T (HolderClassT::*fn)() const) -> std::optional<T> {
66 return (holder.*fn)();
67 },
68 [&holder](T HolderClassT::*mem) -> std::optional<T> {
69 return holder.*mem;
70 },
71 [](T value) -> std::optional<T> {
72 return value;
73 },
74 },
75 provider);
76 }
77 };
78 template <typename HolderClassT, typename T>
79 struct FlexibleProviderUnwrapper<HolderClassT, T, false>
80 {
81 static T getValue(HolderClassT& holder, FlexibleProvider<HolderClassT, T, false> const& provider)
82 {
83 return std::visit(
85 [&holder](std::function<T(HolderClassT&)> const& fn) -> T {
86 return fn(holder);
87 },
88 [&holder](std::function<T const&(HolderClassT&)> const& fn) -> T {
89 return fn(holder);
90 },
91 [&holder](T const& (HolderClassT::*fn)()) -> T {
92 return (holder.*fn)();
93 },
94 [&holder](T const& (HolderClassT::*fn)() const) -> T {
95 return (holder.*fn)();
96 },
97 [&holder](T (HolderClassT::*fn)()) -> T {
98 return (holder.*fn)();
99 },
100 [&holder](T (HolderClassT::*fn)() const) -> T {
101 return (holder.*fn)();
102 },
103 [&holder](T HolderClassT::*mem) -> T {
104 return holder.*mem;
105 },
106 [](T value) -> T {
107 return value;
108 },
109 },
110 provider);
111 }
112 };
113
114 template <typename HolderClassT, typename T>
115 std::optional<T>
116 unwrapFlexibleProvider(HolderClassT& holder, FlexibleProvider<HolderClassT, T, true> const& flexibleProvider)
117 {
118 return FlexibleProviderUnwrapper<HolderClassT, T, true>::getValue(holder, flexibleProvider);
119 }
120
121 template <typename HolderClassT, typename T>
122 T unwrapFlexibleProvider(HolderClassT& holder, FlexibleProvider<HolderClassT, T, false> const& flexibleProvider)
123 {
125 }
126}
typename MakeVariantFromRetrievers< Optional, Retrievers... >::type MakeVariantFromRetrievers_v
Definition flexible_provider.hpp:25
Definition authorization.hpp:10
std::optional< T > unwrapFlexibleProvider(HolderClassT &holder, FlexibleProvider< HolderClassT, T, true > const &flexibleProvider)
Definition flexible_provider.hpp:116
Detail::MakeVariantFromRetrievers_v< Optional, std::function< T(HolderClassT &)>, std::function< T const &(HolderClassT &)>, T const &(HolderClassT::*)(), T const &(HolderClassT::*)() const, T(HolderClassT::*)(), T(HolderClassT::*)() const, T HolderClassT::*, T > FlexibleProvider
Definition flexible_provider.hpp:38
std::variant< std::monostate, Retrievers... > type
Definition flexible_provider.hpp:22
Definition flexible_provider.hpp:16
std::variant< Retrievers... > type
Definition flexible_provider.hpp:17
static T getValue(HolderClassT &holder, FlexibleProvider< HolderClassT, T, false > const &provider)
Definition flexible_provider.hpp:81
Definition flexible_provider.hpp:42
static std::optional< T > getValue(HolderClassT &holder, FlexibleProvider< HolderClassT, T, true > const &provider)
Definition flexible_provider.hpp:43
Definition overloaded.hpp:7