1 /* Copyright (c) 2010-2018. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #ifndef SMPI_GROUP_HPP_INCLUDED
8 #define SMPI_GROUP_HPP_INCLUDED
10 #include "smpi_f2c.hpp"
11 #include <smpi/smpi.h>
18 class Group : public F2C{
21 /* This is actually a map from int to int. We could use
22 * std::map here, but looking up a value there costs O(log(n)).
23 * For a vector, this costs O(1). We hence go with the vector.
25 std::vector<simgrid::s4u::ActorPtr> rank_to_actor_map_;
26 std::map<simgrid::s4u::ActorPtr, int> actor_to_rank_map_;
27 std::vector<int> index_to_rank_map_;
32 explicit Group(int size);
33 explicit Group(Group* origin);
35 void set_mapping(simgrid::s4u::ActorPtr actor, int rank);
37 simgrid::s4u::ActorPtr actor(int rank);
38 int rank(const simgrid::s4u::ActorPtr process);
40 static void unref(MPI_Group group);
42 int compare(MPI_Group group2);
43 int incl(int n, int* ranks, MPI_Group* newgroup);
44 int excl(int n, int *ranks, MPI_Group * newgroup);
45 int group_union(MPI_Group group2, MPI_Group* newgroup);
46 int intersection(MPI_Group group2, MPI_Group* newgroup);
47 int difference(MPI_Group group2, MPI_Group* newgroup);
48 int range_incl(int n, int ranges[][3], MPI_Group * newgroup);
49 int range_excl(int n, int ranges[][3], MPI_Group * newgroup);
51 static Group* f2c(int id);