This source file includes following definitions.
- ompi_datatype_create_vector
- ompi_datatype_create_hvector
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 #include "ompi_config.h"
  26 
  27 #include <stddef.h>
  28 
  29 #include "ompi/datatype/ompi_datatype.h"
  30 
  31 int32_t ompi_datatype_create_vector( int count, int bLength, int stride,
  32                                      const ompi_datatype_t* oldType, ompi_datatype_t** newType )
  33 {
  34     ompi_datatype_t *pTempData, *pData;
  35     ptrdiff_t extent = oldType->super.ub - oldType->super.lb;
  36 
  37     if( (0 == count) || (0 == bLength) ) {
  38         return ompi_datatype_duplicate( &ompi_mpi_datatype_null.dt, newType);
  39     }
  40 
  41     pData = ompi_datatype_create( oldType->super.desc.used + 2 );
  42     if( (bLength == stride) || (1 >= count) ) {  
  43         ompi_datatype_add( pData, oldType, (size_t)count * bLength, 0, extent );
  44     } else {
  45         if( 1 == bLength ) {
  46             ompi_datatype_add( pData, oldType, count, 0, extent * stride );
  47         } else {
  48             ompi_datatype_add( pData, oldType, bLength, 0, extent );
  49             pTempData = pData;
  50             pData = ompi_datatype_create( oldType->super.desc.used + 2 + 2 );
  51             ompi_datatype_add( pData, pTempData, count, 0, extent * stride );
  52             OBJ_RELEASE( pTempData );
  53         }
  54     }
  55     *newType = pData;
  56     return OMPI_SUCCESS;
  57 }
  58 
  59 
  60 int32_t ompi_datatype_create_hvector( int count, int bLength, ptrdiff_t stride,
  61                                       const ompi_datatype_t* oldType, ompi_datatype_t** newType )
  62 {
  63     ompi_datatype_t *pTempData, *pData;
  64     ptrdiff_t extent = oldType->super.ub - oldType->super.lb;
  65 
  66     if( (0 == count) || (0 == bLength) ) {
  67         return ompi_datatype_duplicate( &ompi_mpi_datatype_null.dt, newType);
  68     }
  69 
  70     pTempData = ompi_datatype_create( oldType->super.desc.used + 2 );
  71     if( ((extent * bLength) == stride) || (1 >= count) ) {  
  72         pData = pTempData;
  73         ompi_datatype_add( pData, oldType, count * bLength, 0, extent );
  74     } else {
  75         if( 1 == bLength ) {
  76             pData = pTempData;
  77             ompi_datatype_add( pData, oldType, count, 0, stride );
  78         } else {
  79             ompi_datatype_add( pTempData, oldType, bLength, 0, extent );
  80             pData = ompi_datatype_create( oldType->super.desc.used + 2 + 2 );
  81             ompi_datatype_add( pData, pTempData, count, 0, stride );
  82             OBJ_RELEASE( pTempData );
  83         }
  84     }
  85      *newType = pData;
  86     return OMPI_SUCCESS;
  87 }