From: Arnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Date: Mon, 7 Feb 2011 09:58:35 +0000 (+0100)
Subject: Define process::pneigh_sort_by_load().
X-Git-Tag: v0.1~167
X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/commitdiff_plain/51909edd89ccd195ba335606743a650807123999

Define process::pneigh_sort_by_load().
---

diff --git a/loba_fairstrategy.cpp b/loba_fairstrategy.cpp
index 552f060..5530f5a 100644
--- a/loba_fairstrategy.cpp
+++ b/loba_fairstrategy.cpp
@@ -1,4 +1,3 @@
-#include <algorithm>
 #include <xbt/log.h>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
@@ -9,7 +8,7 @@ void loba_fairstrategy::load_balance()
 {
     const double delta = 0.001;
 
-    std::sort(pneigh.begin(), pneigh.end(), pneigh_load_greater());
+    pneigh_sort_by_load(std::greater<double>());
 
     print_loads_p(false, xbt_log_priority_debug);
 
diff --git a/loba_makhoul.cpp b/loba_makhoul.cpp
index 7309e6c..bbf855f 100644
--- a/loba_makhoul.cpp
+++ b/loba_makhoul.cpp
@@ -1,4 +1,3 @@
-#include <algorithm>
 #include <xbt/log.h>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
@@ -7,7 +6,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
 
 void loba_makhoul::load_balance()
 {
-    std::sort(pneigh.begin(), pneigh.end(), pneigh_load_less());
+    pneigh_sort_by_load(std::less<double>());
 
     print_loads_p(false, xbt_log_priority_debug);
 
diff --git a/process.h b/process.h
index 152f5ed..38a6c42 100644
--- a/process.h
+++ b/process.h
@@ -4,7 +4,8 @@
 #define USE_UNORDERED_MAP 1
 //#undef USE_UNORDERED_MAP
 
-#include <vector>
+#include <algorithm>
+#include <tr1/functional>
 #ifdef USE_UNORDERED_MAP
 #  include <tr1/unordered_map>
 #  define MAP_TEMPLATE std::tr1::unordered_map
@@ -12,6 +13,7 @@
 #  include <map>
 #  define MAP_TEMPLATE std::map
 #endif
+#include <vector>
 #include <msg/msg.h>
 #include <xbt/log.h>
 #include "communicator.h"
@@ -40,6 +42,9 @@ protected:
     pneigh_type pneigh;         // list of pointers to neighbors that
                                 // we are free to reorder
 
+    template <typename Compare>
+    void pneigh_sort_by_load(const Compare& comp);
+
     // Get and set current load, which may be real load, or expected
     // load if opt::bookkeeping is true.
     double get_load() const;
@@ -132,19 +137,17 @@ void process::set_load(double load)
         real_load = load;
 }
 
-struct pneigh_load_less {
-    bool operator()(const neighbor* a, const neighbor* b)
-    {
-        return a->get_load() < b->get_load();
-    }
-};
-
-struct pneigh_load_greater {
-    bool operator()(const neighbor* a, const neighbor* b)
-    {
-        return a->get_load() > b->get_load();
-    }
-};
+template <typename Compare>
+void process::pneigh_sort_by_load(const Compare& comp)
+{
+    using std::tr1::bind;
+    using std::tr1::placeholders::_1;
+    using std::tr1::placeholders::_2;
+    std::sort(pneigh.begin(), pneigh.end(),
+              bind(comp,
+                   bind(&neighbor::get_load, _1),
+                   bind(&neighbor::get_load, _2)));
+}
 
 #endif // !PROCESS_H