/** @(#) mathpos/array1dpos.h */ #ifndef ARRAY1DPOS_H #define ARRAY1DPOS_H //---------------------------------------------------------------------------- #include <iostream> #include <string> #include <stdexcept> // runtime_error using namespace std; /** * Reservar memoria. * No hace operaciones aritmeticas. * Entrada y salida de arreglos. * @author Omar Posada Villarreal * @version 1.1, 24/04/2002 first [-N, +N] * @version 1.0, 13/04/2002 */ template <class TC> class Array1DPos { //---------------------------------------------------------------------------- private: /** Apuntador a [first]. */ TC *pCorner; /** Apuntador a [0]. */ TC *pOrigin; /** Numero de elementos. */ int size; /** Indice del primer elemento. */ int first; /** Indice del ultimo elemento. */ int last; //---------------------------------------------------------------------------- public: // constructor, ~, friend----------------------------------------------------- /** * Reserva memoria para un arreglo unidimensional que permite indices negativos. * Uso: * Array1DPos<double> V(n); * @param theFirst [-N, +N] theFirst <= theLast. * @param theLast [-N, +N] */ // templates solo en *.h Array1DPos(int theFirst, int theLast) throw (invalid_argument, runtime_error) { // valida if (theFirst > theLast) { throw invalid_argument("Array1DPos: indices invertidos"); } first = theFirst; last = theLast; // Num de elem size = last - first + 1; // pCorner pCorner = new TC[size]; // pOrigin pOrigin = &(pCorner[ -first]); // IMPORTANTE Previene underflow del apuntador pOrigin // si first > 0, pOrigin < pCorner if (first > 0) { if (pOrigin > pCorner) { throw runtime_error( "Array1DPos: apuntador ArrayOrigin negativo."); } } } /** Por omision, se usa logica 0. */ Array1DPos(int theSize) throw (invalid_argument) { if (theSize < 1) { throw invalid_argument("Array1DPos: indices no positivos"); } Array1DPos(0, theSize - 1); } /** Libera memoria de un arreglo unidimensional. */ // templates solo en *.h ~Array1DPos() { deleteArray(); } void deleteArray() { delete[] pOrigin; delete[] pCorner; //cout << "} ~Array1DPos()"; } // inline--------------------------------------------------------------------- inline TC *getArrayOrigin() const { return pOrigin; } inline int getSize() const { return size; } inline int getFirst() const { return first; } inline int getLast() const { return last; } /** Abreviaciones */ inline int gS() const { return size; } inline int gF() const { return first; } inline int gL() const { return last; } // operator------------------------------------------------------------------- /** Checa indices. */ TC operator()(int index) throw (invalid_argument) { if ( (index < first) || (index > last)) { throw invalid_argument("operator(): indices fuera de rango."); } return pOrigin[index]; } // public--------------------------------------------------------------------- void print() { int i; for (i = 0; i < size; ++i) { cout << pCorner[i] << "\t"; } cout << endl; } void clean() { int i; for (i = 0; i < size; ++i) { pCorner[i] = static_cast<TC>(0); } } }; // } Array1DPos------------------------------------------------------------ #endif // Fin------------------------------------------------------------------------