defines virtual destructor to fix gcc4 warnings like: warning: ‘class CharismaInPort...
[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() {}
87   virtual CkOStream& operator << (_CkOStream& (*f)(_CkOStream &)) = 0;
88 #define SHIFTLEFT(type) \
89   virtual CkOStream& operator << (type x) = 0
90
91   SHIFTLEFT(int);
92   SHIFTLEFT(unsigned int);
93   SHIFTLEFT(short);
94   SHIFTLEFT(unsigned short);
95   SHIFTLEFT(long);
96   SHIFTLEFT(unsigned long);
97   SHIFTLEFT(long long);
98   SHIFTLEFT(unsigned long long);
99   SHIFTLEFT(char);
100   SHIFTLEFT(unsigned char);
101   SHIFTLEFT(float);
102   SHIFTLEFT(double);
103   SHIFTLEFT(const char*);
104   SHIFTLEFT(void*);
105 };
106
107 class CkOutStream : public CkOStream {
108   public:
109   CkOutStream& operator << (_CkOStream& (*f)(_CkOStream &)) {
110     f(*CkpvAccess(_ckout));
111     return *this;
112   }
113 #define OUTSHIFTLEFT(type) \
114   CkOutStream& operator << (type x) { \
115     *CkpvAccess(_ckout) << x; \
116     return *this; \
117   }
118     OUTSHIFTLEFT(int);
119     OUTSHIFTLEFT(unsigned int);
120     OUTSHIFTLEFT(short);
121     OUTSHIFTLEFT(unsigned short);
122     OUTSHIFTLEFT(long);
123     OUTSHIFTLEFT(unsigned long);
124     OUTSHIFTLEFT(long long);
125     OUTSHIFTLEFT(unsigned long long);
126     OUTSHIFTLEFT(char);
127     OUTSHIFTLEFT(unsigned char);
128     OUTSHIFTLEFT(float);
129     OUTSHIFTLEFT(double);
130     OUTSHIFTLEFT(const char*);
131     OUTSHIFTLEFT(void*);
132 };
133
134 class CkErrStream : public CkOStream {
135   public:
136   CkErrStream& operator << (_CkOStream& (*f)(_CkOStream &)) {
137     f(*CkpvAccess(_ckerr));
138     return *this;
139   }
140 #define ERRSHIFTLEFT(type) \
141   CkErrStream& operator << (type x) { \
142     *CkpvAccess(_ckerr) << x; \
143     return *this; \
144   }
145     ERRSHIFTLEFT(int);
146     ERRSHIFTLEFT(unsigned int);
147     ERRSHIFTLEFT(short);
148     ERRSHIFTLEFT(unsigned short);
149     ERRSHIFTLEFT(long);
150     ERRSHIFTLEFT(unsigned long);
151     ERRSHIFTLEFT(long long);
152     ERRSHIFTLEFT(unsigned long long);
153     ERRSHIFTLEFT(char);
154     ERRSHIFTLEFT(unsigned char);
155     ERRSHIFTLEFT(float);
156     ERRSHIFTLEFT(double);
157     ERRSHIFTLEFT(const char*);
158     ERRSHIFTLEFT(void*);
159 };
160
161 extern CkOutStream ckout;
162 extern CkErrStream ckerr;
163
164 class CkInStream {
165   public:
166 #define OPSHIFTRIGHT(type, format) \
167     CkInStream& operator >> (type& x) { \
168       CkScanf(format, (type *)&x); \
169       return *this; \
170     }
171
172     OPSHIFTRIGHT(int, "%d");
173     OPSHIFTRIGHT(unsigned int, "%u");
174     OPSHIFTRIGHT(short, "%hd");
175     OPSHIFTRIGHT(unsigned short, "%hu");
176     OPSHIFTRIGHT(long, "%ld");
177     OPSHIFTRIGHT(unsigned long, "%lu");
178     OPSHIFTRIGHT(long long, "%lld");
179     OPSHIFTRIGHT(unsigned long long, "%llu");
180     OPSHIFTRIGHT(char, "%c");
181     OPSHIFTRIGHT(unsigned char, "%c");
182     OPSHIFTRIGHT(float, "%f");
183     OPSHIFTRIGHT(double, "%lf");
184
185     CkInStream& operator >> (char* x) {
186       CkScanf("%s", x);
187       return *this;
188     }
189 };
190
191 extern CkInStream ckin;
192
193 #endif