use crate::rtt::RttChannel;
use std::collections::{btree_map, BTreeMap};
use std::mem;
#[derive(Debug)]
pub struct Channels<T: RttChannel>(pub(crate) BTreeMap<usize, T>);
impl<T: RttChannel> Channels<T> {
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn get(&mut self, number: usize) -> Option<&T> {
self.0.get(&number)
}
pub fn take(&mut self, number: usize) -> Option<T> {
self.0.remove(&number)
}
pub fn iter(&self) -> Iter<'_, T> {
Iter(self.0.iter())
}
pub fn drain(&mut self) -> Drain<T> {
let map = mem::take(&mut self.0);
Drain(map.into_iter())
}
}
pub struct Iter<'a, T: RttChannel>(btree_map::Iter<'a, usize, T>);
impl<'a, T: RttChannel> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, v)| v)
}
}
pub struct Drain<T: RttChannel>(btree_map::IntoIter<usize, T>);
impl<T: RttChannel> Iterator for Drain<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, v)| v)
}
}