NAMD
varsizemsg.h
Go to the documentation of this file.
1 
7 #ifndef VARSIZEMSG_H
8 #define VARSIZEMSG_H
9 
10 /* Macros for automatically allocating, packing and unpacking varsize messages.
11 
12 Usage:
13 
14 class MyMsg : public CMessage_MyMsg {
15 public:
16 
17  int myscalar;
18  int *myarray;
19  double myscalar2;
20  double *myarray2;
21 
22  VARSIZE_DECL(MyMsg);
23 };
24 
25 VARSIZE_MSG(MyMsg,
26  VARSIZE_ARRAY(myarray); // array size passed in via new
27  VARSIZE_ARRAY(myarray2); // array size passed in via new
28 )
29 
30 */
31 
32 #define VARSIZE_DECL(MSGTYPE) \
33  static void *alloc(int, int, int *, int); \
34  static void *pack(MSGTYPE *); \
35  static MSGTYPE* unpack(void *)
36 
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; \
42  { \
43  const int varsizemsg_pass = 0; \
44  int varsizemsg_totalsize = varsizemsg_size; \
45  int varsizemsg_arraycount = 0; \
46  MSGDATA \
47  varsizemsg_msg = (MSGTYPE *) CkAllocMsg( \
48  varsizemsg_msgnum, varsizemsg_totalsize, varsizemsg_priobits); \
49  } \
50  { \
51  const int varsizemsg_pass = 1; \
52  int varsizemsg_totalsize = varsizemsg_size; \
53  int varsizemsg_arraycount = 0; \
54  MSGDATA \
55  } \
56  return (void *) varsizemsg_msg; \
57 } \
58  \
59 void *MSGTYPE::pack(MSGTYPE *varsizemsg_msg) { \
60  int *varsizemsg_array=0, varsizemsg_arraycount=0, varsizemsg_totalsize=0; \
61  { \
62  const int varsizemsg_pass = 2; \
63  MSGDATA \
64  } \
65  return (void *) varsizemsg_msg; \
66 } \
67  \
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; \
71  { \
72  const int varsizemsg_pass = 3; \
73  MSGDATA \
74  } \
75  return varsizemsg_msg; \
76 }
77 
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; }
80 
81 #define VARSIZE_ARRAY(ARRAY) { \
82  int varsizemsg_arraysize; \
83  switch ( varsizemsg_pass ) { \
84  case 0: \
85  varsizemsg_arraysize = sizeof(*(varsizemsg_msg->ARRAY)) * \
86  varsizemsg_array[varsizemsg_arraycount]; \
87  varsizemsg_totalsize += ALIGN8(varsizemsg_arraysize); \
88  varsizemsg_arraycount++; \
89  break; \
90  case 1: \
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++; \
97  break; \
98  case 2: \
99  varsizemsg_msg->ARRAY = cast_size(varsizemsg_msg->ARRAY, \
100  (char *) (varsizemsg_msg->ARRAY) - (char *) &(varsizemsg_msg->ARRAY) ); \
101  break; \
102  case 3: \
103  varsizemsg_msg->ARRAY = cast_array(varsizemsg_msg->ARRAY, \
104  (char *) &(varsizemsg_msg->ARRAY) + (size_t) (varsizemsg_msg->ARRAY) ); \
105  break; \
106  default: \
107  break; \
108  } \
109 }
110 
111 #endif
112 
T * cast_size(T *, size_t a)
Definition: varsizemsg.h:79
T * cast_array(T *, char *a)
Definition: varsizemsg.h:78