charj: leanmd update
[charm.git] / src / langs / streams / MStream.h
1 #ifndef MSTREAM_H
2 #define MSTREAM_H
3
4 struct StreamMessage {
5   char header[CmiMsgHeaderSizeBytes];
6   int PE;
7   int tag;
8   unsigned short len; // sizeof the data 
9   unsigned short isLast; // 1 if its last packet
10   char data[1];
11 };
12
13 class Communicate;
14
15 class MIStream {
16   private:
17     int PE, tag;
18     StreamMessage *msg;
19     int currentPos;
20     Communicate *cobj;
21     MIStream *Get(char *buf, int len);  // get len bytes from message to buf
22   public:
23     MIStream(Communicate *c, int pe, int tag);
24     ~MIStream();
25     MIStream *get(char &data) { 
26       return Get(&data,sizeof(char)); 
27     }
28     MIStream *get(unsigned char &data) { 
29       return Get((char *)&data,sizeof(unsigned char)); 
30     }
31     MIStream *get(short &data) { 
32       return Get((char *)&data, sizeof(short)); 
33     }
34     MIStream *get(unsigned short &data) { 
35       return Get((char *)&data, sizeof(unsigned short)); 
36     }
37     MIStream *get(int &data) { 
38       return Get((char *)&data, sizeof(int)); 
39     }
40     MIStream *get(unsigned int &data) { 
41       return Get((char *)&data, sizeof(unsigned int)); 
42     }
43     MIStream *get(long &data) { 
44       return Get((char *)&data, sizeof(long)); 
45     }
46     MIStream *get(unsigned long &data) { 
47       return Get((char *)&data, sizeof(unsigned long)); 
48     }
49     MIStream *get(float &data) { 
50       return Get((char *)&data, sizeof(float)); 
51     }
52     MIStream *get(double &data) { 
53       return Get((char *)&data, sizeof(double)); 
54     }
55     MIStream *get(int len, char *data) { 
56       return Get(data,len*sizeof(char)); 
57     }
58     MIStream *get(int len, unsigned char *data) { 
59       return Get((char *)data,len*sizeof(unsigned char)); 
60     }
61     MIStream *get(int len, short *data) { 
62       return Get((char *)data,len*sizeof(short)); 
63     }
64     MIStream *get(int len, unsigned short *data) { 
65       return Get((char *)data,len*sizeof(unsigned short)); 
66     }
67     MIStream *get(int len, int *data) { 
68       return Get((char *)data,len*sizeof(int)); 
69     }
70     MIStream *get(int len, unsigned int *data) { 
71       return Get((char *)data,len*sizeof(unsigned int)); 
72     }
73     MIStream *get(int len, long *data) { 
74       return Get((char *)data,len*sizeof(long)); 
75     }
76     MIStream *get(int len, unsigned long *data) { 
77       return Get((char *)data,len*sizeof(unsigned long)); 
78     }
79     MIStream *get(int len, float *data) { 
80       return Get((char *)data,len*sizeof(float)); 
81     }
82     MIStream *get(int len, double *data) { 
83       return Get((char *)data,len*sizeof(double)); 
84     }
85 };
86
87 class MOStream {
88   private:
89     int PE, tag;
90     unsigned int bufLen;
91     StreamMessage *msgBuf;
92     Communicate *cobj;
93     MOStream *Put(char *buf, int len);  // put len bytes from buf into message
94   public:
95     MOStream(Communicate *c, int pe, int tag, unsigned int bufSize);
96     ~MOStream();
97     void end(void);
98     MOStream *put(char data) { 
99       return Put(&data,sizeof(char)); 
100     }
101     MOStream *put(unsigned char data) { 
102       return Put((char *)&data,sizeof(unsigned char)); 
103     }
104     MOStream *put(short data) { 
105       return Put((char *)&data, sizeof(short)); 
106     }
107     MOStream *put(unsigned short data) { 
108       return Put((char *)&data, sizeof(unsigned short)); 
109     }
110     MOStream *put(int data) { 
111       return Put((char *)&data, sizeof(int)); 
112     }
113     MOStream *put(unsigned int data) { 
114       return Put((char *)&data, sizeof(unsigned int)); 
115     }
116     MOStream *put(long data) { 
117       return Put((char *)&data, sizeof(long)); 
118     }
119     MOStream *put(unsigned long data) { 
120       return Put((char *)&data, sizeof(unsigned long)); 
121     }
122     MOStream *put(float data) { 
123       return Put((char *)&data, sizeof(float)); 
124     }
125     MOStream *put(double data) { 
126       return Put((char *)&data, sizeof(double)); 
127     }
128     MOStream *put(int len, char *data) { 
129       return Put(data,len*sizeof(char)); 
130     }
131     MOStream *put(int len, unsigned char *data) { 
132       return Put((char *)data,len*sizeof(unsigned char)); 
133     }
134     MOStream *put(int len, short *data) { 
135       return Put((char *)data,len*sizeof(short)); 
136     }
137     MOStream *put(int len, unsigned short *data) { 
138       return Put((char *)data,len*sizeof(unsigned short)); 
139     }
140     MOStream *put(int len, int *data) { 
141       return Put((char *)data,len*sizeof(int)); 
142     }
143     MOStream *put(int len, unsigned int *data) { 
144       return Put((char *)data,len*sizeof(unsigned int)); 
145     }
146     MOStream *put(int len, long *data) { 
147       return Put((char *)data,len*sizeof(long)); 
148     }
149     MOStream *put(int len, unsigned long *data) { 
150       return Put((char *)data,len*sizeof(unsigned long)); 
151     }
152     MOStream *put(int len, float *data) { 
153       return Put((char *)data,len*sizeof(float)); 
154     }
155     MOStream *put(int len, double *data) { 
156       return Put((char *)data,len*sizeof(double)); 
157     }
158 };
159
160 #endif