00001 #ifndef __IO__
00002 #define __IO__
00003
00004 #include <string>
00005 #include <vector>
00006
00007
00008 #include <iostream>
00009 #include <fstream>
00010
00011 #include <sstream>
00012 #include <iomanip>
00013
00014 #ifndef __CINT__
00015 #include <fnmatch.h>
00016 #endif
00017
00018
00028 namespace pftools {
00029 class IO {
00030 private:
00032 std::vector< std::pair< std::string, std::string> > fAllLines;
00033
00035 bool ParseFile(const char* filename);
00036
00038 int fCurline;
00039
00041 std::string fCurkey;
00042
00044 std::string fCurtag;
00045
00046
00047 public:
00049 static const unsigned sLinesize;
00050
00052 IO(const char* filepattern);
00053 ~IO() {fAllLines.clear();}
00054
00056 void Dump(std::ostream& out = std::cout) const;
00057
00059 friend std::ostream& operator<<(std::ostream& out, IO& io);
00060
00062 bool IsZombie() const {return !fAllLines.size();}
00063
00064 #ifndef __CINT__
00066 template <class T>
00067 bool GetOpt(const char* tag, const char* key, std::vector< T >& values) const;
00068
00070 template <class T>
00071 bool GetOpt(const char* tag, const char* key, T& value) const;
00072
00074 bool GetOpt(const char* tag, const char* key, std::string& value) const;
00075
00083 template <class T>
00084 bool GetAllOpt(const char* tag, const char* key, std::vector< T >& values);
00085
00094 template <class T>
00095 bool GetAllOpt(const char* tag, const char* key, T& value);
00096
00097 std::string GetLineData(const char* tag, const char* key) const;
00098 std::string GetNextLineData(const char* tag, const char* key);
00099
00100
00101 #endif
00102 };
00103 }
00104
00105 #ifndef __CINT__
00106
00107 template <class T>
00108 bool pftools::IO::GetOpt(const char* tag, const char* key, std::vector< T >& values) const {
00109 std::string data = GetLineData(tag,key);
00110
00111 std::istringstream in(data.c_str());
00112 while(1) {
00113 T tmp;
00114 in>>tmp;
00115 if(!in) break;
00116 values.push_back(tmp);
00117 }
00118
00119 return true;
00120 }
00121
00122 template <class T>
00123 bool pftools::IO::GetOpt(const char* tag, const char* key, T& value) const {
00124 std::string data = GetLineData(tag,key);
00125
00126 std::istringstream in(data.c_str());
00127 in>>value;
00128 if(in.good()) return true;
00129 else return false;
00130 }
00131
00132 template <class T>
00133 bool pftools::IO::GetAllOpt(const char* tag, const char* key, std::vector< T >& values) {
00134 return false;
00135 }
00136
00137 template <class T>
00138 bool pftools::IO::GetAllOpt(const char* tag, const char* key, T& value) {
00139 std::string data = GetNextLineData(tag, key);
00140 if(data.empty()) return false;
00141
00142 std::istringstream in(data.c_str());
00143 in>>value;
00144 if(in) {
00145 return true;
00146 }
00147 else {
00148 return false;
00149 }
00150 }
00151
00152
00153 #endif // __CINT__
00154
00155 #endif
00156
00157
00158
00159
00160
00161
00162
00163
00164