/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef DATATYPE_H_INCLUDED
#define DATATYPE_H_INCLUDED
#include "mpiimpl.h"
/* Definitions private to the datatype code */
extern int MPIR_Datatype_init(void);
extern int MPIR_Datatype_builtin_fillin(void);
extern int MPIR_Datatype_init_names(void);
extern void MPIR_Datatype_iscontig(MPI_Datatype, int *);
/* LB/UB calculation helper macros */
/* MPII_DATATYPE_CONTIG_LB_UB()
*
* Determines the new LB and UB for a block of old types given the
* old type's LB, UB, and extent, and a count of these types in the
* block.
*
* Note: if the displacement is non-zero, the MPII_DATATYPE_BLOCK_LB_UB()
* should be used instead (see below).
*/
#define MPII_DATATYPE_CONTIG_LB_UB(cnt_, \
old_lb_, \
old_ub_, \
old_extent_, \
lb_, \
ub_) \
do { \
if (cnt_ == 0) { \
lb_ = old_lb_; \
ub_ = old_ub_; \
} \
else if (old_ub_ >= old_lb_) { \
lb_ = old_lb_; \
ub_ = old_ub_ + (old_extent_) * (cnt_ - 1); \
} \
else /* negative extent */ { \
lb_ = old_lb_ + (old_extent_) * (cnt_ - 1); \
ub_ = old_ub_; \
} \
} while (0)
/* MPII_DATATYPE_VECTOR_LB_UB()
*
* Determines the new LB and UB for a vector of blocks of old types
* given the old type's LB, UB, and extent, and a count, stride, and
* blocklen describing the vectorization.
*/
#define MPII_DATATYPE_VECTOR_LB_UB(cnt_, \
stride_, \
blklen_, \
old_lb_, \
old_ub_, \
old_extent_, \
lb_, \
ub_) \
do { \
if (cnt_ == 0 || blklen_ == 0) { \
lb_ = old_lb_; \
ub_ = old_ub_; \
} \
else if (stride_ >= 0 && (old_extent_) >= 0) { \
lb_ = old_lb_; \
ub_ = old_ub_ + (old_extent_) * ((blklen_) - 1) + \
(stride_) * ((cnt_) - 1); \
} \
else if (stride_ < 0 && (old_extent_) >= 0) { \
lb_ = old_lb_ + (stride_) * ((cnt_) - 1); \
ub_ = old_ub_ + (old_extent_) * ((blklen_) - 1); \
} \
else if (stride_ >= 0 && (old_extent_) < 0) { \
lb_ = old_lb_ + (old_extent_) * ((blklen_) - 1); \
ub_ = old_ub_ + (stride_) * ((cnt_) - 1); \
} \
else { \
lb_ = old_lb_ + (old_extent_) * ((blklen_) - 1) + \
(stride_) * ((cnt_) - 1); \
ub_ = old_ub_; \
} \
} while (0)
/* MPII_DATATYPE_BLOCK_LB_UB()
*
* Determines the new LB and UB for a block of old types given the LB,
* UB, and extent of the old type as well as a new displacement and count
* of types.
*
* Note: we need the extent here in addition to the lb and ub because the
* extent might have some padding in it that we need to take into account.
*/
#define MPII_DATATYPE_BLOCK_LB_UB(cnt_, \
disp_, \
old_lb_, \
old_ub_, \
old_extent_, \
lb_, \
ub_) \
do { \
if (cnt_ == 0) { \
lb_ = old_lb_ + (disp_); \
ub_ = old_ub_ + (disp_); \
} \
else if (old_ub_ >= old_lb_) { \
lb_ = old_lb_ + (disp_); \
ub_ = old_ub_ + (disp_) + (old_extent_) * ((cnt_) - 1); \
} \
else /* negative extent */ { \
lb_ = old_lb_ + (disp_) + (old_extent_) * ((cnt_) - 1); \
ub_ = old_ub_ + (disp_); \
} \
} while (0)
/* internal debugging functions */
void MPII_Datatype_printf(MPI_Datatype type, int depth, MPI_Aint displacement, int blocklength,
int header);
void MPII_Dataloop_dot_printf(MPIR_Dataloop * loop_p, int depth, int header);
void MPII_Datatype_get_contents_ints(MPIR_Datatype_contents * cp, int *user_ints);
void MPII_Datatype_get_contents_aints(MPIR_Datatype_contents * cp, MPI_Aint * user_aints);
void MPII_Datatype_get_contents_types(MPIR_Datatype_contents * cp, MPI_Datatype * user_types);
#endif /* DATATYPE_H_INCLUDED */