32 #define VARSIZE_DECL(MSGTYPE) \    33   static void *alloc(int, int, int *, int); \    34   static void *pack(MSGTYPE *); \    35   static MSGTYPE* unpack(void *)    37 #define VARSIZE_MSG(MSGTYPE,MSGDATA) \    38 void *MSGTYPE::alloc(int varsizemsg_msgnum, int varsizemsg_size, \    39                    int *varsizemsg_array, int varsizemsg_priobits) { \    40   varsizemsg_size = ALIGN8(varsizemsg_size); \    41   MSGTYPE *varsizemsg_msg = 0; \    43     const int varsizemsg_pass = 0; \    44     int varsizemsg_totalsize = varsizemsg_size; \    45     int varsizemsg_arraycount = 0; \    47     varsizemsg_msg = (MSGTYPE *) CkAllocMsg( \    48         varsizemsg_msgnum, varsizemsg_totalsize, varsizemsg_priobits); \    51     const int varsizemsg_pass = 1; \    52     int varsizemsg_totalsize = varsizemsg_size; \    53     int varsizemsg_arraycount = 0; \    56   return (void *) varsizemsg_msg; \    59 void *MSGTYPE::pack(MSGTYPE *varsizemsg_msg) { \    60   int *varsizemsg_array=0, varsizemsg_arraycount=0, varsizemsg_totalsize=0; \    62     const int varsizemsg_pass = 2; \    65   return (void *) varsizemsg_msg; \    68 MSGTYPE *MSGTYPE::unpack(void *varsizemsg_buf) { \    69   int *varsizemsg_array=0, varsizemsg_arraycount=0, varsizemsg_totalsize=0; \    70   MSGTYPE *varsizemsg_msg = (MSGTYPE *) varsizemsg_buf; \    72     const int varsizemsg_pass = 3; \    75   return varsizemsg_msg; \    78 template<
class T> 
inline T* 
cast_array(T*, 
char *a) { 
return (T*) a; }
    79 template<
class T> 
inline T* 
cast_size(T*, 
size_t a) { 
return (T*) a; }
    81 #define VARSIZE_ARRAY(ARRAY) { \    82   int varsizemsg_arraysize; \    83   switch ( varsizemsg_pass ) { \    85     varsizemsg_arraysize = sizeof(*(varsizemsg_msg->ARRAY)) * \    86                 varsizemsg_array[varsizemsg_arraycount]; \    87     varsizemsg_totalsize += ALIGN8(varsizemsg_arraysize); \    88     varsizemsg_arraycount++; \    91     varsizemsg_msg->ARRAY = cast_array(varsizemsg_msg->ARRAY, \    92         (char *) varsizemsg_msg + varsizemsg_totalsize); \    93     varsizemsg_arraysize = sizeof(*(varsizemsg_msg->ARRAY)) * \    94                 varsizemsg_array[varsizemsg_arraycount]; \    95     varsizemsg_totalsize += ALIGN8(varsizemsg_arraysize); \    96     varsizemsg_arraycount++; \    99     varsizemsg_msg->ARRAY = cast_size(varsizemsg_msg->ARRAY, \   100       (char *) (varsizemsg_msg->ARRAY) - (char *) &(varsizemsg_msg->ARRAY) ); \   103     varsizemsg_msg->ARRAY = cast_array(varsizemsg_msg->ARRAY, \   104       (char *) &(varsizemsg_msg->ARRAY) + (size_t) (varsizemsg_msg->ARRAY) ); \ T * cast_size(T *, size_t a)
 
T * cast_array(T *, char *a)