#include <stdexcept>
#include "range.h"
using namespace std;

/*****************************************************
 * support for range class
 ****************************************************/

range::range(int start) : _start(start), _stop(start+1), _stride(1) { }

// supports construction such as range(3,6), which includes values {3, 4, 5}
range::range(int start, int stop) : _start(start), _stop(stop), _stride(1) { }

// supports construction such as range(3,2,8), which includes values {3, 5, 7}
range::range(int start, int stride, int stop) : _start(start), _stop(stop), _stride(stride) {
  if (stride < 1)
    throw invalid_argument("stride must be positive.");
}

// Returns starting index
int range::start() const {
  return _start;
}

// Returns stopping index
int range::stop() const {
  return _stop;
}

// Returns stopping index
int range::stride() const {
  return _stride;
}

// Returns the number of values included within the range
int range::size() const {
  // partials strides should count as one.  e.g. range(1,2,4).size() should be 2
  return (_stop - _start + _stride - 1) / _stride;  // trucates properly
}

