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

/** \file  lab06.cpp
    \brief Ejemplo de una clase que mantiene un vector ordenado.

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

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

/// Clase para mantener un vector de valores enteros ordenados.
class ord_int {
public:
    ord_int() : m_n(0) {} ///< Constructor de vector
    ord_int(const ord_int& o); ///< Constructor de copia

    ord_int& operator=(ord_int& o); ///< Copia

    // métodos
    enum { Mx = 5 ///< Capacidad máxima del vector
    };

    /// Retorna \c true cuando ya no le cabe ningún valor más al vector.
    bool lleno() const { return m_n >= Mx; }

    /// Agrega una copia de \c "v" al vector.
    void agregue(int v) { m_v[m_n++] = v; reordene(); }

    /// Retorna la cantidad de valores almacenados en el vector.
    unsigned cardinalidad() const { return m_n; }

    // Retorna una referencia a \c V[n].
    int operator[] (unsigned n) { return m_v[n]; }

private:
    void reordene();

private:
    int      m_v[Mx];  ///< Vector de valores almacenados
    unsigned m_n;      ///< Ultimo componente libre en el vector \c "m_v"
}; // ord_int

///  Reordena el valor de \c "this->m_v[]", de manera que quede ordenado.
///  \pre Se supone que los valores <code> m_v[0]...v[m_n-2] </code> ya están en orden.
void ord_int::reordene() {
    for (int i =m_n-2; i>=0; --i) {
       if (m_v[i] > m_v[i+1]) {      // intercambia
           int tmp = m_v[i];
           m_v[i]   = m_v[i+1];
           m_v[i+1] =  tmp;
       }
    }
} // ord_int::reordene()

/// Programa principal.
int main() {
    ord_int V;  // V.ord_int();

    while ( !V.lleno() ) {
        int  m;
        cout << "Agregue otro número: ";
        cin  >> m;   // operator>>(cin, m);

        V.agregue(m);
    }

    for (int i=0; i<V.cardinalidad(); ++i) {
        cout << "V[" << i << "] = ";
        cout << V[i] << " == " << V.operator[](i) << endl;
    }
    //      ... V[i] ...      ... V.operator[](i) ...
    cout << endl;

    return 0;
} // main()

// EOF: lab06.cpp