IStreamAdaptor.h

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     //cout << "Read: " << str << endl;
00044         return *this;
00045     }
00046 
00047     virtual IStream & operator>>(unsigned char *str) {
00048         *istr >> str;
00049     //cout << "Read: " << str << endl;  
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     //cout << "Read: " << *str << endl; 
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     //cout << "Read: " << *str << endl; 
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     //cout << "ReadUChar: " << (int)val << " at: " << *istr.tellg() << " temp: " << temp << endl;   
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     //    virtual IStream & operator>>(OWLDate& val) = 0;
00138     //    virtual IStream & operator>>(OWLTime& val) = 0;
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     //    virtual IStream & get( OWLDate ** p, size_t & size ) = 0;
00202     //    virtual IStream & get( OWLTime ** p, size_t & size ) = 0;
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     //    virtual IStream & get( OWLDate * const p, const size_t size ) = 0;
00265     //    virtual IStream & get( OWLTime * const p, const size_t size ) = 0;
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

Generated on Mon Feb 6 14:01:22 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6