// vector.cpp - Definición de la clase CVector
#include <iostream>
#include "vector.h"
using namespace std;

// Constructores:
// Crear una matriz con 10 elementos por omisión
CVector::CVector()
{
  nElementos = 10;
  vector = asignarMem(nElementos);
  fill(vector, vector + nElementos, 0);
}

// Crear una matriz con ne elementos
CVector::CVector(int ne)
{
  if (ne < 1)
  {
    cerr << "Nº de elementos no válido: " << ne << "\n";
    return;
  }
  nElementos = ne;
  vector = asignarMem(nElementos);
  fill(vector, vector + nElementos, 0);
}

// Crear una matriz a partir de otra matriz primitiva
CVector::CVector(double *a, int ne)
{
  nElementos = ne;
  vector = asignarMem(nElementos);
  // Copiar los elementos de la matriz a
  for (int i = 0; i < nElementos; i++)
    vector[i] = a[i];
}

// Constructor copia
CVector::CVector(const CVector &v)
{
  nElementos = v.nElementos;
  vector = asignarMem(nElementos);
  // Copiar el objeto v
  for (int i = 0; i < nElementos; i++)
    vector[i] = v.vector[i];
}

// Otros métodos
CVector::~CVector() // destructor
{
  delete [] vector;
}

double& CVector::elemento(int i) const
{
  return vector[i];
}

int CVector::longitud() const
{
  return nElementos;
}

double *CVector::asignarMem(int nElems)
{
  try
  {
    double *p = new double[nElems];
    return p;
  }
  catch(bad_alloc e)
  {
    cout << "Insuficiente espacio de memoria\n";
    exit(-1);
  }
}

void *CVector::operator new(size_t tam)
{
  return asignarMem(tam, 0);
}

void *CVector::operator new[](size_t tam)
{
  return asignarMem(tam, 0);
}

void *CVector::asignarMem(size_t tam, char car)
{
    void *p = malloc(tam);
    if (p == 0)
    {
      cout << "Insuficiente espacio de memoria\n";
      exit(-1);
    }
    // Iniciar el bloque de memoria con el valor car
    fill(static_cast<char *>(p), static_cast<char *>(p)+tam, car);
    return p;
}

void CVector::operator delete(void *p, size_t tam)
{
  if (p) fill(static_cast<char *>(p), static_cast<char *>(p)+tam, 0);
  free(p);
}

void CVector::operator delete[](void *p, size_t tam)
{
  if (p) fill(static_cast<char *>(p), static_cast<char *>(p)+tam, 0);
  free(p);
}

