--- /dev/null
+/* 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