# HG changeset patch
# User Teemu Piippo <teemu@hecknology.net>
# Date 1521818086 -7200
# Node ID 8d22e1dd272d24b5f8c47ef97945c9f45779e042
# Parent  e5c1320e1018828b2d91b83e25a8bc8f805e5dad
ported qOverload to drop minimum Qt requirement down to 5.5

diff -r e5c1320e1018 -r 8d22e1dd272d CMakeLists.txt
--- a/CMakeLists.txt	Fri Mar 23 17:13:35 2018 +0200
+++ b/CMakeLists.txt	Fri Mar 23 17:14:46 2018 +0200
@@ -15,6 +15,10 @@
 find_package (Qt5OpenGL REQUIRED)
 find_package (Qt5Network REQUIRED)
 
+if (Qt5Widgets_VERSION VERSION_LESS 5.5.0)
+	message(FATAL_ERROR "Qt5 version 5.5 required")
+endif()
+
 set (CMAKE_AUTOMOC ON)
 
 find_package (OpenGL REQUIRED)
diff -r e5c1320e1018 -r 8d22e1dd272d src/basics.h
--- a/src/basics.h	Fri Mar 23 17:13:35 2018 +0200
+++ b/src/basics.h	Fri Mar 23 17:14:46 2018 +0200
@@ -32,6 +32,46 @@
 #include "macros.h"
 #include "transform.h"
 
+#if (QT_VERSION < QT_VERSION_CHECK(5, 7, 0))
+template <typename... Args>
+struct QNonConstOverload
+{
+    template <typename R, typename T>
+    Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr)
+    { return ptr; }
+    template <typename R, typename T>
+    static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...)) Q_DECL_NOTHROW -> decltype(ptr)
+    { return ptr; }
+};
+template <typename... Args>
+struct QConstOverload
+{
+    template <typename R, typename T>
+    Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...) const) const Q_DECL_NOTHROW -> decltype(ptr)
+    { return ptr; }
+    template <typename R, typename T>
+    static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...) const) Q_DECL_NOTHROW -> decltype(ptr)
+    { return ptr; }
+};
+template <typename... Args>
+struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
+{
+    using QConstOverload<Args...>::of;
+    using QConstOverload<Args...>::operator();
+    using QNonConstOverload<Args...>::of;
+    using QNonConstOverload<Args...>::operator();
+    template <typename R>
+    Q_DECL_CONSTEXPR auto operator()(R (*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr)
+    { return ptr; }
+    template <typename R>
+    static Q_DECL_CONSTEXPR auto of(R (*ptr)(Args...)) Q_DECL_NOTHROW -> decltype(ptr)
+    { return ptr; }
+};
+template <typename... Args> Q_CONSTEXPR Q_DECL_UNUSED QOverload<Args...> qOverload = {};
+template <typename... Args> Q_CONSTEXPR Q_DECL_UNUSED QConstOverload<Args...> qConstOverload = {};
+template <typename... Args> Q_CONSTEXPR Q_DECL_UNUSED QNonConstOverload<Args...> qNonConstOverload = {};
+#endif
+
 class Matrix;
 using GLRotationMatrix = QMatrix4x4;
 
@@ -445,3 +485,14 @@
 	else
 		flagset &= ~static_cast<T>(Flag);
 }
+
+/*
+ * Returns a singleton of type T, useful for providing a valid but unused
+ * pointer.
+ */
+template<typename T>
+inline T& sink()
+{
+	static T result;
+	return result;
+}