Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
constify MPI_Group*
[simgrid.git] / src / smpi / include / smpi_group.hpp
index f22bf4e..e033edc 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2013-2017. The SimGrid Team.
+/* Copyright (c) 2010-2019. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -16,41 +16,37 @@ namespace simgrid{
 namespace smpi{
 
 class Group : public F2C{
-  private:
-    int size_;
-    /* This is actually a map from int to int. We could use
-     * std::map here, but looking up a value there costs O(log(n)).
-     * For a vector, this costs O(1). We hence go with the vector.
-     */
-    std::vector<simgrid::s4u::ActorPtr> rank_to_actor_map_;
-    std::map<simgrid::s4u::ActorPtr, int> actor_to_rank_map_;
-    std::vector<int> rank_to_index_map_;
-    std::vector<int> index_to_rank_map_;
-
-    int refcount_;
-  public:
-    explicit Group();
-    explicit Group(int size);
-    explicit Group(Group* origin);
-
-    void set_mapping(simgrid::s4u::ActorPtr actor, int rank);
-    int rank(int index);
-    simgrid::s4u::ActorPtr actor(int rank);
-    int rank(const simgrid::s4u::ActorPtr process);
-    void ref();
-    static void unref(MPI_Group group);
-    int size();
-    int compare(MPI_Group group2);
-    int incl(int n, int* ranks, MPI_Group* newgroup);
-    int excl(int n, int *ranks, MPI_Group * newgroup);
-    int group_union(MPI_Group group2, MPI_Group* newgroup);
-    int intersection(MPI_Group group2, MPI_Group* newgroup);
-    int difference(MPI_Group group2, MPI_Group* newgroup);
-    int range_incl(int n, int ranges[][3], MPI_Group * newgroup);
-    int range_excl(int n, int ranges[][3], MPI_Group * newgroup);
-
-    static Group* f2c(int id);
-
+  int size_ = 0;
+  /* This is actually a map from int to int. We could use std::map here, but looking up a value there costs O(log(n)).
+   * For a vector, this costs O(1). We hence go with the vector.
+   */
+  std::vector<s4u::ActorPtr> rank_to_actor_map_;
+  std::map<s4u::ActorPtr, int> actor_to_rank_map_;
+  std::vector<int> index_to_rank_map_;
+
+  int refcount_ = 1; /* refcount_: start > 0 so that this group never gets freed */
+public:
+  Group() = default;
+  explicit Group(int size) : size_(size), rank_to_actor_map_(size, nullptr), index_to_rank_map_(size, MPI_UNDEFINED) {}
+  explicit Group(Group* origin);
+
+  void set_mapping(s4u::ActorPtr actor, int rank);
+  int rank(int index);
+  s4u::ActorPtr actor(int rank);
+  int rank(const s4u::ActorPtr process);
+  void ref();
+  static void unref(MPI_Group group);
+  int size() { return size_; }
+  int compare(MPI_Group group2);
+  int incl(int n, const int* ranks, MPI_Group* newgroup);
+  int excl(int n, const int* ranks, MPI_Group* newgroup);
+  int group_union(MPI_Group group2, MPI_Group* newgroup);
+  int intersection(MPI_Group group2, MPI_Group* newgroup);
+  int difference(MPI_Group group2, MPI_Group* newgroup);
+  int range_incl(int n, int ranges[][3], MPI_Group* newgroup);
+  int range_excl(int n, int ranges[][3], MPI_Group* newgroup);
+
+  static Group* f2c(int id);
 };
 }
 }