Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Finished = inactive
[simgrid.git] / src / smpi / mpi / smpi_datatype_derived.cpp
index dd283c95d225ee935a567b2c0700c067473afb47..fb3addadc251b00b4b55f8b3414575a60af63d51 100644 (file)
@@ -44,7 +44,7 @@ Datatype_contents::~Datatype_contents(){
 Type_Contiguous::Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type)
     : Datatype(size, lb, ub, flags), block_count_(block_count), old_type_(old_type)
 {
-  contents_ = new Datatype_contents(MPI_COMBINER_CONTIGUOUS, 1, &size, 0, nullptr, 1, &old_type);
+  contents_ = new Datatype_contents(MPI_COMBINER_CONTIGUOUS, 1, &block_count, 0, nullptr, 1, &old_type);
   old_type_->ref();
 }
 
@@ -53,6 +53,13 @@ Type_Contiguous::~Type_Contiguous()
   Datatype::unref(old_type_);
 }
 
+int Type_Contiguous::clone(MPI_Datatype* type)
+{
+  *type = new Type_Contiguous(this->size(), this->lb(), this->ub(), this->flags(), this->block_count_, this->old_type_);
+  (*type)->copy_attrs(this);
+  return MPI_SUCCESS;
+}
+
 void Type_Contiguous::serialize(const void* noncontiguous_buf, void* contiguous_buf, int count)
 {
   char* contiguous_buf_char = static_cast<char*>(contiguous_buf);
@@ -78,6 +85,13 @@ Type_Hvector::~Type_Hvector(){
   Datatype::unref(old_type_);
 }
 
+int Type_Hvector::clone(MPI_Datatype* type)
+{
+  *type = new Type_Hvector(this->size(), this->lb(), this->ub(), this->flags(), this->block_count_, this->block_length_, this->block_stride_, this->old_type_);
+  (*type)->copy_attrs(this);
+  return MPI_SUCCESS;
+}
+
 void Type_Hvector::serialize(const void* noncontiguous_buf, void *contiguous_buf,
                     int count){
   char* contiguous_buf_char = static_cast<char*>(contiguous_buf);
@@ -125,6 +139,13 @@ Type_Vector::Type_Vector(int size, MPI_Aint lb, MPI_Aint ub, int flags, int coun
   contents_ = new Datatype_contents(MPI_COMBINER_VECTOR, 3, ints, 0, nullptr, 1, &old_type);
 }
 
+int Type_Vector::clone(MPI_Datatype* type)
+{
+  *type = new Type_Vector(this->size(), this->lb(), this->ub(), this->flags(), this->block_count_, this->block_length_, this->block_stride_, this->old_type_);
+  (*type)->copy_attrs(this);
+  return MPI_SUCCESS;
+}
+
 Type_Hindexed::Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int count, const int* block_lengths,
                              const MPI_Aint* block_indices, MPI_Datatype old_type)
     : Datatype(size, lb, ub, flags)
@@ -136,7 +157,7 @@ Type_Hindexed::Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int
   int* ints = new int[count+1];
   ints[0]=count;
   for(int i=1;i<=count;i++)
-    ints[i]=block_lengths[i];
+    ints[i]=block_lengths[i-1];
   contents_ = new Datatype_contents(MPI_COMBINER_HINDEXED, count+1, ints, count, block_indices, 1, &old_type);
   delete[] ints;
   old_type_->ref();
@@ -161,6 +182,13 @@ Type_Hindexed::Type_Hindexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int
   }
 }
 
+int Type_Hindexed::clone(MPI_Datatype* type)
+{
+  *type = new Type_Hindexed(this->size(), this->lb(), this->ub(), this->flags(), this->block_count_, this->block_lengths_, this->block_indices_, this->old_type_);
+  (*type)->copy_attrs(this);
+  return MPI_SUCCESS;
+}
+
 Type_Hindexed::~Type_Hindexed()
 {
   Datatype::unref(old_type_);
@@ -230,6 +258,13 @@ Type_Indexed::Type_Indexed(int size, MPI_Aint lb, MPI_Aint ub, int flags, int co
   delete[] ints;
 }
 
+int Type_Indexed::clone(MPI_Datatype* type)
+{ 
+  *type = new Type_Indexed(this->size(), this->lb(), this->ub(), this->flags(), this->block_count_, this->block_lengths_, (int*)(this->block_indices_), this->old_type_);
+  (*type)->copy_attrs(this);
+  return MPI_SUCCESS;
+}
+
 Type_Struct::Type_Struct(int size, MPI_Aint lb, MPI_Aint ub, int flags, int count, const int* block_lengths,
                          const MPI_Aint* block_indices, const MPI_Datatype* old_types)
     : Datatype(size, lb, ub, flags)
@@ -241,8 +276,9 @@ Type_Struct::Type_Struct(int size, MPI_Aint lb, MPI_Aint ub, int flags, int coun
   int* ints = new int[count+1];
   ints[0]=count;
   for(int i=1;i<=count;i++)
-    ints[i]=block_lengths[i];
+    ints[i]=block_lengths[i-1];
   contents_ = new Datatype_contents(MPI_COMBINER_INDEXED, count+1, ints, count, block_indices, count, old_types);
+  delete[] ints;
   for (int i = 0; i < count; i++) {
     block_lengths_[i]=block_lengths[i];
     block_indices_[i]=block_indices[i];
@@ -262,6 +298,12 @@ Type_Struct::~Type_Struct(){
   }
 }
 
+int Type_Struct::clone(MPI_Datatype* type)
+{
+  *type = new Type_Struct(this->size(), this->lb(), this->ub(), this->flags(), this->block_count_, this->block_lengths_, this->block_indices_, this->old_types_);
+  (*type)->copy_attrs(this);
+  return MPI_SUCCESS;
+}
 
 void Type_Struct::serialize(const void* noncontiguous_buf, void *contiguous_buf,
                         int count){