@@ -37,20 +37,45 @@ struct StructField
37
37
}
38
38
Struct& m_struct;
39
39
40
- // clang-format off
41
- template <typename A = Accessor> auto get () const -> decltype(A::get(this ->m_struct)) { return A::get (this ->m_struct ); }
42
- template <typename A = Accessor> auto has () const -> std::enable_if_t<A::optional, bool> { return A::getHas (m_struct); }
43
- template <typename A = Accessor> auto has () const -> std::enable_if_t<!A::optional && A::boxed, bool> { return A::has (m_struct); }
44
- template <typename A = Accessor> auto has () const -> std::enable_if_t<!A::optional && !A::boxed, bool> { return true ; }
45
- template <typename A = Accessor> auto want () const -> std::enable_if_t<A::requested, bool> { return A::getWant (m_struct); }
46
- template <typename A = Accessor> auto want () const -> std::enable_if_t<!A::requested, bool> { return true ; }
47
- template <typename A = Accessor, typename ... Args> decltype (auto ) set(Args&&... args) const { return A::set (this ->m_struct , std::forward<Args>(args)...); }
48
- template <typename A = Accessor, typename ... Args> decltype (auto ) init(Args&&... args) const { return A::init (this ->m_struct , std::forward<Args>(args)...); }
49
- template <typename A = Accessor> auto setHas () const -> std::enable_if_t<A::optional> { return A::setHas (m_struct); }
50
- template <typename A = Accessor> auto setHas () const -> std::enable_if_t<!A::optional> { }
51
- template <typename A = Accessor> auto setWant () const -> std::enable_if_t<A::requested> { return A::setWant (m_struct); }
52
- template <typename A = Accessor> auto setWant () const -> std::enable_if_t<!A::requested> { }
53
- // clang-format on
40
+ decltype (auto ) get() const { return Accessor::get (this ->m_struct ); }
41
+
42
+ bool has () const {
43
+ if constexpr (Accessor::optional) {
44
+ return Accessor::getHas (m_struct);
45
+ } else if constexpr (Accessor::boxed) {
46
+ return Accessor::has (m_struct);
47
+ } else {
48
+ return true ;
49
+ }
50
+ }
51
+
52
+ bool want () const {
53
+ if constexpr (Accessor::requested) {
54
+ return Accessor::getWant (m_struct);
55
+ } else {
56
+ return true ;
57
+ }
58
+ }
59
+
60
+ template <typename ... Args> decltype (auto ) set(Args &&...args) const {
61
+ return Accessor::set (this ->m_struct , std::forward<Args>(args)...);
62
+ }
63
+
64
+ template <typename ... Args> decltype (auto ) init(Args &&...args) const {
65
+ return Accessor::init (this ->m_struct , std::forward<Args>(args)...);
66
+ }
67
+
68
+ void setHas () const {
69
+ if constexpr (Accessor::optional) {
70
+ Accessor::setHas (m_struct);
71
+ }
72
+ }
73
+
74
+ void setWant () const {
75
+ if constexpr (Accessor::requested) {
76
+ Accessor::setWant (m_struct);
77
+ }
78
+ }
54
79
};
55
80
56
81
@@ -650,19 +675,14 @@ void clientInvoke(ProxyClient& proxy_client, const GetRequest& get_request, Fiel
650
675
// ! return value with value of `ret()`. This is useful for avoiding code
651
676
// ! duplication and branching in generic code that forwards calls to functions.
652
677
template <typename Fn, typename Ret>
653
- auto ReplaceVoid (Fn&& fn, Ret&& ret) ->
654
- std::enable_if_t<std::is_same_v<void, decltype(fn())>, decltype(ret())>
678
+ auto ReplaceVoid (Fn&& fn, Ret&& ret)
655
679
{
656
- fn ();
657
- return ret ();
658
- }
659
-
660
- // ! Overload of above for non-void `fn()` case.
661
- template <typename Fn, typename Ret>
662
- auto ReplaceVoid (Fn&& fn, Ret&& ret) ->
663
- std::enable_if_t<!std::is_same_v<void, decltype(fn())>, decltype(fn())>
664
- {
665
- return fn ();
680
+ if constexpr (std::is_same_v<decltype (fn ()), void >) {
681
+ fn ();
682
+ return ret ();
683
+ } else {
684
+ return fn ();
685
+ }
666
686
}
667
687
668
688
extern std::atomic<int > server_reqs;
0 commit comments