Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
First works on the datatypes. Still missing a lot.
[simgrid.git] / src / smpi / smpi_datatype.hpp
diff --git a/src/smpi/smpi_datatype.hpp b/src/smpi/smpi_datatype.hpp
new file mode 100644 (file)
index 0000000..65eb838
--- /dev/null
@@ -0,0 +1,103 @@
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SMPI_DATATYPE_HPP
+#define SMPI_DATATYPE_HPP
+
+#include <xbt/base.h>
+
+#include "private.h"
+
+#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_CONTIGUOUS    0x0004  /**< contiguous datatype */
+#define DT_FLAG_OVERLAP       0x0008  /**< datatype is unpropper for a recv operation */
+#define DT_FLAG_USER_LB       0x0010  /**< has a user defined LB */
+#define DT_FLAG_USER_UB       0x0020  /**< has a user defined UB */
+#define DT_FLAG_PREDEFINED    0x0040  /**< cannot be removed: initial and predefined datatypes */
+#define DT_FLAG_NO_GAPS       0x0080  /**< no gaps around the datatype */
+#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. */
+/*
+ * 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)
+
+namespace simgrid{
+namespace smpi{
+
+class Datatype{
+//TODO: remove
+  public:
+    char* name_;
+    size_t size_;
+    MPI_Aint lb_;
+    MPI_Aint ub_;
+    int flags_;
+    xbt_dict_t attributes_;
+    int in_use_;
+
+  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();
+    void commit();
+    bool is_valid();
+    size_t size();
+    int flags();
+    void addflag(int flag);
+    MPI_Aint lb();
+    MPI_Aint ub();
+    int extent(MPI_Aint * lb, MPI_Aint * extent);
+    MPI_Aint get_extent();
+    char* name();
+    void get_name(char* name, int* length);
+    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);
+    int attr_delete(int keyval);
+    int attr_get(int keyval, void* attr_value, int* flag);
+    int attr_put(int keyval, void* attr_value);
+    static int keyval_create(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state);
+    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{
+};
+
+class Type_Hindexed:Datatype{
+};
+
+class Type_Struct:Datatype{
+};
+
+
+}
+}
+
+#endif