// Copyright (C) 2020 Mikhail Svetkin // Copyright (C) 2019 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef QHTTPSERVERVIEWTRAITS_H #define QHTTPSERVERVIEWTRAITS_H #include QT_BEGIN_NAMESPACE class QHttpServerRequest; class QHttpServerResponse; namespace QtPrivate { template struct AfterRequestViewTraitsHelper : ViewTraits { using VTraits = ViewTraits; using FunctionTraits = typename VTraits::FTraits; static_assert(DisableStaticAssert || FunctionTraits::ArgumentCount == 2 || FunctionTraits::ArgumentCount == 1, "ViewHandler arguments error: " "afterRequest can only accept QHttpServerResponse and QHttpServerRequest"); static_assert(DisableStaticAssert || std::is_same::value, "ViewHandler return type error: " "Return type can only be QHttpServerResponse"); template struct ArgumentChecker { using IsRequest = typename VTraits::template Special; static_assert(IsRequest::AssertCondition, "ViewHandler arguments error: " "QHttpServerRequest can only be passed as a const reference"); using IsResponse = typename VTraits::template Special; static_assert(IsResponse::AssertCondition, "ViewHandler arguments error: " "QHttpServerResponse can only be passed as an rvalue reference"); using IsSpecial = CheckAny; static constexpr bool Valid = IsSpecial::Valid; static constexpr bool StaticAssert = IsSpecial::StaticAssert; }; struct Arguments { template struct ArgumentsReturn { template using Arg = ArgumentChecker; static constexpr bool Valid = (Arg::Valid && ...); static constexpr bool StaticAssert = (Arg::StaticAssert && ...); using Last = Arg; static constexpr std::size_t Count = FunctionTraits::ArgumentCount; }; template static constexpr ArgumentsReturn eval(QtPrivate::IndexesList) noexcept { return ArgumentsReturn{}; } }; }; } // namespace QtPrivate template struct QHttpServerAfterRequestViewTraits { using Helpers = typename QtPrivate::AfterRequestViewTraitsHelper; using Arguments = decltype(Helpers::Arguments::eval(typename Helpers::ArgumentIndexes{})); }; QT_END_NAMESPACE #endif // QHTTPSERVERVIEWTRAITS_H