#include <iostream>
#include <cstring> // for memcpy
#include "IntArrayList.h"

static const int DEFAULT_SIZE = 10;

IntArrayList::IntArrayList()
  : len_(0), maxsize_(DEFAULT_SIZE) {
  array_ = new int[maxsize_];
}

IntArrayList::IntArrayList(const int * const arr, size_t len)
  : len_(len), maxsize_(len * 2) {
  array_ = new int[maxsize_];
  memcpy(array_, arr, len * sizeof(int));
}

IntArrayList::IntArrayList(const IntArrayList &rhs)
  : len_(rhs.len_), maxsize_(rhs.maxsize_) {
  array_ = new int[maxsize_];
  memcpy(array_, rhs.array_, len_ * sizeof(int));
}

IntArrayList::~IntArrayList() {
  delete [] array_;
}

IntArrayList& IntArrayList::operator=(const IntArrayList &rhs) {
  if (this != &rhs) {
    len_ = rhs.len_;
    maxsize_ = rhs.maxsize_;
    delete [] array_;
    array_ = new int[maxsize_];
    memcpy(array_, rhs.array_, len_ * sizeof(int));
  }
  return *this;
}

int& IntArrayList::operator[](size_t n) {
  if (n < len_)
    return array_[n];
  else
    throw;
}

IntArrayList& IntArrayList::operator+=(int val) {
  array_[len_] = val;
  len_++;
  if (len_ == maxsize_) {
    int *tmparr = array_;
    maxsize_ *= 2;
    array_ = new int[maxsize_];
    memcpy(array_, tmparr, len_ * sizeof(int));
    delete [] tmparr;
  }
  return *this;
}

std::ostream& operator<<(std::ostream& ostr, const IntArrayList &rhs) {
  ostr << "[";
  for (int i = 0; i < rhs.len_ - 1; i++) {
    ostr << rhs.array_[i] << ", ";
  }
  if (rhs.len_ > 0)
    ostr << rhs.array_[rhs.len_ - 1];
  ostr << "]";
  return ostr;
}