/**
*
* @File : StrToUpper.cxx
*
* @Authors : D. Mathieu
*
* @Date : 06/03/2001
*
* @Version : V1.0
*
* @Synopsis :  Test
*
*/
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <cstring>           // toupper()

using namespace std;

namespace nsUtil
{
    // Str doit être une donnée-résultat

    void StrToUpper (string & Str)
    {
        for (string::size_type i (Str.size ()); i--; )
            Str [i] = toupper (Str [i]);

    } // StrToUpper()

    void Essai_01 (void)
    {
        string S1 = "CouCou c'est Moi";
        string S2;
        StrToUpper (S1);
        StrToUpper (S2);

        cout << "S1 = " << S1 << endl;
        cout << "S2 = " << S2 << endl;

    } // Essai_01()

    // Le profil de la fonction doit être le même que StrToUpper() pour
    //     permettre les mêmes opérations. Pour ne pas créer d'objet
    //     intermédiaire lors de l'exécution de l'instruction :
    //
    //     return Str;
    //
    //     il est nécessaire que la fonction renvoie une référence.

    string & StrToUpper2 (string & Str)
    {
        for (string::size_type i (Str.size ()); i--; )
            Str [i] = toupper (Str [i]);

        return Str;

    } // StrToUpper2()

    void Essai_02 (void)
    {
        string S1 = "CouCou c'est Moi";
        string S2 = StrToUpper2 (S1);

        cout << "S2 = " << StrToUpper2 (S2) << endl;
        cout << "S2 = " << StrToUpper2 (S2) << endl;

        // string S3 = StrToUpper2 ("CouCou c'est Moi");

        // Cette ligne ne devrait pas passer à la compilation car :
        //     - le paramètre formel de StrToUpper() est une donnée-résultat,
        //     - le paramètre effectif est une constante NTCTS, transformée
        //       en string par le compilateur

    } // Essai_02()

} // namespace nsUtil

using namespace nsUtil;

int main (void)
{
    /*  */ Essai_01 (); /* */
    /*  */ Essai_02 (); /* */

    return 0;

} // main()