Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Finished = inactive
[simgrid.git] / src / smpi / mpi / smpi_datatype_derived.cpp
index aa12ddcfb536572f7558b0d5752e3aed4df508c5..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)
@@ -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)
@@ -263,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){