LeechCraft 0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
typegetter.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 <tuple>
12
13namespace LC::Util
14{
15 namespace detail
16 {
17 template<typename R, typename... Args>
18 std::tuple<R, Args...>* TypeGetter (R (*) (Args...));
19
20 template<typename F>
21 auto TypeGetter (F&& f) -> decltype (TypeGetter (+f));
22
23 template<typename C, typename R, typename... Args>
24 std::tuple<R, const C, Args...>* TypeGetter (R (C::*) (Args...) const);
25
26 template<typename C, typename R, typename... Args>
27 std::tuple<R, C, Args...>* TypeGetter (R (C::*) (Args...));
28
29 template<typename C, typename R>
30 std::tuple<R, C>* TypeGetter (R (C::*));
31
32 template<typename C, typename R, typename... Args>
33 std::tuple<R, Args...>* TypeGetterNoClass (R (C::*) (Args...) const);
34
35 template<typename C, typename R, typename... Args>
36 std::tuple<R, Args...>* TypeGetterNoClass (R (C::*) (Args...));
37
38 template<typename C>
39 decltype (TypeGetterNoClass (&C::operator ())) TypeGetter (const C& c);
40
41 template<typename F>
42 using CallTypeGetter_t = std::decay_t<decltype (*detail::TypeGetter (*static_cast<F*> (nullptr)))>;
43 }
44
45 template<typename F>
46 concept SomeInvokable = requires (F f) { detail::TypeGetter (f); };
47
48 template<SomeInvokable F, size_t Idx>
49 using ArgType_t = std::tuple_element_t<Idx + 1, detail::CallTypeGetter_t<F>>;
50
51 template<SomeInvokable F>
52 using RetType_t = std::tuple_element_t<0, detail::CallTypeGetter_t<F>>;
53
54 template<SomeInvokable F>
55 inline constexpr auto ArgCount_v = std::tuple_size_v<detail::CallTypeGetter_t<F>> - 1;
56
57 namespace detail
58 {
59 template<typename>
61 {
62 };
63
64 template<typename R, typename C>
65 struct DecomposeMemberPtr<R (C::*)>
66 {
67 using Value_t = R;
68 using StructType_t = C;
69 };
70 }
71
72 template<typename PtrType>
74
75 template<typename PtrType>
77
78 template<auto Ptr>
79 using MemberPtrType_t = MemberTypeType_t<decltype (Ptr)>;
80
81 template<auto Ptr>
82 using MemberPtrStruct_t = MemberTypeStruct_t<decltype (Ptr)>;
83}
std::tuple< R, Args... > * TypeGetter(R(*)(Args...))
std::decay_t< decltype(*detail::TypeGetter(*static_cast< F * >(nullptr)))> CallTypeGetter_t
Definition typegetter.h:42
std::tuple< R, Args... > * TypeGetterNoClass(R(C::*)(Args...) const)
std::tuple_element_t< 0, detail::CallTypeGetter_t< F > > RetType_t
Definition typegetter.h:52
constexpr auto ArgCount_v
Definition typegetter.h:55
typename detail::DecomposeMemberPtr< PtrType >::Value_t MemberTypeType_t
Definition typegetter.h:73
MemberTypeType_t< decltype(Ptr)> MemberPtrType_t
Definition typegetter.h:79
std::tuple_element_t< Idx+1, detail::CallTypeGetter_t< F > > ArgType_t
Definition typegetter.h:49
MemberTypeStruct_t< decltype(Ptr)> MemberPtrStruct_t
Definition typegetter.h:82
typename detail::DecomposeMemberPtr< PtrType >::StructType_t MemberTypeStruct_t
Definition typegetter.h:76