todo : refaire le stream reset avec une méthode
Intro :
Parfois il est utile de regrouper des paramètres ensemble afin de les échanger entre modules.
Explications :
Voici le fichier DataParameters.h :
#ifndef DATA_PARAMETERS_H
#define DATA_PARAMETERS_H
#include <string>
#include <map>
class DataParameters
{
public:
// Différents types de variables à stocker
struct Param { int i; float f; std::string s; };
DataParameters();
virtual ~DataParameters();
// Premier numéro d'index (c'est-à-dire le numéro 0)
DataParameters(int param);
DataParameters(float param);
DataParameters(char* param);
DataParameters(const std::string& sParam);
// Par nom
DataParameters(const std::string& sParamName, int param);
DataParameters(const std::string& sParamName, float param);
DataParameters(const std::string& sParamName, const char* param);
DataParameters(const std::string& sParamName, const std::string& sParam);
/******************/
// Par nom
void setParam(const std::string& sParamName, int param);
void setParam(const std::string& sParamName, float param);
void setParam(const std::string& sParamName, const char* param);
void setParam(const std::string& sParamName, const std::string& sParam);
// Par index
void pushParam(int param);
void pushParam(float param);
void pushParam(const char* param);
void pushParam(const std::string& param);
Param* getParameter(const std::string& sParamName);
int getParameterAsInt(const std::string& sParamName);
float getParameterAsFloat(const std::string& sParamName);
const char* getParameterAsString(const std::string& sParamName);
// Par accès au premier argument
Param* getFirstParameter();
int getFirstParameterAsInt();
float getFirstParameterAsFloat();
const char* getFirstParameterAsString();
unsigned int getParamNumber();
// Opérateurs >> flux pour lire les données
DataParameters& operator >>(bool& data);
DataParameters& operator >>(int& data);
DataParameters& operator >>(unsigned int& data);
DataParameters& operator >>(float& data);
DataParameters& operator >>(char* data);
DataParameters& operator >>(std::string& data);
// Opérateurs << flux pour écrire des données
DataParameters& operator <<(bool data);
DataParameters& operator <<(int data);
DataParameters& operator <<(unsigned int data);
DataParameters& operator <<(float data);
DataParameters& operator <<(char* data);
DataParameters& operator <<(std::string data);
std::map<std::string, Param>& GetParameters();
// Variable pour réinitialiser les flux sortants
static char* StreamReset;
private:
// Liste des paramètres
std::map<std::string, Param> m_params;
// Numéro de paramètre courant
unsigned int m_iIndex;
// Position de lecture du stream courant
unsigned int m_iCurrentStreamPos;
};
#endif
Voici le fichier .cpp :
#include "DataParameters.h"
/********************************* Class DataParameters *********************************/
char* DataParameters::StreamReset = "StreamReset";
DataParameters::DataParameters() :
m_iIndex(0),
m_iCurrentStreamPos(0)
{
}
DataParameters::~DataParameters()
{
m_params.clear();
}
DataParameters::DataParameters(int param) :
m_iIndex(0),
m_iCurrentStreamPos(0)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].i = param;
m_iIndex++;
}
DataParameters::DataParameters(float param) :
m_iIndex(0),
m_iCurrentStreamPos(0)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].f = param;
m_iIndex++;
}
DataParameters::DataParameters(char* param) :
m_iIndex(0),
m_iCurrentStreamPos(0)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].s = param;
m_iIndex++;
}
DataParameters::DataParameters(const std::string& param) :
m_iIndex(0),
m_iCurrentStreamPos(0)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].s = param;
m_iIndex++;
}
/******* Par nom *******/
DataParameters::DataParameters(const std::string& sParamName, int param)
{
m_params[sParamName].i = param;
}
DataParameters::DataParameters(const std::string& sParamName, float param)
{
m_params[sParamName].f = param;
}
DataParameters::DataParameters(const std::string& sParamName, const char* param)
{
m_params[sParamName].s = param;
}
DataParameters::DataParameters(const std::string& sParamName, const std::string& sParam)
{
m_params[sParamName].s = sParam;
}
/**********************************/
void DataParameters::setParam(const std::string& sParamName, int param)
{
m_params[sParamName].i = param;
}
void DataParameters::setParam(const std::string& sParamName, float param)
{
m_params[sParamName].f = param;
}
void DataParameters::setParam(const std::string& sParamName, const char* param)
{
m_params[sParamName].s = param;
}
void DataParameters::setParam(const std::string& sParamName, const std::string& param)
{
m_params[sParamName].s = param;
}
/*************** Getters ***************/
int DataParameters::getParameterAsInt(const std::string& sParamName)
{
if (m_params.count(sParamName) > 0)
{
return m_params[sParamName].i;
}
return 0;
}
float DataParameters::getParameterAsFloat(const std::string& sParamName)
{
if (m_params.count(sParamName) > 0)
{
return m_params[sParamName].f;
}
return 0.0f;
}
const char* DataParameters::getParameterAsString(const std::string& sParamName)
{
if (m_params.count(sParamName) > 0)
{
return m_params[sParamName].s.c_str();
}
return nullptr;
}
DataParameters::Param* DataParameters::getParameter(const std::string& sParamName)
{
if (m_params.count(sParamName) > 0)
{
return &m_params[sParamName];
}
return nullptr;
}
std::map<std::string, DataParameters::Param>& DataParameters::GetParameters()
{
return m_params;
}
/*************** Getters sans paramètres ***************/
int DataParameters::getFirstParameterAsInt()
{
if (m_params.count("0") > 0)
{
return m_params["0"].i;
}
return 0;
}
float DataParameters::getFirstParameterAsFloat()
{
if (m_params.count("0") > 0)
{
return m_params["0"].f;
}
return 0.0f;
}
const char* DataParameters::getFirstParameterAsString()
{
if (m_params.count("0") > 0)
{
return m_params["0"].s.c_str();
}
return nullptr;
}
DataParameters::Param* DataParameters::getFirstParameter()
{
if (m_params.count("0") > 0)
{
return &m_params["0"];
}
return nullptr;
}
unsigned int DataParameters::getParamNumber()
{
return m_params.size();
}
/****************/
void DataParameters::pushParam(int param)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].i = param;
m_iIndex++;
}
void DataParameters::pushParam(float param)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].f = param;
m_iIndex++;
}
void DataParameters::pushParam(const char* param)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].s = param;
m_iIndex++;
}
void DataParameters::pushParam(const std::string& param)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].s = param;
m_iIndex++;
}
//----------------------------------------
// Opérateurs >> pour lire les données
//----------------------------------------
DataParameters& DataParameters::operator >>(bool& data)
{
std::string sParamName = std::to_string(m_iCurrentStreamPos);
if (m_params.count(sParamName) > 0)
{
data = (m_params[sParamName].i == 0) ? 0 : 1;
m_iCurrentStreamPos++;
}
else
{
data = false;
}
return *this;
}
DataParameters& DataParameters::operator >>(int& data)
{
std::string sParamName = std::to_string(m_iCurrentStreamPos);
if (m_params.count(sParamName) > 0)
{
data = m_params[sParamName].i;
m_iCurrentStreamPos++;
}
else
{
data = 0;
}
return *this;
}
DataParameters& DataParameters::operator >>(unsigned int & data)
{
std::string sParamName = std::to_string(m_iCurrentStreamPos);
if (m_params.count(sParamName) > 0)
{
data = m_params[sParamName].i;
m_iCurrentStreamPos++;
}
else
{
data = 0;
}
return *this;
}
DataParameters& DataParameters::operator >>(float& data)
{
std::string sParamName = std::to_string(m_iCurrentStreamPos);
if (m_params.count(sParamName) > 0)
{
data = m_params[sParamName].f;
m_iCurrentStreamPos++;
}
else
{
data = 0.0f;
}
return *this;
}
DataParameters& DataParameters::operator >>(char* data)
{
std::string sParamName = std::to_string(m_iCurrentStreamPos);
if (m_params.count(sParamName) > 0)
{
data = (char*)m_params[sParamName].s.c_str();
m_iCurrentStreamPos++;
}
else
{
data = "";
}
return *this;
}
DataParameters& DataParameters::operator >>(std::string& data)
{
std::string sParamName = std::to_string(m_iCurrentStreamPos);
if (m_params.count(sParamName) > 0)
{
data = m_params[sParamName].s;
m_iCurrentStreamPos++;
}
else
{
data = "";
}
return *this;
}
//----------------------------------------
// Opérateurs << pour écrire des données
//----------------------------------------
DataParameters& DataParameters::operator <<(bool data)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].i = data;
m_iIndex++;
return *this;
}
DataParameters& DataParameters::operator <<(int data)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].i = data;
m_iIndex++;
return *this;
}
DataParameters& DataParameters::operator <<(unsigned int data)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].i = data;
m_iIndex++;
return *this;
}
DataParameters& DataParameters::operator <<(float data)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].f = data;
m_iIndex++;
return *this;
}
DataParameters& DataParameters::operator <<(char* data)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].s = data;
m_iIndex++;
if (data == "StreamReset")
{
m_iCurrentStreamPos = 0;
}
return *this;
}
DataParameters& DataParameters::operator <<(std::string data)
{
std::string sParamName = std::to_string(m_iIndex);
m_params[sParamName].s = data;
m_iIndex++;
return *this;
}
Résumé :
Nous avons présenté un objet rassemblant des données pouvant être de différents types.
Avec les flux << et >> nous avons intégré une technique plus simple pour échanger des données.
