Example of reading and saving configuration files using Laral Utilities

This is an example of how to read and write configuration files

#include "configuration/configurationparameters.h"
#include "configuration/inifilesupport.h"
#include "configuration/evorobotfilesupport.h"
#include <iostream>
#include <QDebug>

// Prints to stdout num tab characters and returns the stream
std::ostream& indent(int num, std::ostream &outStream)
{
    for (int i = 0; i < num; i++) {
        outStream << '\t';
    }

    return outStream;
}

// A function for printing parameters
void printParameters( const ConfigurationParameters& confs, std::ostream &outStream, int level=0, QString group = "" )
{
    indent(level, outStream) << "GROUP: " << group.section('/',1).toAscii().data() << '\n';
    QStringList paramList = confs.getParametersList( group );
    bool noparams = true;
    foreach( QString param, paramList ) {
        indent(level, outStream) << "- " << param.toAscii().data() << " = " << confs.getValue( group+"/"+param ).toAscii().data() << '\n';
        noparams = false;
    }
    if ( noparams ) {
        indent(level, outStream) << "{NO PARAMETERS}" << '\n';
    }
    QStringList groupsList = confs.getGroupsList( group );
    foreach( QString subgroup, groupsList ) {
        printParameters( confs, outStream, level+1, group+"/"+subgroup );
    }
    return;
}

int main(int argc, char* argv[])
{
    // We expect the name of the file to read on the command line
    if (argc != 4) {
        std::cerr << "Usage: " << argv[0] << " <infile> <outfile> <0|1>" << std::endl;
        std::cerr << "where 0 means case insensitive mode, 1 case sensitive mode. File format is guessed from file extension" << std::endl;

        return 1;
    }

    const bool caseSensitive = (argv[3][0] == '1') ? true : false;

    // Creating a configuration parameters object
    ConfigurationParameters confs(caseSensitive);

    // Loading parameters. The kind of file is automatically guessed from extension (you can however explicitly set it)
    if (!confs.loadParameters(argv[1])) {
        std::cerr << "Loading parameters from file " << argv[1] << " failed" << std::endl;
    }

    // Printing the complete list of parameters and recursively all sub-groups
    printParameters( confs, std::cout );

    // Getting a parameter
    {
        QString prop = "CROSSOVER/BLU/ciccio";
        std::cout << "READING Parameter" << std::endl;
        QString propVal = confs.getValue(prop);
        if (propVal.isNull()) {
            std::cout << "Parameter " << prop.toAscii().data() << " doesn't exist" << std::endl;
        } else {
            std::cout << prop.toAscii().data() << " = " << propVal.toAscii().data() << std::endl;
        }
    }

    // Modifying a parameter value
    {
        QString prop = "CROSSOVER/BLU/ciccio";
        std::cout << "MODIFYING Parameter" << std::endl;
        bool retval = confs.setValue(prop, "A digiuno");
        if (!retval) {
            std::cout << "Parameter " << prop.toAscii().data() << " doesn't exist" << std::endl;
        }
    }

    // Getting a parameter
    {
        QString prop = "CROSSOVER/BLU/ciccio";
        std::cout << "READING Parameter" << std::endl;
        QString propVal = confs.getValue(prop);
        if (propVal.isNull()) {
            std::cout << "Parameter " << prop.toAscii().data() << " doesn't exist" << std::endl;
        } else {
            std::cout << prop.toAscii().data() << " = " << propVal.toAscii().data() << std::endl;
        }
    }

    // Getting a parameter with alsoMatchParents
    {
        QString prop = "REPRODUCTION/SUB/SUB/nelited";
        std::cout << "READING Parameter" << std::endl;
        QString propVal = confs.getValue(prop, true);
        if (propVal.isNull()) {
            std::cout << "Parameter " << prop.toAscii().data() << " doesn't exist" << std::endl;
        } else {
            std::cout << prop.toAscii().data() << " = " << propVal.toAscii().data() << std::endl;
        }
    }

    // Now saving to file. The kind of file is automatically guessed from extension (you can however explicitly set it)
    if (!confs.saveParameters(argv[2])) {
        std::cerr << "Saving parameters to file " << argv[2] << " failed" << std::endl;
    }

    return 0;
}