From 9719bf64bb471b8da10e8a5aa419308e8d3b1238 Mon Sep 17 00:00:00 2001 From: Mikhail Svetkin <mikhail.svetkin@gmail.com> Date: Thu, 9 Apr 2020 20:52:01 +0200 Subject: [PATCH] Add dependencies file for Coin Coin by default uses dev branch of qtbase. Add 5.12 qtbase into the dependencies file Change-Id: I849ea65e36c74f153dbd5531c01e3a3b00ab4fef Reviewed-by: Mikhail Svetkin <mikhail.svetkin@gmail.com> --- coin/product_dependencies.yaml | 3 ++ dependencies.yaml | 4 +++ src/httpserver/qhttpserver.h | 2 +- src/httpserver/qhttpserverresponse.h | 4 +-- src/httpserver/qhttpserverrouter.h | 32 ++++++++++++++++--- src/httpserver/qhttpserverrouterrule.h | 2 +- src/httpserver/qhttpserverrouterviewtraits.h | 12 +++---- tests/auto/auto.pro | 1 - .../tst_qhttpserverrouter.cpp | 2 +- 9 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 coin/product_dependencies.yaml create mode 100644 dependencies.yaml diff --git a/coin/product_dependencies.yaml b/coin/product_dependencies.yaml new file mode 100644 index 0000000..6c93ee3 --- /dev/null +++ b/coin/product_dependencies.yaml @@ -0,0 +1,3 @@ +dependencies: + ../../qt/qt5.git: + ref: "5.12" diff --git a/dependencies.yaml b/dependencies.yaml new file mode 100644 index 0000000..6251304 --- /dev/null +++ b/dependencies.yaml @@ -0,0 +1,4 @@ +dependencies: + ../../qt/qtbase: + ref: "7d7afe1d2b1d85ea5221d1d2883c8bf80aa0e927" + required: true diff --git a/src/httpserver/qhttpserver.h b/src/httpserver/qhttpserver.h index 80bad2c..6d754b1 100644 --- a/src/httpserver/qhttpserver.h +++ b/src/httpserver/qhttpserver.h @@ -89,7 +89,7 @@ private: bool routeImpl(Args &&...args, ViewHandler &&viewHandler) { auto routerHandler = [this, viewHandler] ( - QRegularExpressionMatch &match, + const QRegularExpressionMatch &match, const QHttpServerRequest &request, QTcpSocket *socket) mutable { auto boundViewHandler = router()->bindCaptured<ViewHandler, ViewTraits>( diff --git a/src/httpserver/qhttpserverresponse.h b/src/httpserver/qhttpserverresponse.h index 9f5d3dd..3fef112 100644 --- a/src/httpserver/qhttpserverresponse.h +++ b/src/httpserver/qhttpserverresponse.h @@ -95,9 +95,9 @@ public: void addHeaders(QHttpServerResponder::HeaderList headers); template<typename Container> - void addHeaders(const Container &headers) + void addHeaders(const Container &headerList) { - for (const auto &header : headers) + for (const auto &header : headerList) addHeader(header.first, header.second); } diff --git a/src/httpserver/qhttpserverrouter.h b/src/httpserver/qhttpserverrouter.h index a1f4174..c3f7565 100644 --- a/src/httpserver/qhttpserverrouter.h +++ b/src/httpserver/qhttpserverrouter.h @@ -102,7 +102,7 @@ public: template<typename ViewHandler, typename ViewTraits = QHttpServerRouterViewTraits<ViewHandler>> typename ViewTraits::BindableType bindCaptured(ViewHandler &&handler, - QRegularExpressionMatch &match) const + const QRegularExpressionMatch &match) const { return bindCapturedImpl<ViewHandler, ViewTraits>( std::forward<ViewHandler>(handler), @@ -127,13 +127,26 @@ private: bool addRuleImpl(QHttpServerRouterRule *rule, const std::initializer_list<int> &metaTypes); + // template<typename ViewHandler, typename ViewTraits, int ... Cx, int ... Px> + // typename ViewTraits::BindableType bindCapturedImpl(ViewHandler &&handler, + // const QRegularExpressionMatch &match, + // QtPrivate::IndexesList<Cx...>, + // QtPrivate::IndexesList<Px...>) const + // { + // return std::bind( + // std::forward<ViewHandler>(handler), + // QVariant(match.captured(Cx + 1)) + // .value<typename ViewTraits::Arguments::template Arg<Cx>::CleanType>()..., + // QtPrivate::QHttpServerRouterPlaceholder<Px>{}...); + // } + template<typename ViewHandler, typename ViewTraits, int ... Cx, int ... Px> - typename ViewTraits::BindableType bindCapturedImpl(ViewHandler &&handler, - QRegularExpressionMatch &match, + typename std::enable_if<ViewTraits::Arguments::CapturableCount != 0, typename ViewTraits::BindableType>::type + bindCapturedImpl(ViewHandler &&handler, + const QRegularExpressionMatch &match, QtPrivate::IndexesList<Cx...>, QtPrivate::IndexesList<Px...>) const { - return std::bind( std::forward<ViewHandler>(handler), QVariant(match.captured(Cx + 1)) @@ -141,6 +154,17 @@ private: QtPrivate::QHttpServerRouterPlaceholder<Px>{}...); } + template<typename ViewHandler, typename ViewTraits, int ... Cx, int ... Px> + typename std::enable_if<!ViewTraits::Arguments::CapturableCount, typename ViewTraits::BindableType>::type + bindCapturedImpl(ViewHandler &&handler, + const QRegularExpressionMatch &, + QtPrivate::IndexesList<Cx...>, + QtPrivate::IndexesList<Px...>) const + { + return std::bind( + std::forward<ViewHandler>(handler), + QtPrivate::QHttpServerRouterPlaceholder<Px>{}...); + } QScopedPointer<QHttpServerRouterPrivate> d_ptr; }; diff --git a/src/httpserver/qhttpserverrouterrule.h b/src/httpserver/qhttpserverrouterrule.h index 2b168b4..20ad2a2 100644 --- a/src/httpserver/qhttpserverrouterrule.h +++ b/src/httpserver/qhttpserverrouterrule.h @@ -48,7 +48,7 @@ class Q_HTTPSERVER_EXPORT QHttpServerRouterRule Q_DECLARE_PRIVATE(QHttpServerRouterRule) public: - using RouterHandler = std::function<void(QRegularExpressionMatch &, + using RouterHandler = std::function<void(const QRegularExpressionMatch &, const QHttpServerRequest &, QTcpSocket *)>; diff --git a/src/httpserver/qhttpserverrouterviewtraits.h b/src/httpserver/qhttpserverrouterviewtraits.h index 377811c..94fd5cc 100644 --- a/src/httpserver/qhttpserverrouterviewtraits.h +++ b/src/httpserver/qhttpserverrouterviewtraits.h @@ -308,14 +308,12 @@ struct ViewTraitsHelper { using Type = std::function<typename FunctionTraits::ReturnType (Args...)>; }; + template<int Id> + using OffsetArg = typename FunctionTraits::template Arg<CaptureOffset + Id>::Type; + template<int ... Idx> - static constexpr typename FunctionWrapper< - typename FunctionTraits::template Arg<CaptureOffset + Idx>::Type...>::Type - eval(QtPrivate::IndexesList<Idx...>) noexcept - { - return FunctionWrapper< - typename FunctionTraits::template Arg<CaptureOffset + Idx>::Type...>::Type(); - } + static constexpr typename FunctionWrapper<OffsetArg<Idx>...>::Type + eval(QtPrivate::IndexesList<Idx...>) noexcept; }; }; diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index af38d7a..47686ef 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -3,7 +3,6 @@ TEMPLATE = subdirs QT = network SUBDIRS = \ - cmake \ qabstracthttpserver \ qhttpserver \ qhttpserverresponder \ diff --git a/tests/auto/qhttpserverrouter/tst_qhttpserverrouter.cpp b/tests/auto/qhttpserverrouter/tst_qhttpserverrouter.cpp index 5536408..fb0c409 100644 --- a/tests/auto/qhttpserverrouter/tst_qhttpserverrouter.cpp +++ b/tests/auto/qhttpserverrouter/tst_qhttpserverrouter.cpp @@ -57,7 +57,7 @@ struct HttpServer : QAbstractHttpServer { void route(const char *path, const QHttpServerRequest::Methods methods, ViewHandler &&viewHandler) { auto rule = new QHttpServerRouterRule( - path, methods, [this, &viewHandler] (QRegularExpressionMatch &match, + path, methods, [this, &viewHandler] (const QRegularExpressionMatch &match, const QHttpServerRequest &request, QTcpSocket *socket) { auto boundViewHandler = router.bindCaptured<ViewHandler>(