d79d383ea79e1e65ec6e20347392396f956c32d6
[charm.git] / src / ck-core / ckstream.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #ifndef _CKSTREAM_H
9 #define _CKSTREAM_H
10
11 #include <string.h>
12 #include <stdio.h>
13
14 #define BUF_MAXLEN  16384
15
16 class _CkOStream {
17   private:
18     int _isErr;
19     size_t _buflen, _actlen;
20     char _obuf[BUF_MAXLEN];
21     char _tbuf[1024];
22   public:
23     _CkOStream(int isErr=0) { 
24       _buflen=BUF_MAXLEN; 
25       _actlen=1;
26       _isErr = isErr; 
27       _obuf[0] = '\0'; 
28     }
29     _CkOStream& endl(void) {
30       strcat(_obuf, "\n");
31       if(_isErr)
32         CkError(_obuf);
33       else
34         CkPrintf(_obuf);
35       _obuf[0] = '\0'; 
36       _actlen=1;
37       return *this;
38     }
39
40     _CkOStream& operator << (_CkOStream& (*f)(_CkOStream &)) {
41       return f(*this);
42     }
43 #define _OPSHIFTLEFT(type, format) \
44     _CkOStream& operator << (type x) { \
45       sprintf(_tbuf, format, (type) x); \
46       _actlen += strlen(_tbuf); \
47       if(_actlen > _buflen) \
48         CmiAbort("Print Buffer Overflow!!\n"); \
49       strcat(_obuf, _tbuf); \
50       return *this; \
51     }
52
53     _OPSHIFTLEFT(int, "%d");
54     _OPSHIFTLEFT(unsigned int, "%u");
55     _OPSHIFTLEFT(short, "%hd");
56     _OPSHIFTLEFT(unsigned short, "%hu");
57     _OPSHIFTLEFT(long, "%ld");
58     _OPSHIFTLEFT(unsigned long, "%lu");
59     _OPSHIFTLEFT(long long, "%lld");
60     _OPSHIFTLEFT(unsigned long long, "%llu");
61     _OPSHIFTLEFT(char, "%c");
62     _OPSHIFTLEFT(unsigned char, "%u");
63     _OPSHIFTLEFT(float, "%f");
64     _OPSHIFTLEFT(double, "%f");  // Floats and doubles are identical for printf
65     _OPSHIFTLEFT(const char*, "%s");
66     _OPSHIFTLEFT(void*, "%p");
67 };
68
69 static inline _CkOStream& endl(_CkOStream& s)  { return s.endl(); }
70
71 class _CkOutStream : public _CkOStream {
72   public:
73     _CkOutStream() : _CkOStream(0) {}
74 };
75
76 class _CkErrStream : public _CkOStream {
77   public:
78     _CkErrStream() : _CkOStream(1) {}
79 };
80
81 CkpvExtern(_CkOutStream*, _ckout);
82 CkpvExtern(_CkErrStream*, _ckerr);
83
84 class CkOStream {
85  public:
86   virtual CkOStream& operator << (_CkOStream& (*f)(_CkOStream &)) = 0;
87 #define SHIFTLEFT(type) \
88   virtual CkOStream& operator << (type x) = 0
89
90   SHIFTLEFT(int);
91   SHIFTLEFT(unsigned int);
92   SHIFTLEFT(short);
93   SHIFTLEFT(unsigned short);
94   SHIFTLEFT(long);
95   SHIFTLEFT(unsigned long);
96   SHIFTLEFT(long long);
97   SHIFTLEFT(unsigned long long);
98   SHIFTLEFT(char);
99   SHIFTLEFT(unsigned char);
100   SHIFTLEFT(float);
101   SHIFTLEFT(double);
102   SHIFTLEFT(const char*);
103   SHIFTLEFT(void*);
104 };
105
106 class CkOutStream : public CkOStream {
107   public:
108   CkOutStream& operator << (_CkOStream& (*f)(_CkOStream &)) {
109     f(*CkpvAccess(_ckout));
110     return *this;
111   }
112 #define OUTSHIFTLEFT(type) \
113   CkOutStream& operator << (type x) { \
114     *CkpvAccess(_ckout) << x; \
115     return *this; \
116   }
117     OUTSHIFTLEFT(int);
118     OUTSHIFTLEFT(unsigned int);
119     OUTSHIFTLEFT(short);
120     OUTSHIFTLEFT(unsigned short);
121     OUTSHIFTLEFT(long);
122     OUTSHIFTLEFT(unsigned long);
123     OUTSHIFTLEFT(long long);
124     OUTSHIFTLEFT(unsigned long long);
125     OUTSHIFTLEFT(char);
126     OUTSHIFTLEFT(unsigned char);
127     OUTSHIFTLEFT(float);
128     OUTSHIFTLEFT(double);
129     OUTSHIFTLEFT(const char*);
130     OUTSHIFTLEFT(void*);
131 };
132
133 class CkErrStream : public CkOStream {
134   public:
135   CkErrStream& operator << (_CkOStream& (*f)(_CkOStream &)) {
136     f(*CkpvAccess(_ckerr));
137     return *this;
138   }
139 #define ERRSHIFTLEFT(type) \
140   CkErrStream& operator << (type x) { \
141     *CkpvAccess(_ckerr) << x; \
142     return *this; \
143   }
144     ERRSHIFTLEFT(int);
145     ERRSHIFTLEFT(unsigned int);
146     ERRSHIFTLEFT(short);
147     ERRSHIFTLEFT(unsigned short);
148     ERRSHIFTLEFT(long);
149     ERRSHIFTLEFT(unsigned long);
150     ERRSHIFTLEFT(long long);
151     ERRSHIFTLEFT(unsigned long long);
152     ERRSHIFTLEFT(char);
153     ERRSHIFTLEFT(unsigned char);
154     ERRSHIFTLEFT(float);
155     ERRSHIFTLEFT(double);
156     ERRSHIFTLEFT(const char*);
157     ERRSHIFTLEFT(void*);
158 };
159
160 extern CkOutStream ckout;
161 extern CkErrStream ckerr;
162
163 class CkInStream {
164   public:
165 #define OPSHIFTRIGHT(type, format) \
166     CkInStream& operator >> (type& x) { \
167       CkScanf(format, (type *)&x); \
168       return *this; \
169     }
170
171     OPSHIFTRIGHT(int, "%d");
172     OPSHIFTRIGHT(unsigned int, "%u");
173     OPSHIFTRIGHT(short, "%hd");
174     OPSHIFTRIGHT(unsigned short, "%hu");
175     OPSHIFTRIGHT(long, "%ld");
176     OPSHIFTRIGHT(unsigned long, "%lu");
177     OPSHIFTRIGHT(long long, "%lld");
178     OPSHIFTRIGHT(unsigned long long, "%llu");
179     OPSHIFTRIGHT(char, "%c");
180     OPSHIFTRIGHT(unsigned char, "%c");
181     OPSHIFTRIGHT(float, "%f");
182     OPSHIFTRIGHT(double, "%lf");
183
184     CkInStream& operator >> (char* x) {
185       CkScanf("%s", x);
186       return *this;
187     }
188 };
189
190 extern CkInStream ckin;
191
192 #endif