// Zähler-Array-Klasse, Implementierung
//
// Klaus Kusche, 2012

#include "counter.h"

Counter::Counter(unsigned int sz) : size(sz), counts(new int[sz])
{
  unsigned int i;
  for (i = 0; i < size; ++i) {
    counts[i] = 0;
  }
}

Counter::Counter(const Counter &a) : size(a.size), counts(new int[size])
{  
  unsigned int i;
  for (i = 0; i < size; ++i) {
    counts[i] = a.counts[i];
  }
}

int Counter::getCnt(unsigned int val) const
{
  if (val >= size) {
    throw "getCnt: val out of bounds";
  }
  
  return counts[val];
}

Counter Counter::operator+(const Counter &a) const
{
  if (a.size != size) {
    throw "operator+: different size";
  }
  
  Counter res(size);
  unsigned int i;
  for (i = 0; i < size; ++i) {
    res.counts[i] = counts[i] + a.counts[i];
  }

  return res;
}

Counter Counter::operator+(unsigned int val) const
{
  if (val >= size) {
    throw "operator+: val out of bounds";
  }

  Counter res(*this);
  ++res.counts[val];

  return res;
}

bool Counter::operator<=(const Counter &a) const
{
  if (a.size != size) {
    throw "operator<=: different size";
  }

  unsigned int i;
  for (i = 0; i < size; ++i) {
    if (counts[i] > a.counts[i]) {
      return false;
    }
  }

  return true;
}

Counter &Counter::operator=(const Counter &a)
{
  unsigned int i;

  if (this != &a) {
    if (a.size != size) {
      throw "operator=: different size";
    }
    for (i = 0; i < size; ++i) {
      counts[i] = a.counts[i];
    }
  }

  return *this;
}
