From 490e8736022ed2185198818f124fc9d17ba6da2b Mon Sep 17 00:00:00 2001
From: "alexey.lysiuk" <alexey.lysiuk@gmail.com>
Date: Sat, 15 Jul 2017 12:16:06 +0300
Subject: [PATCH] Moved parallel_for() function template to own header file

---
 src/gl/textures/gl_hqresize.cpp | 39 +---------------
 src/parallel_for.h              | 79 +++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 38 deletions(-)
 create mode 100644 src/parallel_for.h

diff --git a/src/gl/textures/gl_hqresize.cpp b/src/gl/textures/gl_hqresize.cpp
index 62825777c..aa3065441 100644
--- a/src/gl/textures/gl_hqresize.cpp
+++ b/src/gl/textures/gl_hqresize.cpp
@@ -46,44 +46,7 @@
 #include "gl/xbr/xbrz.h"
 #include "gl/xbr/xbrz_old.h"
 
-#ifdef HAVE_PARALLEL_FOR
-
-#include <ppl.h>
-
-template <typename Index, typename Function>
-inline void parallel_for(const Index count, const Index step, const Function& function)
-{
-	concurrency::parallel_for(0, count, step, function);
-}
-
-#elif defined HAVE_DISPATCH_APPLY
-
-#include <dispatch/dispatch.h>
-
-template <typename Index, typename Function>
-inline void parallel_for(const Index count, const Index step, const Function& function)
-{
-	const dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
-
-	dispatch_apply(count / step + 1, queue, ^(size_t sliceY)
-	{
-		function(sliceY * step);
-	});
-}
-
-#else
-
-template <typename Index, typename Function>
-inline void parallel_for(const Index count, const Index step, const Function& function)
-{
-#pragma omp parallel for
-	for (Index i = 0; i < count; i += step)
-	{
-		function(i);
-	}
-}
-
-#endif // HAVE_PARALLEL_FOR
+#include "parallel_for.h"
 
 CUSTOM_CVAR(Int, gl_texture_hqresize, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL)
 {
diff --git a/src/parallel_for.h b/src/parallel_for.h
new file mode 100644
index 000000000..d3e0e5de0
--- /dev/null
+++ b/src/parallel_for.h
@@ -0,0 +1,79 @@
+//
+//---------------------------------------------------------------------------
+//
+// Copyright(C) 2017 Alexey Lysiuk
+// All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program.  If not, see http://www.gnu.org/licenses/
+//
+//--------------------------------------------------------------------------
+//
+
+#pragma once
+
+#ifndef PARALLEL_FOR_H_INCLUDED
+#define PARALLEL_FOR_H_INCLUDED
+
+#ifdef HAVE_PARALLEL_FOR
+
+#include <ppl.h>
+
+template <typename Index, typename Function>
+inline void parallel_for(const Index first, const Index last, const Index step, const Function& function)
+{
+	concurrency::parallel_for(first, last, step, function);
+}
+
+#elif defined HAVE_DISPATCH_APPLY
+
+#include <dispatch/dispatch.h>
+
+template <typename Index, typename Function>
+inline void parallel_for(const Index first, const Index last, const Index step, const Function& function)
+{
+	const dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
+
+	dispatch_apply((last - first) / step + 1, queue, ^(size_t slice)
+	{
+		function(slice * step);
+	});
+}
+
+#else // Generic loop with optional OpenMP parallelization
+
+template <typename Index, typename Function>
+inline void parallel_for(const Index first, const Index last, const Index step, const Function& function)
+{
+#pragma omp parallel for
+	for (Index i = first; i < last; i += step)
+	{
+		function(i);
+	}
+}
+
+#endif // HAVE_PARALLEL_FOR
+
+template <typename Index, typename Function>
+inline void parallel_for(const Index count, const Function& function)
+{
+	parallel_for(0, count, 1, function);
+}
+
+template <typename Index, typename Function>
+inline void parallel_for(const Index count, const Index step, const Function& function)
+{
+	parallel_for(0, count, step, function);
+}
+
+#endif // PARALLEL_FOR_H_INCLUDED