00001
00025 #ifndef __MAGIC_MSTREAM_H__
00026 #define __MAGIC_MSTREAM_H__
00027
00028 #include "magic/mobject.h"
00029 #include "magic/mstring.h"
00030 #include "magic/miodevice.h"
00031
00032 BEGIN_NAMESPACE (MagiC);
00033
00034 class Stream;
00035 class OStream;
00036 class IStream;
00037 class IOStream;
00038
00040
00041
00042
00043
00044
00046
00051 class Stream : public Object {
00052 public:
00053 Stream ();
00054 Stream (IODevice& dev);
00055 Stream (IODevice* dev);
00056 Stream (String& buffer);
00057 Stream (FILE* strm);
00058 Stream (Stream& orig);
00059 virtual ~Stream ();
00060
00062 enum Encoding {Locale=0,
00063 Latin1,
00064 Unicode,
00065 UnicodeNetworkOrder,
00066 UnicodeReverse,
00067 RawUnicode,
00068 UnicodeUTF8
00069 };
00070
00071 inline IODevice* device () {return mpDevice;}
00072 void setDevice (IODevice* dev);
00073 inline void setEncoding (Encoding enc) {mEncoding = enc;}
00074 inline int formatMode () const {return mFormatMode;}
00075 inline ulong flags () const {return mFlags;}
00076 inline ulong setFlags (ulong f) {int oldf=mFlags; mFlags=f; return oldf;}
00077 inline bool operator[] (ulong i) {return flags() & i;}
00078 void operator= (const Stream& other) {copy (other);}
00079 virtual void copy (const Stream& other);
00080
00081 bool atEnd () const;
00082
00083 protected:
00084 IODevice* mpDevice;
00085 bool mOwnDevice;
00086 int mFormatMode;
00087 Encoding mEncoding;
00088 ulong mFlags;
00089 };
00090
00091
00092
00094
00095
00096
00097
00098
00100
00102 class OStream : public Stream {
00103 public:
00104 OStream (IODevice& dev) : Stream (dev) {;}
00105 OStream (IODevice* dev) : Stream (dev) {;}
00106 OStream (String& buffer, int mode = IO_Writable);
00107 OStream (FILE* strm = stdout);
00108 OStream (OStream& o);
00109 virtual ~OStream () {}
00110
00111 void flush ();
00112 void autoFlush (bool afl=true) {mAutoFlush=afl;}
00113 bool isAutoFlush () const {return mAutoFlush;}
00114 void operator= (const OStream& other) {copy (other);}
00115 virtual void copy (const OStream& other);
00116
00117 virtual OStream& printf (const char* format, ...);
00118 virtual OStream& operator<< (char) = 0;
00119 virtual OStream& operator<< (int) = 0;
00120 virtual OStream& operator<< (long) = 0;
00121 virtual OStream& operator<< (float) = 0;
00122 virtual OStream& operator<< (double) = 0;
00123 virtual OStream& operator<< (const char* str) = 0;
00124 virtual OStream& operator<< (const String& str) = 0;
00125 virtual uint writeRawBytes (const char* p, uint n) = 0;
00126
00127 private:
00128 bool mAutoFlush;
00129 };
00130
00131
00132
00134
00135
00136
00137
00138
00139
00140
00142
00144 class IStream : public Stream {
00145 public:
00146 IStream (IODevice& dev) : Stream (dev) {;}
00147 IStream (IODevice* dev);
00148 IStream (const String& buffer) : Stream (const_cast<String&> (buffer)) {;}
00149 IStream (FILE* strm = stdin) : Stream (strm) {;}
00150 IStream (IStream& o) : Stream (o) {;}
00151 virtual ~IStream () {}
00152
00153 virtual IStream& operator>> (char& i)=0;
00154 virtual IStream& operator>> (int& i)=0;
00155 virtual IStream& operator>> (long& i)=0;
00156 virtual IStream& operator>> (float& i)=0;
00157 virtual IStream& operator>> (double& i)=0;
00158 virtual IStream& operator>> (String& s)=0;
00159 virtual uint readRawBytes (char* data, uint n)=0;
00160
00161 operator bool () {return !atEnd();}
00162 bool operator ! () {return atEnd();}
00163
00164 private:
00165 bool mUnused;
00166 };
00167
00168
00169
00171
00172
00173
00174
00175
00176
00177
00179
00181 class IOStream : public OStream, virtual public IStream {
00182 public:
00183
00184 IOStream (IODevice& dev) : OStream (dev) {;}
00185 IOStream (IODevice* dev) : OStream (dev) {;}
00186 IOStream (String& buffer) : OStream (buffer) {;}
00187 IOStream (FILE* strm) : OStream (strm) {;}
00188 IOStream (IOStream& o) : IStream(o), OStream (o) {;}
00189 };
00190
00191 END_NAMESPACE;
00192
00193 #endif
00194