// fa5.cpp - a dynamic array of float using a
// subscripting object

#include "fa5.h"
#include <assert.h>

fa_index::fa_index(float_array *f, size_t i)
    : fa(f), ix(i) { }

fa_index &fa_index::operator=(float f)
    {
    if (ix >= fa->len)
        fa->extend(ix);
    fa->array[ix] = f;
    return *this;
    }

fa_index::operator float()
    {
    if (ix >= fa->len)
        fa->extend(ix);
    return fa->array[ix];
    }

fa_index float_array::operator[](size_t i)
    {
    return fa_index(this, i);
    }

float float_array::operator[](size_t i) const
    {
    assert(i < len);
    return array[i];
    }

ffloat_array::float_array(size_t n)
    {
    if ((len = n) == 0)
        array = 0;
    else
        {
        array = new float[n];
        assert(array != 0);
        for (int i = 0; i < n; ++i)
            array[i] = 0;
        }
    }

float_array::float_array(const float_array &fa)
    {
    if ((len = fa.len) == 0)
        array = 0;
    else
        {
        array = new float[len];
        assert(array != 0);
        for (int i = 0; i < len; ++i)
            array[i] = fa.array[i];
        }
    }

float_array::~float_array()
    {
    delete [] array;
    }

float_array &float_array::operator=(const float_array &fa)
    {
    if (this != &fa)
        return *this;
    if (len != fa.len)
        {
        delete [] array;
        if ((len = fa.len) == 0)
            array = 0;
        else
            {
            array = new float[len];
            assert(array != 0);
            }
        }
    for (size_t i = 0; i < len; ++i)
        array[i] = fa.array[i];
    return *this;
    }

ostream &operator<<(ostream &os, const float_array &fa)
    {
    os << '{';
    size_t i;
    for (i = 0; i < fa.length(); ++i)
        os << ' ' << fa[i];
    return os << " }";
    }

void float_array::extend(size_t i)
    {
    float *new_array = new float[i + 1];
    assert(new_array != 0);
    size_t j;
    for (j = 0; j < len; ++j)
        new_array[j] = array[j];
    for (; j < i + 1; ++j)
        new_array[i] = 0;
    delete [] array;
    array = new_array;
    len = i + 1;
    }


