The Gaudi Framework  v30r3 (a5ef0a68)
compose.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_COMPOSE_H
2 #define GAUDIKERNEL_COMPOSE_H
3 
4 #include <utility> // std::forward, std::move (objects)
5 
6 namespace Gaudi
7 {
8 
9  namespace details
10  {
11 
12 #if __cplusplus > 201402L
13 
14  // C++17 version: https://godbolt.org/g/YdcvGg
15  template <typename... lambda_ts>
16  struct overloaded_t : lambda_ts... {
17  using lambda_ts::operator()...;
18  };
19  template <typename... lambda_ts>
20  overloaded_t( lambda_ts... )->overloaded_t<lambda_ts...>;
21 
22 #else
23 
24  template <typename... lambda_ts>
25  struct overloaded_t;
26 
27  template <typename lambda_t>
28  struct overloaded_t<lambda_t> : lambda_t {
29  overloaded_t( const lambda_t& lambda ) : lambda_t{lambda} {}
30  overloaded_t( lambda_t&& lambda ) : lambda_t{std::move( lambda )} {}
31 
32  using lambda_t::operator();
33  };
34 
35  template <typename lambda_t, typename... more_lambda_ts>
36  struct overloaded_t<lambda_t, more_lambda_ts...> : lambda_t, overloaded_t<more_lambda_ts...> {
37  using super_t = overloaded_t<more_lambda_ts...>;
38 
39  template <typename... lambda_ts>
40  overloaded_t( const lambda_t& lambda, lambda_ts&&... more_lambdas )
41  : lambda_t{lambda}, super_t{std::forward<lambda_ts>( more_lambdas )...}
42  {
43  }
44  template <typename... lambda_ts>
45  overloaded_t( lambda_t&& lambda, lambda_ts&&... more_lambdas )
46  : lambda_t{std::move( lambda )}, super_t{std::forward<lambda_ts>( more_lambdas )...}
47  {
48  }
49 
50  using lambda_t::operator();
51  using super_t::operator();
52  };
53 #endif
54  }
55 
56  //
57  // Create an object with an overloaded call operator by 'composing'/'joining'
58  // a set of callables (such as lambdas)
59  //
60  // see eg. the example at http://en.cppreference.com/w/cpp/utility/variant/visit
61  // for an example of why this is usefull
62  //
63  template <typename... lambda_ts>
64  auto overload( lambda_ts&&... lambdas )
65  {
66 #if __cplusplus > 201402L
67  return details::overloaded_t{std::forward<lambda_ts>( lambdas )...};
68 #else
69  return details::overloaded_t<std::decay_t<lambda_ts>...>{std::forward<lambda_ts>( lambdas )...};
70 #endif
71  }
72 }
73 
74 // for backwards compatibility
75 // [[deprecated("please use Gaudi::overload instead of compose")]]
76 template <typename... lambda_ts>
77 auto compose( lambda_ts&&... lambdas )
78 {
79  return Gaudi::overload( std::forward<lambda_ts>( lambdas )... );
80 }
81 
82 #endif
overloaded_t(lambda_t &&lambda, lambda_ts &&...more_lambdas)
Definition: compose.h:45
overloaded_t(const lambda_t &lambda, lambda_ts &&...more_lambdas)
Definition: compose.h:40
overloaded_t(const lambda_t &lambda)
Definition: compose.h:29
T move(T...args)
auto overload(lambda_ts &&...lambdas)
Definition: compose.h:64
auto compose(lambda_ts &&...lambdas)
Definition: compose.h:77
Helper functions to set/get the application return code.
Definition: __init__.py:1