LeechCraft 0.6.70-14794-g33744ae6ce
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
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
13namespace LC
14{
15namespace 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>
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}
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 size_t Length(List< Args... >)
Definition: dropargs.h:53
constexpr auto GetInvokablePart() -> decltype(GetInvokablePartImpl< F >(0, Typelist< Args... > {}))
Definition: dropargs.h:47
typename Dumbifier< T >::Type_t Dumbify
Definition: dropargs.h:65
constexpr List< T... > Tail(List< H, T... >)
Definition: typelist.h:35
detail::Dropper< F > DropArgs(const F &f)
Definition: dropargs.h:103
constexpr detail::DropImpl< N, List< Args... > >::Result_t Drop(List< Args... >)
Definition: typelist.h:56
std::tuple_element_t< 0, decltype(detail::TypeGetter(*static_cast< F * >(nullptr)))> RetType_t
Definition: typegetter.h:37
constexpr List Reverse(List<>)
Definition: typelist.h:68
Definition: constants.h:15
decltype(GetInvokablePartImpl< F >(0, List {})) RetType_t
Definition: dropargs.h:43