// lab09.cpp  (c) 2000 adolfo@di-mare.com

/** \file  lab09.cpp
    \brief Este programa implementa y usa una clase para clasificar edades:
    - niño
    - joven
    - adulto
    - roquito
    - quechito

    \author Adolfo Di Mare <adolfo@di-mare.com>
    \date   2000
*/


#include <iostream> // #include <iostream.h>
#include <bool.h>

/// Almacena la cantidad de años de una persona.
class Edad {
private:
    int m_ano; ///< Cantidad de años
public:
    // constructores
    Edad() : m_ano(0) {} ///< Constructor por defecto
    Edad(const Edad& o) : m_ano(o.m_ano) {} ///< Constructor de copia
    Edad(int a) : m_ano(a) {} ///< Constructor a partir del año \c "a"

    /// Copia.
    Edad& operator= (const Edad& o) { m_ano = o.m_ano; return *this; }
    int get() const { return m_ano; } ///< Obtiene el año almacenado
    void set(int ano) { m_ano = ano; } ///< Cambia a \c "ano" el valor almacenado

    const char* grupo();
}; // Edad

#define DIM(v) ( sizeof(v) / sizeof(*v) )

/// Retorna el grupo al que corresponde la edad que representa el año.
const char* Edad::grupo() {
    const char* nombre[] = { "niño", "joven", "adulto", "roquito","quechito" };
    const int   edad[]   = {    12,      21,       45,        65,        90  };

    for (int i=0; i<DIM(edad); ++i) {
        if ( m_ano <= edad[i] ) {
            return nombre[i];
        }
    }
    return nombre[DIM(edad)-1];
} // Edad::grupo()

/// <code> ¿ l == r </code>
inline bool operator == (const Edad& l, const Edad& r) {
    return l.get() == r.get();
}
/// <code> ¿ l != r </code>
inline bool operator != (const Edad& l, const Edad& r) {
    return !( l==r);
}

/// Lee del flujo de entrada \c "CIN" el nuevo valor para \c "e".
istream& operator>> (istream& CIN, Edad& e) {
    int n;
    CIN >> n;
    e.set(n);

    return CIN;
} // operator>> ()

/// Programa principal.
int main() {
    Edad A = 13;
    while (A != 0) {
        cout << "Dígame su edad ";
        cin >> A;
        cout << "Hola " << A.grupo() << endl;
    }

    return 0;
} // main()

// EOF: lab09.cpp