00001 #ifndef SCT_ISTREAMADAPTOR_H
00002 #define SCT_ISTREAMADAPTOR_H
00003
00004 #include "Sct/IStream.h"
00005
00006 #include <iostream>
00007 #include <cstring>
00008 #include <string>
00009
00010 using std::istream;
00011 using std::string;
00012 using std::strcpy;
00013
00014 namespace Sct {
00015
00016 template<typename T>
00017 T min(T a, T b){
00018 return a < b ? a : b;
00019 }
00020
00021 template<typename T>
00022 void getArray(istream& stream, T* p, size_t size, size_t actualSize);
00023
00024 template<typename T>
00025 void getArrayCreate(istream& stream, T** p, size_t& size);
00026
00027 template<typename T>
00028 void getArrayNoCreate(istream& stream, T* p, size_t size);
00029
00032 class IStreamAdaptor : public virtual IStream {
00033 public:
00035 IStreamAdaptor(istream& stream) : istr(&stream) {
00036 }
00037
00038 virtual ~IStreamAdaptor() {
00039 }
00040
00041 virtual IStream & operator>>(char *str) {
00042 *istr >> str;
00043
00044 return *this;
00045 }
00046
00047 virtual IStream & operator>>(unsigned char *str) {
00048 *istr >> str;
00049
00050 return *this;
00051 }
00052
00053 virtual IStream & operator>>(char **str) {
00054 string inStr;
00055 *istr >> inStr;
00056 *str = new char[inStr.length()+1];
00057 strcpy(*str, inStr.c_str());
00058
00059 return *this;
00060 }
00061
00062 virtual IStream & operator>>(unsigned char **str) {
00063 string inStr;
00064 *istr >> inStr;
00065 char* str2 = new char[inStr.length()+1];
00066 strcpy(str2, inStr.c_str());
00067 *str = reinterpret_cast<unsigned char*>(str2);
00068
00069 return *this;
00070 }
00071
00072 virtual IStream & operator>>(bool& val) {
00073 *istr >> val;
00074 return *this;
00075 }
00076
00077 virtual IStream & operator>>(char& val) {
00078 int temp = 0;
00079 *istr >> temp;
00080 val = (char)val;
00081 return *this;
00082 }
00083
00084 virtual IStream & operator>>(unsigned char& val) {
00085 unsigned int temp = 0;
00086 *istr >> temp;
00087 val = (unsigned char)temp;
00088
00089 return *this;
00090 }
00091
00092 virtual IStream & operator>>(short& val) {
00093 *istr >> val;
00094 return *this;
00095 }
00096
00097 virtual IStream & operator>>(unsigned short& val) {
00098 *istr >> val;
00099 return *this;
00100 }
00101
00102 virtual IStream & operator>>(int& val) {
00103 *istr >> val;
00104 return *this;
00105 }
00106
00107 virtual IStream & operator>>(unsigned int& val) {
00108 *istr >> val;
00109 return *this;
00110 }
00111
00112 virtual IStream & operator>>(long& val) {
00113 *istr >> val;
00114 return *this;
00115 }
00116
00117 virtual IStream & operator>>(unsigned long& val) {
00118 *istr >> val;
00119 return *this;
00120 }
00121
00122 virtual IStream & operator>>(float& val) {
00123 *istr >> val;
00124 return *this;
00125 }
00126
00127 virtual IStream & operator>>(double& val) {
00128 *istr >> val;
00129 return *this;
00130 }
00131
00132 virtual IStream & operator>>(std::string& val) {
00133 *istr >> val;
00134 return *this;
00135 }
00136
00137
00138
00139
00140
00141 virtual IStream & get ( bool ** p, size_t & size ) {
00142 getArrayCreate(*istr, p, size);
00143 return *this;
00144 }
00145
00146 virtual IStream & get ( char ** p, size_t & size ) {
00147 getArrayCreate(*istr, p, size);
00148 return *this;
00149 }
00150
00151 virtual IStream & get ( unsigned char ** p, size_t & size ) {
00152 getArrayCreate(*istr, p, size);
00153 return *this;
00154 }
00155
00156 virtual IStream & get( short ** p, size_t & size ) {
00157 getArrayCreate(*istr, p, size);
00158 return *this;
00159 }
00160
00161 virtual IStream & get( unsigned short ** p, size_t & size ) {
00162 getArrayCreate(*istr, p, size);
00163 return *this;
00164 }
00165
00166 virtual IStream & get( int ** p, size_t & size ) {
00167 getArrayCreate(*istr, p, size);
00168 return *this;
00169 }
00170
00171 virtual IStream & get( unsigned int ** p, size_t & size ) {
00172 getArrayCreate(*istr, p, size);
00173 return *this;
00174 }
00175
00176 virtual IStream & get( long ** p, size_t & size ) {
00177 getArrayCreate(*istr, p, size);
00178 return *this;
00179 }
00180
00181 virtual IStream & get( unsigned long ** p, size_t & size ) {
00182 getArrayCreate(*istr, p, size);
00183 return *this;
00184 }
00185
00186 virtual IStream & get( float ** p, size_t & size ) {
00187 getArrayCreate(*istr, p, size);
00188 return *this;
00189 }
00190
00191 virtual IStream & get( double ** p, size_t & size ) {
00192 getArrayCreate(*istr, p, size);
00193 return *this;
00194 }
00195
00196 virtual IStream & get( std::string ** p, size_t & size ) {
00197 getArrayCreate(*istr, p, size);
00198 return *this;
00199 }
00200
00201
00202
00203
00204 virtual IStream & get( bool * const p, const size_t size ) {
00205 getArrayNoCreate(*istr, p, size);
00206 return *this;
00207 }
00208
00209 virtual IStream & get( char * const p, const size_t size ) {
00210 getArrayNoCreate(*istr, p, size);
00211 return *this;
00212 }
00213
00214 virtual IStream & get( unsigned char * const p, const size_t size ) {
00215 getArrayNoCreate(*istr, p, size);
00216 return *this;
00217 }
00218
00219 virtual IStream & get( short * const p, const size_t size ) {
00220 getArrayNoCreate(*istr, p, size);
00221 return *this;
00222 }
00223
00224 virtual IStream & get( unsigned short * const p, const size_t size ) {
00225 getArrayNoCreate(*istr, p, size);
00226 return *this;
00227 }
00228
00229 virtual IStream & get( int * const p, const size_t size ) {
00230 getArrayNoCreate(*istr, p, size);
00231 return *this;
00232 }
00233
00234 virtual IStream & get( unsigned int * const p, const size_t size ) {
00235 getArrayNoCreate(*istr, p, size);
00236 return *this;
00237 }
00238
00239 virtual IStream & get( long * const p, const size_t size ) {
00240 getArrayNoCreate(*istr, p, size);
00241 return *this;
00242 }
00243
00244 virtual IStream & get( unsigned long * const p, const size_t size ) {
00245 getArrayNoCreate(*istr, p, size);
00246 return *this;
00247 }
00248
00249 virtual IStream & get( float * const p, const size_t size ) {
00250 getArrayNoCreate(*istr, p, size);
00251 return *this;
00252 }
00253
00254 virtual IStream & get( double * const p, const size_t size ) {
00255 getArrayNoCreate(*istr, p, size);
00256 return *this;
00257 }
00258
00259 virtual IStream & get( std::string * const p, const size_t size ) {
00260 getArrayNoCreate(*istr, p, size);
00261 return *this;
00262 }
00263
00264
00265
00266
00267 private:
00268 istream *istr;
00269 IStreamAdaptor();
00270 };
00271
00272 template<typename T>
00273 inline void getArray(istream& istr, T* p, size_t size, size_t actualSize) {
00274 size_t copySize = min(size, actualSize);
00275 for (unsigned int i=0; i<copySize; ++i) {
00276 istr >> p[i];
00277 }
00278 for (unsigned int i=size; i<actualSize; ++i) {
00279 T temp;
00280 istr >> temp;
00281 }
00282 }
00283
00284 inline void getArray(istream& istr, char* p, size_t size, size_t actualSize) {
00285 int temp;
00286 size_t copySize = min(size, actualSize);
00287 for (unsigned int i=0; i<copySize; ++i) {
00288 istr >> temp;
00289 p[i] = (char)temp;
00290 }
00291 for (unsigned int i=size; i<actualSize; ++i) {
00292 istr >> temp;
00293 }
00294 }
00295
00296 inline void getArray(istream& istr, unsigned char* p, size_t size, size_t actualSize) {
00297 int temp;
00298 size_t copySize = min(size, actualSize);
00299 for (unsigned int i=0; i<copySize; ++i) {
00300 istr >> temp;
00301 p[i] = (unsigned char)temp;
00302 }
00303 for (unsigned int i=size; i<actualSize; ++i) {
00304 istr >> temp;
00305 }
00306 }
00307
00308
00309 template<typename T>
00310 inline void getArrayCreate(istream& istr, T** p, size_t& size) {
00311 istr >> size;
00312 *p = new T[size];
00313 getArray(istr, *p, size, size);
00314 }
00315
00316 template<typename T>
00317 inline void getArrayNoCreate(istream& istr, T* p, size_t size) {
00318 size_t actualSize = 0;
00319 istr >> actualSize;
00320 getArray(istr, p, size, actualSize);
00321 }
00322
00323 }
00324 #endif //SCT_ISTREAMADAPTOR_H