Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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  namespace details {
9 
10 #if __cplusplus > 201402L
11 
12  // C++17 version: https://godbolt.org/g/YdcvGg
13  template <typename... lambda_ts>
14  struct overloaded_t : lambda_ts... {
15  using lambda_ts::operator()...;
16  };
17  template <typename... lambda_ts>
18  overloaded_t( lambda_ts... )->overloaded_t<lambda_ts...>;
19 
20 #else
21 
22  template <typename... lambda_ts>
23  struct overloaded_t;
24 
25  template <typename lambda_t>
26  struct overloaded_t<lambda_t> : lambda_t {
27  overloaded_t( const lambda_t& lambda ) : lambda_t{lambda} {}
28  overloaded_t( lambda_t&& lambda ) : lambda_t{std::move( lambda )} {}
29 
30  using lambda_t::operator();
31  };
32 
33  template <typename lambda_t, typename... more_lambda_ts>
34  struct overloaded_t<lambda_t, more_lambda_ts...> : lambda_t, overloaded_t<more_lambda_ts...> {
35  using super_t = overloaded_t<more_lambda_ts...>;
36 
37  template <typename... lambda_ts>
38  overloaded_t( const lambda_t& lambda, lambda_ts&&... more_lambdas )
39  : lambda_t{lambda}, super_t{std::forward<lambda_ts>( more_lambdas )...} {}
40  template <typename... lambda_ts>
41  overloaded_t( lambda_t&& lambda, lambda_ts&&... more_lambdas )
42  : lambda_t{std::move( lambda )}, super_t{std::forward<lambda_ts>( more_lambdas )...} {}
43 
44  using lambda_t::operator();
45  using super_t:: operator();
46  };
47 #endif
48  } // namespace details
49 
50  //
51  // Create an object with an overloaded call operator by 'composing'/'joining'
52  // a set of callables (such as lambdas)
53  //
54  // see eg. the example at http://en.cppreference.com/w/cpp/utility/variant/visit
55  // for an example of why this is usefull
56  //
57  template <typename... lambda_ts>
58  auto overload( lambda_ts&&... lambdas ) {
59 #if __cplusplus > 201402L
60  return details::overloaded_t{std::forward<lambda_ts>( lambdas )...};
61 #else
62  return details::overloaded_t<std::decay_t<lambda_ts>...>{std::forward<lambda_ts>( lambdas )...};
63 #endif
64  }
65 } // namespace Gaudi
66 
67 // for backwards compatibility
68 // [[deprecated("please use Gaudi::overload instead of compose")]]
69 template <typename... lambda_ts>
70 auto compose( lambda_ts&&... lambdas ) {
71  return Gaudi::overload( std::forward<lambda_ts>( lambdas )... );
72 }
73 
74 #endif
overloaded_t(lambda_t &&lambda, lambda_ts &&...more_lambdas)
Definition: compose.h:41
overloaded_t(const lambda_t &lambda, lambda_ts &&...more_lambdas)
Definition: compose.h:38
overloaded_t(const lambda_t &lambda)
Definition: compose.h:27
T move(T...args)
auto overload(lambda_ts &&...lambdas)
Definition: compose.h:58
auto compose(lambda_ts &&...lambdas)
Definition: compose.h:70
Helper functions to set/get the application return code.
Definition: __init__.py:1