//----------------------------------------------------
// Auteur : Yoann
// Date de création : Mars 2019
// Description : Gestionnaire des commandes passés à
// l'executable.
//----------------------------------------------------
#include "Framework.h"
using namespace fw;
template<> CommandLineManager* Singleton<CommandLineManager>::ms_instance = nullptr;
/********************************** Déclaration de la classe Parameter **********************************/
// Format : -PARAM ARG1 ARG2...
Parameter::Parameter(const std::string& sName) :
m_sName(sName)
{
}
Parameter::~Parameter()
{
}
// On ajoute les arg1, arg2 à la suite des un et des autres
void Parameter::PushArgument(const std::string& sArgument)
{
m_vArguments.push_back(sArgument);
}
const std::string& Parameter::GetName() const
{
return m_sName;
}
const char* Parameter::GetArgument(uint32 iArgumentNumber) const
{
if (iArgumentNumber < m_vArguments.size())
return m_vArguments[iArgumentNumber].c_str();
else
return UNKNOWN;
}
uint32 Parameter::GetArgumentCount() const
{
return m_vArguments.size();
}
/********************************** Déclaration de la classe CommandLineManager **********************************/
CommandLineManager::CommandLineManager(int argc, char* argv[])
{
ParseCommandLineArguments(argc, argv);
}
CommandLineManager::~CommandLineManager()
{
// Libère les objets paramètre de la mémoire.
std::map<std::string, Parameter*>::iterator it;
for (it = m_vParameters.begin(); it != m_vParameters.end(); ++it)
{
Parameter* pParam = (*it).second;
SAFE_DELETE(pParam);
}
}
void CommandLineManager::ParseCommandLineArguments(uint32 iArgumentCount, char* paArguments[])
{
Parameter* pCurrentParameter = nullptr;
// Exemple de ligne de commande : game.exe -fullscreen -res 800 600 -opengl
for (uint32 i = 0; i < iArgumentCount; ++i)
{
std::string sCurrentArgumentName(paArguments[i]);
// Si on a un nouvel argument qui commence par un '-'.
if (sCurrentArgumentName[0] == '-')
{
// On enlève l'indicateur de paramètre (premier caractère).
sCurrentArgumentName.erase(0, 1);
// On créé un nouveau objet paramètre avec son nom.
pCurrentParameter = new Parameter(sCurrentArgumentName);
// On l'ajoute dans la liste des arguments.
m_vParameters[sCurrentArgumentName] = pCurrentParameter;
}
else if (pCurrentParameter)// C'est peut-être un argument, (paramètre qui ne commence pas par '-').
{
pCurrentParameter->PushArgument(sCurrentArgumentName);
}
}
}
bool CommandLineManager::HasParameter(const std::string& sParameter)
{
return m_vParameters.count(sParameter) > 0;
}
uint32 CommandLineManager::GetParameterCount()
{
return m_vParameters.size();
}
Parameter* CommandLineManager::GetParameter(const std::string& sParameter)
{
if (m_vParameters.count(sParameter) > 0)
{
return m_vParameters[sParameter];
}
else
{
return nullptr;
}
}