Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use std::vector instead of plain arrays in smpi_topo.
[simgrid.git] / src / smpi / mpi / smpi_topo.cpp
index b55b0e3..82bfd74 100644 (file)
@@ -1,10 +1,10 @@
-/* Copyright (c) 2014-2017. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2014-2019. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "smpi/smpi.h"
-#include "private.h"
+#include "private.hpp"
 #include "smpi_comm.hpp"
 #include "smpi_topo.hpp"
 #include "xbt/sysdep.h"
@@ -19,35 +19,12 @@ static int getfactors(int num, int *nfators, int **factors);
 namespace simgrid{
 namespace smpi{
 
-Topo_Graph::~Topo_Graph()
-{
-  delete[] index_;
-  delete[] edges_;
-}
-
-Topo_Dist_Graph::~Topo_Dist_Graph()
-{
-  delete[] in_;
-  delete[] in_weights_;
-  delete[] out_;
-  delete[] out_weights_;
-}
-
 /*******************************************************************************
  * Cartesian topologies
  ******************************************************************************/
-Topo_Cart::~Topo_Cart()
-{
-  delete[] dims_;
-  delete[] periodic_;
-  delete[] position_;
-}
 
-Topo_Cart::Topo_Cart(int ndims) : ndims_(ndims)
+Topo_Cart::Topo_Cart(int ndims) : ndims_(ndims), dims_(ndims), periodic_(ndims), position_(ndims)
 {
-  dims_ = new int[ndims];
-  periodic_ = new int[ndims];
-  position_ = new int[ndims];
 }
 
 /* reorder is ignored, don't know what would be the consequences of a dumb reordering but neither do I see the point of
@@ -70,7 +47,7 @@ Topo_Cart::Topo_Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], in
     oldGroup = comm_old->group();
     newGroup = new  Group(newSize);
     for (int i = 0 ; i < newSize ; i++) {
-      newGroup->set_mapping(oldGroup->index(i), i);
+      newGroup->set_mapping(oldGroup->actor(i), i);
     }
 
     nnodes_ = newSize;
@@ -94,7 +71,7 @@ Topo_Cart::Topo_Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], in
       *comm_cart = MPI_COMM_NULL;
     }
   }
-  comm_=*comm_cart;
+  setComm(*comm_cart);
 }
 
 Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) {
@@ -112,8 +89,8 @@ Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) {
   }
 
   if (newNDims > 0) {
-    newDims = xbt_new(int, newNDims);
-    newPeriodic = xbt_new(int, newNDims);
+    newDims     = new int[newNDims];
+    newPeriodic = new int[newNDims];
 
     // that should not segfault
     int j = 0;
@@ -125,7 +102,10 @@ Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) {
       }
     }
   }
-  return new Topo_Cart(comm_, newNDims, newDims, newPeriodic, 0, newcomm);
+  Topo_Cart* res = new Topo_Cart(getComm(), newNDims, newDims, newPeriodic, 0, newcomm);
+  delete[] newDims;
+  delete[] newPeriodic;
+  return res;
 }
 
 int Topo_Cart::coords(int rank, int maxdims, int coords[]) {
@@ -195,7 +175,7 @@ int Topo_Cart::shift(int direction, int disp, int *rank_source, int *rank_dest)
     return MPI_ERR_DIMS;
   }
 
-  this->coords(comm_->rank(),ndims_, position);
+  this->coords(getComm()->rank(), ndims_, position);
   position[direction] += disp;
 
   if(position[direction] < 0 ||