/**************************************************************************** ** ** Copyright (C) 2020 Mikhail Svetkin ** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtHttpServer module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QHTTPSERVERROUTERVIEWTRAITS_H #define QHTTPSERVERROUTERVIEWTRAITS_H #include QT_BEGIN_NAMESPACE class QHttpServerRequest; class QHttpServerResponder; namespace QtPrivate { template struct RouterViewTraitsHelper : ViewTraits { using VTraits = ViewTraits; using FunctionTraits = typename VTraits::FTraits; template struct ArgumentChecker : FunctionTraits::template Arg { using IsRequest = typename VTraits::template Special; static_assert(IsRequest::AssertCondition, "ViewHandler arguments error: " "QHttpServerRequest can only be passed as a const reference"); using IsResponder = typename VTraits::template Special; static_assert(IsResponder::AssertCondition, "ViewHandler arguments error: " "QHttpServerResponder can only be passed as a universal reference"); using IsSpecial = CheckAny; struct IsSimple { static constexpr bool Value = !IsSpecial::Value && I < FunctionTraits::ArgumentCount && FunctionTraits::ArgumentIndexMax != -1; static constexpr bool Valid = FunctionTraits::template Arg::Defined; static constexpr bool StaticAssert = DisableStaticAssert || !Value || Valid; static_assert(StaticAssert, "ViewHandler arguments error: " "Type is not registered, please use the Q_DECLARE_METATYPE macro " "to make it known to Qt's meta-object system"); }; using CheckOk = CheckAny; static constexpr bool Valid = CheckOk::Valid; static constexpr bool StaticAssert = CheckOk::StaticAssert; }; struct Arguments { template struct ArgumentsReturn { template using Arg = ArgumentChecker; template static constexpr int metaTypeId() noexcept { using Type = typename FunctionTraits::template Arg::CleanType; return qMetaTypeId< typename std::conditional< QMetaTypeId2::Defined, Type, void>::type>(); } static constexpr std::size_t Count = FunctionTraits::ArgumentCount; static constexpr std::size_t CapturableCount = StaticMath::Sum::eval( static_cast(FunctionTraits::template Arg::Defined)...); static constexpr std::size_t PlaceholdersCount = Count - CapturableCount; static constexpr bool Valid = StaticMath::And::eval(Arg::Valid...); static constexpr bool StaticAssert = StaticMath::And::eval(Arg::StaticAssert...); using Indexes = typename QtPrivate::IndexesList; using CapturableIndexes = typename QtPrivate::Indexes::Value; using PlaceholdersIndexes = typename QtPrivate::Indexes::Value; using Last = Arg; }; template static constexpr ArgumentsReturn eval(QtPrivate::IndexesList) noexcept { return ArgumentsReturn{}; } }; template struct BindType { template struct FunctionWrapper { using Type = std::function; }; template using OffsetArg = typename FunctionTraits::template Arg::Type; template static constexpr typename FunctionWrapper...>::Type eval(QtPrivate::IndexesList) noexcept; }; }; } // namespace QtPrivate template struct QHttpServerRouterViewTraits { using Helpers = typename QtPrivate::RouterViewTraitsHelper; using ReturnType = typename Helpers::FunctionTraits::ReturnType; using Arguments = decltype(Helpers::Arguments::eval(typename Helpers::ArgumentIndexes{})); using BindableType = decltype( Helpers::template BindType::eval( typename Arguments::PlaceholdersIndexes{})); }; QT_END_NAMESPACE #endif // QHTTPSERVERROUTERVIEWTRAITS_H