Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add a deleted flag to keep track of invalid but not actually deleted handles
[simgrid.git] / src / smpi / include / smpi_datatype.hpp
index 5f7f287..3874680 100644 (file)
@@ -30,7 +30,7 @@ constexpr unsigned DT_FLAG_DERIVED     = 0x0800; /**< is the datatype derived ?
 constexpr unsigned DT_FLAG_BASIC =
     (DT_FLAG_PREDEFINED | DT_FLAG_CONTIGUOUS | DT_FLAG_NO_GAPS | DT_FLAG_DATA | DT_FLAG_COMMITED);
 
-extern const MPI_Datatype MPI_PTR;
+extern MPI_Datatype MPI_PTR;
 
 //The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC.
 struct float_int {
@@ -100,11 +100,17 @@ class Datatype : public F2C, public Keyval{
   MPI_Aint ub_;
   int flags_;
   int refcount_ = 1;
+  std::unique_ptr<Datatype_contents> contents_ = nullptr;
+
+protected:
+  template <typename... Args> void set_contents(Args&&... args)
+  {
+    contents_ = std::make_unique<Datatype_contents>(std::forward<Args>(args)...);
+  }
 
 public:
   static std::unordered_map<int, smpi_key_elem> keyvals_;
   static int keyval_id_;
-  Datatype_contents* contents_ = nullptr;
 
   Datatype(int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags);
   Datatype(const char* name, int ident, int size, MPI_Aint lb, MPI_Aint ub, int flags);