LeechCraft  0.6.70-15082-g543737046d
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>
35  constexpr auto GetInvokablePartImpl (float, List<Args...> list) -> typename InvokableType<F, decltype (Reverse (Tail (Reverse (list))))>::RetType_t
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>
68  struct InvokableResGetter;
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>
103  detail::Dropper<F> DropArgs (const F& f)
104  {
105  return detail::Dropper<F> { f };
106  }
107 }
108 }
typelist.h
LC::Util::detail::Dumbify
typename Dumbifier< T >::Type_t Dumbify
Definition: dropargs.h:83
LC::Util::detail::Dropper::operator()
auto operator()(Args... args) -> typename InvokableResGetter< F, decltype(GetInvokablePart< F, Args... >())>::RetType_t
Definition: dropargs.h:105
LC::Util::detail::Length
constexpr size_t Length(List< Args... >)
Definition: dropargs.h:71
LC::Util::Reverse
constexpr List Reverse(List<>)
Definition: typelist.h:80
LC::Util::DropArgs
detail::Dropper< F > DropArgs(const F &f)
Definition: dropargs.h:115
LC::Util::detail::GetInvokablePartImpl
constexpr List< Args... > GetInvokablePartImpl(int, List< Args... >, typename std::result_of< F(Args...)>::type *=nullptr)
Definition: dropargs.h:38
LC::Util::Typelist
Definition: typelist.h:30
LC::Util::Tail
constexpr List< T... > Tail(List< H, T... >)
Definition: typelist.h:47
LC::Util::detail::GetInvokablePart
constexpr auto GetInvokablePart() -> decltype(GetInvokablePartImpl< F >(0, Typelist< Args... >
Definition: dropargs.h:65
LC::Util::Drop
constexpr detail::DropImpl< N, List< Args... > >::Result_t Drop(List< Args... >)
Definition: typelist.h:68
LC::Util::detail::Dropper
Definition: dropargs.h:95
LC
Definition: constants.h:14
LC::Util::detail::InvokableResGetter
Definition: dropargs.h:86
LC::Util::oral::sph::f
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
Definition: oral.h:952
LC::Util::detail::Dropper::Dropper
Dropper(const F &f)
Definition: dropargs.h:99
LC::Util::detail::Dumbifier::Type_t
T Type_t
Definition: dropargs.h:79
LC::Util::RetType_t
std::tuple_element_t< 0, decltype(detail::TypeGetter(*static_cast< F * >(nullptr)))> RetType_t
Definition: typegetter.h:43