LeechCraft  0.6.70-16373-g319c272718
Modular cross-platform feature rich live environment.
dropargs.h
Go to the documentation of this file.
1 /**********************************************************************
2  * LeechCraft - modular cross-platform feature rich internet client.
3  * Copyright (C) 2006-2014 Georg Rudoy
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7  **********************************************************************/
8 
9 #pragma once
10 
11 #include "typelist.h"
12 
13 namespace LC
14 {
15 namespace Util
16 {
17  namespace detail
18  {
19  template<typename F, template<typename...> class List, typename... Args>
20  constexpr List<Args...> GetInvokablePartImpl (int, List<Args...>, typename std::result_of<F (Args...)>::type* = nullptr)
21  {
22  return {};
23  }
24 
25  template<typename F, template<typename...> class List>
26  constexpr Typelist<> GetInvokablePartImpl (float, List<>)
27  {
28  return {};
29  }
30 
31  template<typename F, typename List>
32  struct InvokableType;
33 
34  template<typename F, template<typename...> class List, typename... Args>
36  {
37  return {};
38  }
39 
40  template<typename F, typename List>
41  struct InvokableType
42  {
43  using RetType_t = decltype (GetInvokablePartImpl<F> (0, List {}));
44  };
45 
46  template<typename F, typename... Args>
47  constexpr auto GetInvokablePart () -> decltype (GetInvokablePartImpl<F> (0, Typelist<Args...> {}))
48  {
49  return {};
50  }
51 
52  template<template<typename...> class List, typename... Args>
53  constexpr size_t Length (List<Args...>)
54  {
55  return sizeof... (Args);
56  }
57 
58  template<typename T>
59  struct Dumbifier
60  {
61  using Type_t = T;
62  };
63 
64  template<typename T>
65  using Dumbify = typename Dumbifier<T>::Type_t;
66 
67  template<typename F, typename List>
69 
70  template<typename F, template<typename...> class List, typename... Args>
71  struct InvokableResGetter<F, List<Args...>>
72  {
73  using RetType_t = std::result_of_t<F (Args...)>;
74  };
75 
76  template<typename F>
77  class Dropper
78  {
79  F F_;
80  public:
81  Dropper (const F& f)
82  : F_ (f)
83  {
84  }
85 
86  template<typename... Args>
87  auto operator() (Args... args) -> typename InvokableResGetter<F, decltype (GetInvokablePart<F, Args...> ())>::RetType_t
88  {
89  auto invokableList = GetInvokablePart<F, Args...> ();
90  auto ignoreList = Drop<Length (decltype (invokableList) {})> (Typelist<Args...> {});
91  return Invoke (invokableList, ignoreList, args...);
92  }
93  private:
94  template<typename... InvokableArgs, typename... Rest>
95  auto Invoke (Typelist<InvokableArgs...>, Typelist<Rest...>, Dumbify<InvokableArgs>... args, Dumbify<Rest>...) -> std::result_of_t<F (InvokableArgs...)>
96  {
97  return F_ (std::forward<InvokableArgs> (args)...);
98  }
99  };
100  }
101 
102  template<typename F>
104  {
105  return detail::Dropper<F> { f };
106  }
107 }
108 }
typename Dumbifier< T >::Type_t Dumbify
Definition: dropargs.h:65
constexpr auto GetInvokablePart() -> decltype(GetInvokablePartImpl< F >(0, Typelist< Args... >
Definition: dropargs.h:47
decltype(GetInvokablePartImpl< F >(0, List {})) RetType_t
Definition: dropargs.h:43
detail::Dropper< F > DropArgs(const F &f)
Definition: dropargs.h:103
constexpr size_t Length(List< Args... >)
Definition: dropargs.h:53
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
Definition: oral.h:951
auto operator()(Args... args) -> typename InvokableResGetter< F, decltype(GetInvokablePart< F, Args... >())>::RetType_t
Definition: dropargs.h:87
constexpr List< Args... > GetInvokablePartImpl(int, List< Args... >, typename std::result_of< F(Args...)>::type *=nullptr)
Definition: dropargs.h:20
constexpr detail::DropImpl< N, List< Args... > >::Result_t Drop(List< Args... >)
Definition: typelist.h:56
std::tuple_element_t< 0, detail::CallTypeGetter_t< F > > RetType_t
Definition: typegetter.h:43