Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
introduce simgrid_get_all_hosts
[simgrid.git] / src / s4u / s4u_Engine.cpp
index c30e3ef..65ef3a1 100644 (file)
@@ -23,6 +23,7 @@
 #include "surf/surf.hpp" // routing_platf. FIXME:KILLME. SOON
 #include <simgrid/Exception.hpp>
 
+#include <algorithm>
 #include <string>
 
 XBT_LOG_NEW_CATEGORY(s4u, "Log channels of the S4U (Simgrid for you) interface");
@@ -438,3 +439,20 @@ int simgrid_get_actor_count()
 {
   return simgrid::s4u::Engine::get_instance()->get_actor_count();
 }
+
+void simgrid_get_all_hosts(size_t* host_count, sg_host_t** hosts)
+{
+  simgrid::s4u::Engine* e               = simgrid::s4u::Engine::get_instance();
+  *host_count                           = e->get_host_count();
+  std::vector<simgrid::s4u::Host*> list = e->get_all_hosts();
+
+  auto last = std::remove_if(begin(list), end(list), [](const simgrid::s4u::Host* host) {
+    return not host || not host->get_netpoint() || not host->get_netpoint()->is_host();
+  });
+  std::sort(begin(list), last,
+            [](const simgrid::s4u::Host* a, const simgrid::s4u::Host* b) { return a->get_name() < b->get_name(); });
+
+  *hosts = static_cast<sg_host_t*>(xbt_malloc(sizeof(sg_host_t) * (*host_count)));
+  for (size_t i = 0; i < *host_count; i++)
+    (*hosts)[i] = list[i];
+}