]> AND Private Git Repository - loba.git/blobdiff - process.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Define classes for mutex and condition objects.
[loba.git] / process.h
index 78fc507f963b58491477fc9e2a064efc7685bddf..38a6c42d8e24b9cf3621a9bf299ca98dbe4dd4f4 100644 (file)
--- a/process.h
+++ b/process.h
@@ -4,7 +4,8 @@
 #define USE_UNORDERED_MAP 1
 //#undef USE_UNORDERED_MAP
 
 #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
 #ifdef USE_UNORDERED_MAP
 #  include <tr1/unordered_map>
 #  define MAP_TEMPLATE std::tr1::unordered_map
 #  include <map>
 #  define MAP_TEMPLATE std::map
 #endif
 #  include <map>
 #  define MAP_TEMPLATE std::map
 #endif
+#include <vector>
 #include <msg/msg.h>
 #include <xbt/log.h>
 #include "communicator.h"
 #include <msg/msg.h>
 #include <xbt/log.h>
 #include "communicator.h"
+#include "misc.h"
 #include "neighbor.h"
 #include "options.h"
 
 #include "neighbor.h"
 #include "options.h"
 
@@ -39,6 +42,9 @@ protected:
     pneigh_type pneigh;         // list of pointers to neighbors that
                                 // we are free to reorder
 
     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;
     // Get and set current load, which may be real load, or expected
     // load if opt::bookkeeping is true.
     double get_load() const;
@@ -98,7 +104,9 @@ private:
     void send_all();
 
     // Returns true if there remains neighbors to listen for
     void send_all();
 
     // Returns true if there remains neighbors to listen for
-    bool may_receive() { return ctrl_close_pending || data_close_pending; }
+    bool may_receive() const {
+        return ctrl_close_pending || data_close_pending;
+    }
 
     // Receive procedure
     // Parameter "timeout" may be 0 for non-blocking operation, -1 for
 
     // Receive procedure
     // Parameter "timeout" may be 0 for non-blocking operation, -1 for
@@ -129,6 +137,18 @@ void process::set_load(double load)
         real_load = load;
 }
 
         real_load = 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
 
 // Local variables:
 #endif // !PROCESS_H
 
 // Local variables: