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>(