use std::u32;
#[derive(Debug, Clone, Serialize)]
pub struct Handle {
next: u32,
first: u32,
}
impl Handle {
pub fn new(first: u32) -> Handle {
Handle { next: first, first }
}
pub fn next(&mut self) -> u32 {
let next = self.next;
if self.next == u32::MAX {
self.next = self.first;
} else {
self.next += 1;
}
next
}
pub fn set_next(&mut self, next: u32) {
self.next = next;
}
pub fn reset(&mut self) {
self.set_next(self.first);
}
}
#[test]
fn handle_increment() {
let mut h = Handle::new(0);
assert_eq!(h.next(), 0);
assert_eq!(h.next(), 1);
assert_eq!(h.next(), 2);
let mut h = Handle::new(100);
assert_eq!(h.next(), 100);
assert_eq!(h.next(), 101);
}
#[test]
fn handle_wrap() {
let mut h = Handle::new(u32::MAX - 2);
assert_eq!(h.next(), u32::MAX - 2);
assert_eq!(h.next(), u32::MAX - 1);
assert_eq!(h.next(), u32::MAX);
assert_eq!(h.next(), u32::MAX - 2);
}