Zależy mi najbardziej na wydajności zapisu i odczytu
Chciałbym aby klucz posiadał wartość domyślna
I aby można było przechowywać różne typy danych
Problem: dla każdego typu danych muszę dodać kolejny std::map
Zastanawiam się jak to zrobić lepiej ?
#include <iostream>
#include <map>
// identyfikoator + domyslna wartość
template <typename T>
struct ConfigKey
{
std::string_view id;
T def;
bool operator < (const ConfigKey & that) const
{
return id < that.id;
}
};
template <typename T>
struct ConfigKey_with_min_max
{
std::string_view id;
T def;
T _min;
T _max;
bool operator < (const ConfigKey_with_min_max & that) const
{
return id < that.id;
}
};
class Config
{
private:
std::map<ConfigKey<int>, int> configInt;
std::map<ConfigKey<double>, double> configDouble;
std::map<ConfigKey<std::string>, std::string> configString;
std::map<ConfigKey_with_min_max<int>, int> configInt_min_max;
public:
int read(ConfigKey<int> &id)
{
if(configInt.find(id) == configInt.end()) return id.def;
return configInt[id];
}
double read(ConfigKey<double> &id)
{
if(configDouble.find(id) == configDouble.end()) return id.def;
return configDouble[id];
}
std::string read(ConfigKey<std::string> &id)
{
if(configString.find(id) == configString.end()) return id.def;
return configString[id];
}
//
void write(ConfigKey<int> &id, int value){configInt[id]=value;}
void write(ConfigKey<double> &id, double value){configDouble[id]=value;}
void write(ConfigKey<std::string> &id, std::string value){configString[id]=value;}
};
// klucze
ConfigKey<int> CFG_INT_WIDTH{"gui.width",200};
ConfigKey<int> CFG_INT_HEIGHT{"gui.height",100};
ConfigKey<double> CFG_DOUBLE_SCALE{"gui.scale", 0.75};
ConfigKey<std::string> CFG_STRING_CAPTION{"gui.caption","Hi Hi Hi"};
ConfigKey_with_min_max<int> CFG_INT_RANGE{"gui.range",100,10,1000};
int main(int, char**) {
Config c;
std::cout << "***** Default values *****\n";
std::cout << "CFG_INT_WIDTH: " << c.read(CFG_INT_WIDTH) <<"\n";
std::cout << "CFG_INT_HEIGHT: " << c.read(CFG_INT_HEIGHT) <<"\n";
std::cout << "CFG_DOUBLE_SCALE: " << c.read(CFG_DOUBLE_SCALE) <<"\n";
std::cout << "CFG_STRING_CAPTION: " << c.read(CFG_STRING_CAPTION) <<"\n";
c.write(CFG_INT_WIDTH,333);
c.write(CFG_INT_HEIGHT,444);
c.write(CFG_DOUBLE_SCALE,333.33);
c.write(CFG_STRING_CAPTION,"333.3333");
std::cout << "***** After update value *****\n";
std::cout << "CFG_INT_WIDTH: " << c.read(CFG_INT_WIDTH) <<"\n";
std::cout << "CFG_INT_HEIGHT: " << c.read(CFG_INT_HEIGHT) <<"\n";
std::cout << "CFG_DOUBLE_SCALE: " << c.read(CFG_DOUBLE_SCALE) <<"\n";
std::cout << "CFG_STRING_CAPTION: " << c.read(CFG_STRING_CAPTION) <<"\n";
}