From 7a349a948532446fe0a8a61afd783c58ba4269c2 Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Fri, 14 Oct 2016 15:19:53 +0200
Subject: [PATCH] [Base] Re-implemented reorderVector and its unit test

---
 BaseLib/reorderVector.h             | 16 ++++++----------
 Tests/BaseLib/TestreorderVector.cpp | 21 +++++++++++++++------
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/BaseLib/reorderVector.h b/BaseLib/reorderVector.h
index 9b541a5575f..7ec30155fb4 100644
--- a/BaseLib/reorderVector.h
+++ b/BaseLib/reorderVector.h
@@ -17,23 +17,19 @@
 namespace BaseLib
 {
 /**
- * Reorder a vector by a given index vector.
- *  From
- *  <a href="reorderV">http://stackoverflow.com/questions/838384/reorder-vector-using-a-vector-of-indices</a>
+ *  Reorder a vector by a given index vector.
  *
- *  Note: The simple version on that page is taken, which is good enough in performance
- *        for medium size vectors.
+ *  Note: It is good enough in performance for medium size vectors.
  */
 template <typename ValueType, typename IndexType>
 void reorderVector(std::vector<ValueType>& v,
                    std::vector<IndexType> const& order)
 {
-    for (std::size_t s = 1, d; s < order.size(); ++s)
+    std::vector<ValueType> temp_v = v;
+
+    for (std::size_t i=0; i<order.size(); i++)
     {
-        for (d = order[s]; d < s; d = order[d]);
-        if (d == s)
-            while (d = order[d], d != s)
-                std::swap(v[s], v[d]);
+        v[i] =  temp_v[order[i]];
     }
 }
 
diff --git a/Tests/BaseLib/TestreorderVector.cpp b/Tests/BaseLib/TestreorderVector.cpp
index 4bc4f104695..3ed1029b4cc 100644
--- a/Tests/BaseLib/TestreorderVector.cpp
+++ b/Tests/BaseLib/TestreorderVector.cpp
@@ -12,6 +12,8 @@
  */
 
 #include <vector>
+#include <algorithm>
+#include <numeric>
 
 #include <gtest/gtest.h>
 
@@ -19,12 +21,19 @@
 
 TEST(BaseLib_reorderVector, testreorderVector)
 {
-    std::vector<double> vec {2016.0, 1996.0, 2006.0, 1986.0};
-    std::vector<int> order {3, 1, 2, 0};
+    const std::size_t size = 100;
+    std::vector<double> vec(size);
+    std::generate(vec.begin(), vec.end(), std::rand);
+    std::vector<double> vec0 = vec;
+
+    std::vector<int> order(size);
+    std::iota(order.begin(), order.end(), 0);
+    std::random_shuffle(order.begin(), order.end());
+
     BaseLib::reorderVector(vec, order);
 
-    EXPECT_EQ(1986.0, vec[0]);
-    EXPECT_EQ(1996.0, vec[1]);
-    EXPECT_EQ(2006.0, vec[2]);
-    EXPECT_EQ(2016.0, vec[3]);
+    for (std::size_t i= 0; i<size; i++)
+    {
+        EXPECT_EQ(vec0[order[i]], vec[i]);
+    }
 }
-- 
GitLab