LeechCraft  0.6.70-15082-g543737046d
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, 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 }
LC::Util::detail::DecomposeMemberPtr
Definition: typegetter.h:48
LC::Util
Definition: icoreproxy.h:33
LC::Util::MemberPtrType_t
MemberTypeType_t< decltype(Ptr)> MemberPtrType_t
Definition: typegetter.h:67
LC::Util::MemberTypeStruct_t
typename detail::DecomposeMemberPtr< PtrType >::StructType_t MemberTypeStruct_t
Definition: typegetter.h:64
LC::Util::MemberTypeType_t
typename detail::DecomposeMemberPtr< PtrType >::Value_t MemberTypeType_t
Definition: typegetter.h:61
LC::Util::ArgType_t
std::tuple_element_t< Idx+1, decltype(detail::TypeGetter(*static_cast< F * >(nullptr)))> ArgType_t
Definition: typegetter.h:40
LC::Util::detail::TypeGetter
decltype(TypeGetter(&C::operator())) TypeGetter(const C &c)
Definition: typegetter.h:42
LC::Util::oral::sph::f
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
Definition: oral.h:952
LC::Util::MemberPtrStruct_t
MemberTypeStruct_t< decltype(Ptr)> MemberPtrStruct_t
Definition: typegetter.h:70
LC::Util::RetType_t
std::tuple_element_t< 0, decltype(detail::TypeGetter(*static_cast< F * >(nullptr)))> RetType_t
Definition: typegetter.h:43