00001
00002
00004 #ifndef __IO__
00005 #define __IO__
00006
00007 #include "CUtils.h"
00008
00009 using namespace std;
00010
00016 class IO {
00017
00018 private:
00019
00020 vector< pair<string,string> > fAllLines;
00021
00022
00023 bool ParseFile(const char* filename);
00024
00025
00026 int fCurline;
00027
00028
00029 string fCurkey;
00030
00031
00032 string fCurtag;
00033
00034
00035 static const unsigned sLinesize;
00036
00037 public:
00038
00039
00060 IO(const char* filepattern);
00061
00065 virtual ~IO(void) {fAllLines.clear();}
00066
00077 void Dump(ostream& out = cout) const;
00078
00083 inline bool IsZombie(void) const {return !fAllLines.size();}
00084
00085 friend ostream& operator<<(ostream& out, IO& io);
00086
00095 template <class T>
00096 bool GetOpt(const char* tag, const char* key, vector< T >& values) const;
00097
00106 template <class T>
00107 bool GetOpt(const char* tag, const char* key, T& value) const;
00108
00117 bool GetOpt(const char* tag, const char* key, string& value) const;
00118
00125 string GetLineData(const char* tag, const char* key) const;
00126
00135 template <class T>
00136 bool GetAllOpt(const char* tag, const char* key, vector< T >& values);
00145 template <class T>
00146 bool GetAllOpt(const char* tag, const char* key, T& value);
00147
00148
00155 string GetNextLineData(const char* tag, const char* key);
00156
00157 };
00158
00159 template <class T>
00160 bool IO::GetOpt(const char* tag, const char* key, vector< T >& values) const {
00161 string data = GetLineData(tag,key);
00162
00163 istringstream in(data.c_str());
00164 while(1) {
00165 T tmp;
00166 in>>tmp;
00167 if(!in) break;
00168 values.push_back(tmp);
00169 }
00170
00171 return (bool)values.size();
00172 }
00173
00174 template <class T>
00175 bool IO::GetOpt(const char* tag, const char* key, T& value) const {
00176 string data = GetLineData(tag,key);
00177
00178 istringstream in(data.c_str());
00179 in>>value;
00180 return (!!in)*data.size();
00181 }
00182
00183 template <class T>
00184 bool IO::GetAllOpt(const char* tag, const char* key, vector< T >& values) {
00185
00186 string data;
00187 T tmp;
00188 while(1) {
00189 data=GetNextLineData(tag, key);
00190 if(!data.compare("")) break;
00191 istringstream inval(data.c_str());
00192 while(1) {
00193 inval>>tmp;
00194 if(!inval) break;
00195 values.push_back(tmp);
00196 }
00197 inval.clear();
00198 }
00199
00200 return (bool)values.size();
00201 }
00202
00203 template <class T>
00204 bool IO::GetAllOpt(const char* tag, const char* key, T& value) {
00205 string data = GetNextLineData(tag, key);
00206 if(data.empty()) return false;
00207
00208 istringstream in(data.c_str());
00209 in>>value;
00210 if(in) {
00211 return true;
00212 }
00213 else {
00214 return false;
00215 }
00216 }
00217
00218 #endif