1// Copyright (C) 2020 Mikhail Svetkin <mikhail.svetkin@gmail.com>
2// Copyright (C) 2019 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4
5#ifndef QHTTPSERVERVIEWTRAITS_IMPL_H
6#define QHTTPSERVERVIEWTRAITS_IMPL_H
7
8#include <QtCore/qglobal.h>
9#include <QtCore/qmetatype.h>
10#include <QtCore/qnamespace.h>
11#include <QtCore/qobjectdefs.h>
12
13#include <tuple>
14#include <type_traits>
15
16QT_BEGIN_NAMESPACE
17
18namespace QtPrivate {
19
20template<typename ReturnT, typename... Args>
21struct FunctionTraitsHelper
22{
23 static constexpr const int ArgumentCount = sizeof ... (Args);
24 static constexpr const int ArgumentIndexMax = ArgumentCount - 1;
25 using ReturnType = ReturnT;
26
27 template <int I>
28 struct Arg {
29 using Type = typename std::tuple_element<I, std::tuple<Args...>>::type;
30
31 using CleanType = q20::remove_cvref_t<Type>;
32
33 static constexpr bool CopyConstructible = std::is_copy_constructible_v<CleanType>;
34 };
35};
36
37template<typename T>
38struct FunctionTraitsImpl;
39
40template<typename T>
41struct FunctionTraitsImpl : public FunctionTraitsImpl<decltype(&T::operator())>
42{
43};
44
45template<typename ReturnT, typename... Args>
46struct FunctionTraitsImpl<ReturnT (*)(Args...)> : public FunctionTraitsHelper<ReturnT, Args...>
47{
48};
49
50template<typename ReturnT, typename ClassT, typename... Args>
51struct FunctionTraitsImpl<ReturnT (ClassT::*)(Args...)>
52 : public FunctionTraitsHelper<ReturnT, Args...>
53{
54};
55
56template<typename ReturnT, typename ClassT, typename... Args>
57struct FunctionTraitsImpl<ReturnT (ClassT::*)(Args...) const>
58 : public FunctionTraitsHelper<ReturnT, Args...>
59{
60};
61
62template<typename T>
63using FunctionTraits = FunctionTraitsImpl<std::decay_t<T>>;
64
65template<typename ... T>
66struct CheckAny {
67 static constexpr bool Value = (T::Value || ...);
68 static constexpr bool Valid = (T::Valid || ...);
69 static constexpr bool StaticAssert = (T::StaticAssert || ...);
70};
71
72template<typename ViewHandler, bool DisableStaticAssert>
73struct ViewTraits {
74 using FTraits = FunctionTraits<ViewHandler>;
75 using ArgumentIndexes = typename Indexes<FTraits::ArgumentCount>::Value;
76
77 template<int I, typename Special>
78 struct SpecialHelper {
79 using Arg = typename FTraits::template Arg<I>;
80 using CleanSpecialT = q20::remove_cvref_t<Special>;
81
82 static constexpr bool TypeMatched = std::is_same<typename Arg::CleanType, CleanSpecialT>::value;
83 static constexpr bool TypeCVRefMatched = std::is_same<typename Arg::Type, Special>::value;
84
85 static constexpr bool ValidPosition =
86 (I == FTraits::ArgumentIndexMax ||
87 I == FTraits::ArgumentIndexMax - 1);
88 static constexpr bool ValidAll = TypeCVRefMatched && ValidPosition;
89
90 static constexpr bool AssertCondition =
91 DisableStaticAssert || !TypeMatched || TypeCVRefMatched;
92
93 static constexpr bool AssertConditionOrder =
94 DisableStaticAssert || !TypeMatched || ValidPosition;
95
96 static constexpr bool StaticAssert = AssertCondition && AssertConditionOrder;
97
98 static_assert(AssertConditionOrder,
99 "ViewHandler arguments error: "
100 "QHttpServerRequest or QHttpServerResponder"
101 " can only be the last argument");
102 };
103
104 template<int I, typename T>
105 struct Special {
106 using Helper = SpecialHelper<I, T>;
107 static constexpr bool Value = Helper::TypeMatched;
108 static constexpr bool Valid = Helper::ValidAll;
109 static constexpr bool StaticAssert = Helper::StaticAssert;
110 static constexpr bool AssertCondition = Helper::AssertCondition;
111 };
112};
113
114} // namespace QtPrivate
115
116QT_END_NAMESPACE
117
118#endif // QHTTPSERVERVIEWTRAITS_IMPL_H
119

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

source code of qthttpserver/src/httpserver/qhttpserverviewtraits_impl.h