#[derive(Debug)]
pub struct IntRange {
start: i32,
stop: i32,
step: usize,
}
impl IntRange {
pub fn new(start: i32, stop: i32, step: usize) -> IntRange {
if step < 1 {
panic!("Range: step has to be a positive whole number.");
}
IntRange { start, stop, step }
}
#[inline]
pub fn len(&self) -> usize {
(self.stop - self.start).abs() as usize
}
pub fn range(&self) -> Vec<i32> {
if self.step == 0 {
panic!("Range: step cannot be zero");
}
if self.start == self.stop {
panic!("Range: start and stop cannot be the same");
}
let mut vector: Vec<i32> = Vec::with_capacity(self.len());
if self.start > self.stop {
for v in (self.stop..=self.start).rev().step_by(self.step) {
vector.push(v);
}
} else {
for v in (self.start..self.stop).step_by(self.step) {
vector.push(v);
}
}
vector
}
}
#[derive(Debug)]
pub struct FloatRange {
start: f64,
stop: f64,
step: f64,
}
impl FloatRange {
pub fn new(start: f64, stop: f64, step: f64) -> FloatRange {
if step <= 0f64 {
panic!("Range: step has to be a positive number.");
}
FloatRange { start, stop, step }
}
#[inline]
pub fn len(&self) -> usize {
((self.stop - self.start) / self.step).abs() as usize
}
pub fn range(&self) -> Vec<f64> {
if self.step <= 0f64 {
panic!("Range: step has to be a positive number");
}
if self.start == self.stop {
panic!("Range: start and stop cannot be the same");
}
let mut vector: Vec<f64> = Vec::with_capacity(self.len());
if self.start < self.stop {
let mut v: f64 = self.start;
while v < self.stop {
vector.push(v);
v = v + self.step;
}
} else if self.start > self.stop {
let mut v: f64 = self.start;
while v > self.stop {
vector.push(v);
v = v - self.step;
}
}
vector
}
}