Fichier source en cours : FW - CommandLineManager.cpp






Voici le code source cpp :




	//----------------------------------------------------
// 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;
    }
}