RFFGen
 All Classes Namespaces Files Functions Typedefs Enumerations Groups
evaluateIfPresent.hh
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the C++-library RFFGen. */
4 /* Copyright 2015 Lars Lubkoll */
5 /* */
6 /* RFFGen is free software: you can redistribute it and/or modify */
7 /* it under the terms of the GNU General Public License as published by */
8 /* the Free Software Foundation, either version 3 of the License, or */
9 /* (at your option) any later version. */
10 /* */
11 /* RFFGen is distributed in the hope that it will be useful, */
12 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
13 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
14 /* GNU General Public License for more details. */
15 /* */
16 /* You should have received a copy of the GNU General Public License */
17 /* along with RFFGen. If not, see <http://www.gnu.org/licenses/>. */
18 /* */
19 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
20 
21 #ifndef RFFGEN_UTIL_EVALUATE_IF_PRESENT_HH
22 #define RFFGEN_UTIL_EVALUATE_IF_PRESENT_HH
23 
24 #include <type_traits>
25 
26 namespace RFFGen
27 {
31  namespace Detail
32  {
33  template <class X, bool Xpresent>
34  struct EvaluateIfPresentImpl
35  {
36  static constexpr bool present = false;
37  EvaluateIfPresentImpl(X const&){}
38  };
39 
40  template <class X>
41  struct EvaluateIfPresentImpl<X,true>
42  {
43  using ReturnType = std::add_const_t<decltype(std::declval<X>()())>;
44  static constexpr bool present = true;
45 
46  EvaluateIfPresentImpl(X const& x) : value(x())
47  {}
48 
49  ReturnType operator()() const
50  {
51  return value;
52  }
53 
54  ReturnType value;
55  };
56  }
57 
58 
60  template <class X>
61  struct EvaluateIfPresent : public Detail::EvaluateIfPresentImpl<X,X::present>
62  {
63  EvaluateIfPresent(X const& x) : Detail::EvaluateIfPresentImpl<X,X::present> (x)
64  {}
65 
66  template <class... Args>
67  EvaluateIfPresent(const Args&... args) : EvaluateIfPresent( X(args...) )
68  {}
69  };
73 }
74 
75 #endif // RFFGEN_UTIL_EVALUATE_IF_PRESENT_HH