Refactoring louloulibs and cmake

Use OBJECT libraries
Remove the louloulibs directory
Write FOUND variables in the cache
This commit is contained in:
louiz’
2017-03-14 21:45:23 +01:00
parent 2d3806152e
commit 0ab40dc1ab
77 changed files with 219 additions and 280 deletions
+103
View File
@@ -0,0 +1,103 @@
#include <config/config.hpp>
#include <iostream>
#include <cstring>
#include <cstdlib>
std::string Config::filename{};
std::map<std::string, std::string> Config::values{};
std::vector<t_config_changed_callback> Config::callbacks{};
std::string Config::get(const std::string& option, const std::string& def)
{
auto it = Config::values.find(option);
if (it == Config::values.end())
return def;
return it->second;
}
int Config::get_int(const std::string& option, const int& def)
{
std::string res = Config::get(option, "");
if (!res.empty())
return std::atoi(res.c_str());
else
return def;
}
void Config::set(const std::string& option, const std::string& value, bool save)
{
Config::values[option] = value;
if (save)
{
Config::save_to_file();
Config::trigger_configuration_change();
}
}
void Config::connect(t_config_changed_callback callback)
{
Config::callbacks.push_back(callback);
}
void Config::clear()
{
Config::values.clear();
}
/**
* Private methods
*/
void Config::trigger_configuration_change()
{
std::vector<t_config_changed_callback>::iterator it;
for (it = Config::callbacks.begin(); it < Config::callbacks.end(); ++it)
(*it)();
}
bool Config::read_conf(const std::string& name)
{
if (!name.empty())
Config::filename = name;
std::ifstream file(Config::filename.data());
if (!file.is_open())
{
std::cerr << "Error while opening file " << filename << " for reading: " << strerror(errno) << std::endl;
return false;
}
Config::clear();
std::string line;
size_t pos;
std::string option;
std::string value;
while (file.good())
{
std::getline(file, line);
if (line == "" || line[0] == '#')
continue ;
pos = line.find('=');
if (pos == std::string::npos)
continue ;
option = line.substr(0, pos);
value = line.substr(pos+1);
Config::values[option] = value;
}
return true;
}
void Config::save_to_file()
{
std::ofstream file(Config::filename.data());
if (file.fail())
{
std::cerr << "Could not save config file." << std::endl;
return ;
}
for (const auto& it: Config::values)
file << it.first << "=" << it.second << '\n';
}
+93
View File
@@ -0,0 +1,93 @@
/**
* Read the config file and save all the values in a map.
* Also, a singleton.
*
* Use Config::filename = "bla" to set the filename you want to use.
*
* If you want to exit if the file does not exist when it is open for
* reading, set Config::file_must_exist = true.
*
* Config::get() can then be used to access the values in the conf.
*
* Use Config::close() when you're done getting/setting value. This will
* save the config into the file.
*/
#pragma once
#include <functional>
#include <fstream>
#include <memory>
#include <vector>
#include <string>
#include <map>
typedef std::function<void()> t_config_changed_callback;
class Config
{
public:
Config() = default;
~Config() = default;
Config(const Config&) = delete;
Config& operator=(const Config&) = delete;
Config(Config&&) = delete;
Config& operator=(Config&&) = delete;
/**
* returns a value from the config. If it doesn’t exist, use
* the second argument as the default.
*/
static std::string get(const std::string&, const std::string&);
/**
* returns a value from the config. If it doesn’t exist, use
* the second argument as the default.
*/
static int get_int(const std::string&, const int&);
/**
* Set a value for the given option. And write all the config
* in the file from which it was read if save is true.
*/
static void set(const std::string&, const std::string&, bool save = false);
/**
* Adds a function to a list. This function will be called whenever a
* configuration change occurs (when set() is called, or when the initial
* conf is read)
*/
static void connect(t_config_changed_callback);
/**
* Destroy the instance, forcing it to be recreated (with potentially
* different parameters) the next time it’s needed.
*/
static void clear();
/**
* Read the configuration file at the given path.
*/
static bool read_conf(const std::string& name="");
/**
* Get the filename
*/
static const std::string& get_filename()
{ return Config::filename; }
private:
/**
* Set the value of the filename to use, before calling any method.
*/
static std::string filename;
/**
* Write all the config values into the configuration file
*/
static void save_to_file();
/**
* Call all the callbacks previously registered using connect().
* This is used to notify any class that a configuration change occured.
*/
static void trigger_configuration_change();
static std::map<std::string, std::string> values;
static std::vector<t_config_changed_callback> callbacks;
};