Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Some cleanups, some smells
[simgrid.git] / src / smpi / smpi_datatype.hpp
index 65eb838..1cec8fb 100644 (file)
@@ -10,6 +10,7 @@
 #include <xbt/base.h>
 
 #include "private.h"
+#include <unordered_map>
 
 #define DT_FLAG_DESTROYED     0x0001  /**< user destroyed but some other layers still have a reference */
 #define DT_FLAG_COMMITED      0x0002  /**< ready to be used for a send/recv operation */
 #define DT_FLAG_DATA          0x0100  /**< data or control structure */
 #define DT_FLAG_ONE_SIDED     0x0200  /**< datatype can be used for one sided operations */
 #define DT_FLAG_UNAVAILABLE   0x0400  /**< datatypes unavailable on the build (OS or compiler dependant) */
-#define DT_FLAG_VECTOR        0x0800  /**< valid only for loops. The loop contain only one element
-                                       **< without extent. It correspond to the vector type. */
+#define DT_FLAG_DERIVED       0x0800  /**< is the datatype derived ? */
 /*
  * We should make the difference here between the predefined contiguous and non contiguous
  * datatypes. The DT_FLAG_BASIC is held by all predefined contiguous datatypes.
  */
 #define 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;
+
+typedef struct s_smpi_mpi_type_key_elem {
+  MPI_Type_copy_attr_function* copy_fn;
+  MPI_Type_delete_attr_function* delete_fn;
+} s_smpi_mpi_type_key_elem_t; 
+typedef struct s_smpi_mpi_type_key_elem *smpi_type_key_elem;
+
+//The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC.
+typedef struct {
+  float value;
+  int index;
+} float_int;
+typedef struct {
+  float value;
+  float index;
+} float_float;
+typedef struct {
+  long value;
+  long index;
+} long_long;
+typedef struct {
+  double value;
+  double index;
+} double_double;
+typedef struct {
+  long value;
+  int index;
+} long_int;
+typedef struct {
+  double value;
+  int index;
+} double_int;
+typedef struct {
+  short value;
+  int index;
+} short_int;
+typedef struct {
+  int value;
+  int index;
+} int_int;
+typedef struct {
+  long double value;
+  int index;
+} long_double_int;
+typedef struct {
+  int64_t value;
+  int64_t index;
+} integer128_t;
+
+
 namespace simgrid{
 namespace smpi{
 
-class Datatype{
-//TODO: remove
-  public:
+class Datatype : public F2C{
+  protected:
     char* name_;
     size_t size_;
     MPI_Aint lb_;
     MPI_Aint ub_;
     int flags_;
     xbt_dict_t attributes_;
-    int in_use_;
+    int refcount_;
+
+    static std::unordered_map<int, smpi_type_key_elem> keyvals_;
+    static int keyval_id_;
 
   public:
-    Datatype(int size,int lb, int ub, int flags);
-    Datatype(char* name, int size,int lb, int ub, int flags);
-    Datatype(Datatype &datatype);
-    ~Datatype();
-    void use();
-    void unuse();
+    static MPI_Datatype null_id_;
+
+    Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags);
+    Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags);
+    Datatype(Datatype *datatype, int* ret);
+    virtual ~Datatype();
+    void ref();
+    static void unref(MPI_Datatype datatype);
     void commit();
     bool is_valid();
     size_t size();
@@ -65,10 +120,10 @@ class Datatype{
     void set_name(char* name);
     static int copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
                     void *recvbuf, int recvcount, MPI_Datatype recvtype);
-    virtual void serialize( void* noncontiguous_vector, void *contiguous_vector
-                            int count, void *type);
-    virtual void unserialize( void* contiguous_vector, void *noncontiguous_vector
-                              int count, void *type, MPI_Op op);
+    virtual void serialize( void* noncontiguous, void *contiguous
+                            int count);
+    virtual void unserialize( void* contiguous, void *noncontiguous
+                              int count, MPI_Op op);
     int attr_delete(int keyval);
     int attr_get(int keyval, void* attr_value, int* flag);
     int attr_put(int keyval, void* attr_value);
@@ -76,27 +131,18 @@ class Datatype{
     static int keyval_free(int* keyval);
     int pack(void* inbuf, int incount, void* outbuf, int outcount, int* position, MPI_Comm comm);
     int unpack(void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Comm comm);
-};
-
-class Type_Contiguous:Datatype{
-};
 
-class Type_Vector:Datatype{
-};
-
-class Type_Hvector:Datatype{
-};
 
-class Type_Indexed:Datatype{
-};
+    static int create_contiguous(int count, MPI_Datatype old_type, MPI_Aint lb, MPI_Datatype* new_type);
+    static int create_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* new_type);
+    static int create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type);
+    static int create_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type);
+    static int create_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype old_type, MPI_Datatype* new_type);
+    static int create_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* new_type);
 
-class Type_Hindexed:Datatype{
+    static Datatype* f2c(int id);
 };
 
-class Type_Struct:Datatype{
-};
-
-
 }
 }