00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef AlpsParameters_h
00024 #define AlpsParameters_h
00025
00026
00027
00028
00029
00030 #include <algorithm>
00031 #include <cctype>
00032 #include <cstdio>
00033 #include <fstream>
00034 #include <iostream>
00035 #include <string>
00036 #include <utility>
00037 #include <vector>
00038
00039 #include "CoinError.hpp"
00040
00041 #if defined(__GNUC__) && (__GNUC__ >= 3)
00042 # include <sstream>
00043 # include <locale>
00044 # define ALPS_STRINGSTREAM std::istringstream
00045 #else
00046 # include <strstream>
00047 # include <cctype>
00048 # define ALPS_STRINGSTREAM std::istrstream
00049 #endif
00050
00051 class AlpsEncoded;
00052
00053
00054
00056 enum AlpsParameterT{
00059 AlpsNoPar,
00061 AlpsBoolPar,
00063 AlpsIntPar,
00065 AlpsDoublePar,
00067 AlpsStringPar,
00070 AlpsStringArrayPar
00071 };
00072
00073
00074
00077 class AlpsParameter {
00078
00079 private:
00083 AlpsParameterT type_;
00085 int index_;
00088 public:
00089
00093 AlpsParameter() : type_(AlpsNoPar), index_(0) {}
00095 AlpsParameter(const AlpsParameterT t, const int i) :
00096 type_(t), index_(i) {}
00098 ~AlpsParameter() {}
00104 AlpsParameterT type() const { return type_; }
00107 int index() const { return index_; }
00109 };
00110
00111
00112
00134 class AlpsParameterSet {
00135 protected:
00140 std::vector< std::pair<std::string, AlpsParameter> > keys_;
00141
00144 std::vector<std::string> obsoleteKeys_;
00145
00147 bool* bpar_;
00148
00150 int* ipar_;
00151
00153 double* dpar_;
00154
00156 std::string* spar_;
00157
00159 int numSa_;
00160 std::vector<std::string>* sapar_;
00161
00163
00164
00165 public:
00172 virtual void createKeywordList() = 0;
00173
00175 virtual void setDefaultEntries() = 0;
00182 virtual void pack(AlpsEncoded& buf) {
00183 throw CoinError("can't call pack()", "pack", " AlpsParameterSet");
00184 }
00185
00187 virtual void unpack(AlpsEncoded& buf){
00188 throw CoinError("can't call unpack()", "unpack", " AlpsParameterSet");
00189 }
00191
00192
00193
00194 public:
00195
00204
00205 void setEntry(const AlpsParameter key, const char * val) {
00206 switch (key.type()){
00207 case AlpsNoPar: break;
00208 case AlpsBoolPar: bpar_ [key.index()] = atoi(val) ? true : false; break;
00209 case AlpsIntPar: ipar_ [key.index()] = atoi(val); break;
00210 case AlpsDoublePar: dpar_ [key.index()] = atof(val); break;
00211 case AlpsStringPar: spar_ [key.index()] = val; break;
00212 case AlpsStringArrayPar: sapar_[key.index()].push_back(val); break;
00213 }
00214 }
00215
00229 void readFromStream(std::istream& parstream);
00230
00232 void readFromFile(const char * paramfile);
00233
00235 void readFromArglist(const int argnum, const char * const * arglist);
00236
00240 void writeToStream(std::ostream& outstream) const;
00241
00243 AlpsParameterSet(int c, int i, int d, int s, int sa) :
00244 keys_(),
00245 bpar_(new bool[c]),
00246 ipar_(new int[i]),
00247 dpar_(new double[d]),
00248 spar_(new std::string[s]),
00249 sapar_(new std::vector<std::string>[sa])
00250 {}
00251
00253 virtual ~AlpsParameterSet() {
00254 keys_.clear();
00255 obsoleteKeys_.clear();
00256 delete[] bpar_; bpar_ = 0;
00257 delete[] ipar_; ipar_ = 0;
00258 delete[] dpar_; dpar_ = 0;
00259 delete[] spar_; spar_ = 0;
00260 delete[] sapar_; sapar_ = 0;
00261 }
00262 };
00263
00264 #endif