Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use std::vector.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 9 Jun 2020 11:40:03 +0000 (13:40 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 12 Jun 2020 11:40:30 +0000 (13:40 +0200)
src/smpi/include/smpi_datatype.hpp
src/smpi/mpi/smpi_datatype.cpp
src/smpi/mpi/smpi_datatype_derived.cpp

index 467162e..470e760 100644 (file)
@@ -9,6 +9,7 @@
 #include "smpi_f2c.hpp"
 #include "smpi_keyvals.hpp"
 #include <string>
+#include <vector>
 
 constexpr unsigned DT_FLAG_DESTROYED   = 0x0001; /**< user destroyed but some other layers still have a reference */
 constexpr unsigned DT_FLAG_COMMITED    = 0x0002; /**< ready to be used for a send/recv operation */
@@ -78,19 +79,13 @@ namespace smpi{
 class Datatype_contents {
   public:
   int combiner_;
-  int number_of_integers_;
-  int* integers_;
-  int number_of_addresses_;
-  MPI_Aint* addresses_;
-  int number_of_datatypes_;
-  MPI_Datatype* datatypes_;
+  std::vector<int> integers_;
+  std::vector<MPI_Aint> addresses_;
+  std::vector<MPI_Datatype> datatypes_;
   Datatype_contents(int combiner, 
                     int number_of_integers, const int* integers, 
                     int number_of_addresses, const MPI_Aint* addresses, 
                     int number_of_datatypes, const MPI_Datatype* datatypes);
-  Datatype_contents(const Datatype_contents&) = delete;
-  Datatype_contents& operator=(const Datatype_contents&) = delete;
-  ~Datatype_contents();
 };
 
 class Datatype : public F2C, public Keyval{
index 5422b5d..782a4ce 100644 (file)
@@ -11,6 +11,8 @@
 #include "src/instr/instr_private.hpp"
 #include "src/smpi/include/smpi_actor.hpp"
 
+#include <algorithm>
+#include <functional>
 #include <string>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (datatype)");
@@ -292,22 +294,16 @@ int Datatype::get_contents (int max_integers, int max_addresses,
 {
   if(contents_==nullptr)
     return MPI_ERR_ARG;
-  if(max_integers<contents_->number_of_integers_)
+  if (static_cast<unsigned>(max_integers) < contents_->integers_.size())
     return MPI_ERR_COUNT;
-  for(int i=0; i<contents_->number_of_integers_; i++){
-    array_of_integers[i]=contents_->integers_[i];
-  }
-  if(max_addresses<contents_->number_of_addresses_)
+  std::copy(begin(contents_->integers_), end(contents_->integers_), array_of_integers);
+  if (static_cast<unsigned>(max_addresses) < contents_->addresses_.size())
     return MPI_ERR_COUNT;
-  for(int i=0; i<contents_->number_of_addresses_; i++){
-    array_of_addresses[i]=contents_->addresses_[i];
-  }
-  if(max_datatypes<contents_->number_of_datatypes_)
+  std::copy(begin(contents_->addresses_), end(contents_->addresses_), array_of_addresses);
+  if (static_cast<unsigned>(max_datatypes) < contents_->datatypes_.size())
     return MPI_ERR_COUNT;
-  for(int i=0; i<contents_->number_of_datatypes_; i++){
-    array_of_datatypes[i]=contents_->datatypes_[i];
-    contents_->datatypes_[i]->ref();
-  }
+  std::copy(begin(contents_->datatypes_), end(contents_->datatypes_), array_of_datatypes);
+  std::for_each(begin(contents_->datatypes_), end(contents_->datatypes_), std::mem_fn(&Datatype::ref));
   return MPI_SUCCESS;
 }
 
@@ -320,9 +316,9 @@ int Datatype::get_envelope (int* num_integers, int* num_addresses,
     *num_datatypes = 0;
     *combiner = MPI_COMBINER_NAMED;
   }else{
-    *num_integers = contents_->number_of_integers_;
-    *num_addresses = contents_->number_of_addresses_;
-    *num_datatypes = contents_->number_of_datatypes_;
+    *num_integers  = contents_->integers_.size();
+    *num_addresses = contents_->addresses_.size();
+    *num_datatypes = contents_->datatypes_.size();
     *combiner = contents_->combiner_;
   }
   return MPI_SUCCESS;
index fb3adda..21d04c9 100644 (file)
 namespace simgrid{
 namespace smpi{
 
-
-Datatype_contents::Datatype_contents(int combiner,
-                    int number_of_integers, const int* integers,
-                    int number_of_addresses, const MPI_Aint* addresses,
-                    int number_of_datatypes, const MPI_Datatype* datatypes)
-: combiner_(combiner), number_of_integers_(number_of_integers), 
-  number_of_addresses_(number_of_addresses), 
-  number_of_datatypes_(number_of_datatypes)
+Datatype_contents::Datatype_contents(int combiner, int number_of_integers, const int* integers, int number_of_addresses,
+                                     const MPI_Aint* addresses, int number_of_datatypes, const MPI_Datatype* datatypes)
+    : combiner_(combiner)
+    , integers_(integers, integers + number_of_integers)
+    , addresses_(addresses, addresses + number_of_addresses)
+    , datatypes_(datatypes, datatypes + number_of_datatypes)
 {
-  integers_=new int[number_of_integers_];
-  for(int i=0; i<number_of_integers_; i++){
-    integers_[i]=integers[i];
-  }
-  addresses_=new MPI_Aint[number_of_addresses_];
-  for(int i=0; i<number_of_addresses_; i++){
-    addresses_[i]=addresses[i];
-  }
-  datatypes_=new MPI_Datatype[number_of_datatypes_];
-  for(int i=0; i<number_of_datatypes_; i++){
-    datatypes_[i]=datatypes[i];
-  }
-};
-Datatype_contents::~Datatype_contents(){
-  delete[] integers_;
-  delete[] addresses_;
-  delete[] datatypes_;
 }
 
 Type_Contiguous::Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type)