use crate::SiteId;
pub trait HasSites {
fn sites(&self) -> impl Iterator<Item = SiteId> + '_;
#[inline]
fn site_count(&self) -> usize {
self.sites().count()
}
#[inline]
fn contains_site(&self, site: SiteId) -> bool {
self.sites().any(|s| s == site)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn site(n: u32) -> SiteId {
SiteId::new(n).unwrap()
}
struct Bare(Vec<SiteId>);
impl HasSites for Bare {
fn sites(&self) -> impl Iterator<Item = SiteId> + '_ {
self.0.iter().copied()
}
}
struct Indexed(Vec<SiteId>);
impl HasSites for Indexed {
fn sites(&self) -> impl Iterator<Item = SiteId> + '_ {
self.0.iter().copied()
}
fn site_count(&self) -> usize {
self.0.len()
}
fn contains_site(&self, site: SiteId) -> bool {
self.0.binary_search(&site).is_ok()
}
}
#[test]
fn sites() {
let sys = Bare(vec![site(1), site(4), site(9)]);
assert_eq!(
sys.sites().collect::<Vec<_>>(),
vec![site(1), site(4), site(9)]
);
}
#[test]
fn sites_empty() {
let sys = Bare(vec![]);
assert_eq!(sys.sites().count(), 0);
}
#[test]
fn site_count() {
let sys = Bare(vec![site(1), site(2), site(3)]);
assert_eq!(sys.site_count(), 3);
}
#[test]
fn site_count_empty_is_zero() {
let sys = Bare(vec![]);
assert_eq!(sys.site_count(), 0);
}
#[test]
fn contains_site() {
let sys = Bare(vec![site(1), site(5)]);
assert!(sys.contains_site(site(5)));
assert!(!sys.contains_site(site(2)));
}
#[test]
fn override_matches_default() {
let ids = vec![site(1), site(3), site(7)];
let bare = Bare(ids.clone());
let indexed = Indexed(ids);
assert_eq!(bare.site_count(), indexed.site_count());
for n in 0..10 {
let id = site(n + 1);
assert_eq!(bare.contains_site(id), indexed.contains_site(id));
}
}
}