LeechCraft 0.6.70-14794-g33744ae6ce
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, Args...> TypeGetter (R (C::*) (Args...) const);
25
26 template<typename C, typename R, typename... Args>
27 std::tuple<R, Args...> TypeGetter (R (C::*) (Args...));
28
29 template<typename C>
30 decltype (TypeGetter (&C::operator ())) TypeGetter (const C& c);
31 }
32
33 template<typename F, size_t Idx>
34 using ArgType_t = std::tuple_element_t<Idx + 1, decltype (detail::TypeGetter (*static_cast<F*> (nullptr)))>;
35
36 template<typename F>
37 using RetType_t = std::tuple_element_t<0, decltype (detail::TypeGetter (*static_cast<F*> (nullptr)))>;
38
39 namespace detail
40 {
41 template<typename>
43 {
44 };
45
46 template<typename R, typename C>
47 struct DecomposeMemberPtr<R (C::*)>
48 {
49 using Value_t = R;
50 using StructType_t = C;
51 };
52 }
53
54 template<typename PtrType>
56
57 template<typename PtrType>
59
60 template<auto Ptr>
61 using MemberPtrType_t = MemberTypeType_t<decltype (Ptr)>;
62
63 template<auto Ptr>
64 using MemberPtrStruct_t = MemberTypeStruct_t<decltype (Ptr)>;
65}
decltype(TypeGetter(&C::operator())) TypeGetter(const C &c)
Definition: typegetter.h:30
typename detail::DecomposeMemberPtr< PtrType >::StructType_t MemberTypeStruct_t
Definition: typegetter.h:58
MemberTypeStruct_t< decltype(Ptr)> MemberPtrStruct_t
Definition: typegetter.h:64
std::tuple_element_t< 0, decltype(detail::TypeGetter(*static_cast< F * >(nullptr)))> RetType_t
Definition: typegetter.h:37
typename detail::DecomposeMemberPtr< PtrType >::Value_t MemberTypeType_t
Definition: typegetter.h:55
std::tuple_element_t< Idx+1, decltype(detail::TypeGetter(*static_cast< F * >(nullptr)))> ArgType_t
Definition: typegetter.h:34
MemberTypeType_t< decltype(Ptr)> MemberPtrType_t
Definition: typegetter.h:61