//----------------------------------------------------------------------
//  IMPLEMENTATION FILE (vector.cpp)
//  This module exports an integer vector class that allows:
//    1. Run-time specification of vector size
//    2. Trapping of invalid subscripts
//    3. Aggregate vector assignment
//    4. Aggregate vector initialization
//  Vectors are dynamically allocated on the free store.
//----------------------------------------------------------------------
#include "vector.h"
#include <iostream.h>
#include <stdlib.h>     // For exit()

// Private members of class:
//     int* vec;             Pointer to vector on free store
//     int  size;            Size of vector
//
// CLASSINV: Pgm has halted if, for some subscript i, i < 0 or i >= size

IntVec::IntVec( /* in */ int numElements )
    //..................................................................
    // Constructor
    // POST: IF numElements >= 1 THEN
    //             Uninitialized vector created on free store
    //          && vec == base address of new vector
    //          && size == numElements
    //       ELSE
    //             Pgm has halted with error message
    //..................................................................
{
    if (numElements < 1) {
        cerr << "IntVec constructor - invalid size: "
             << numElements << '\n';
        exit(1);
    }
    vec = new int[numElements];
    size = numElements;
}

IntVec::IntVec( const IntVec& anotherVec )
    //..................................................................
    // Constructor (copy-constructor)
    // POST: New vector created on free store
    //    && vec == base address of new vector
    //    && size == anotherVec.size
    //    && All vec[0..size-1] == anotherVec.vec[0..size-1]
    //..................................................................
{
    size = anotherVec.size;
    vec = new int[size];
    int i;
    for (i = 0; i < size; i++)
        vec[i] = anotherVec.vec[i];
}

IntVec::~IntVec()
    //..................................................................
    // Destructor
    // POST: Vector is no longer on the free store
    //..................................................................
{
    delete vec;
}

void IntVec::operator=( /* in */ IntVec vec2 )
    //..................................................................
    // POST: IF size == vec2.size THEN
    //          Each element of this vector == corresponding element
    //                                         of vec2
    //       ELSE
    //          Pgm has halted with error message
    //..................................................................
{
    if (size != vec2.size) {
        cerr << "IntVec assignment - sizes unequal: "
             << size << ' ' << vec2.size << '\n';
        exit(1);
    }
    int i;
    for (i = 0; i < size; i++)
        vec[i] = vec2.vec[i];
}

int& IntVec::operator[]( /* in */ int i ) const
    //..................................................................
    // POST: IF 0 <= i < size THEN
    //          FCTVAL == address of vec[i]
    //       ELSE
    //          Pgm has halted with error message
    //..................................................................
{
    if (i < 0 || i >= size) {
        cerr << "IntVec - subscript invalid: " << i << '\n';
        exit(1);
    }
    return vec[i];                  // Implicit: return &vec[i]
}


