LeechCraft  0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
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 
13 namespace 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>
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>
80 
81  template<auto Ptr>
83 }
std::decay_t< decltype(*detail::TypeGetter(*static_cast< F * >(nullptr)))> CallTypeGetter_t
Definition: typegetter.h:42
decltype(TypeGetterNoClass(&C::operator())) TypeGetter(const C &c)
Definition: typegetter.h:39
constexpr auto ArgCount_v
Definition: typegetter.h:55
typename detail::DecomposeMemberPtr< PtrType >::StructType_t MemberTypeStruct_t
Definition: typegetter.h:76
STL namespace.
MemberTypeType_t< decltype(Ptr)> MemberPtrType_t
Definition: typegetter.h:79
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptrs... > > tuple
Definition: oral.h:1086
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
Definition: oral.h:1083
concept SomeInvokable
Definition: typegetter.h:46
requires(Tup1Size==Tup2Size) const expr auto ZipWith(Tup1 &&tup1
typename detail::DecomposeMemberPtr< PtrType >::Value_t MemberTypeType_t
Definition: typegetter.h:73
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
std::tuple< R, Args... > * TypeGetterNoClass(R(C::*)(Args...) const)
std::tuple_element_t< 0, detail::CallTypeGetter_t< F > > RetType_t
Definition: typegetter.h:52