// codesnip-guard: Counter #[cfg_attr(any(),rustfmt::skip)]pub use self::counter::{BTreeCounter,HashCounter};#[cfg_attr(any(),rustfmt::skip)]mod counter{use std::{borrow::Borrow,collections::{BTreeMap,HashMap,btree_map,hash_map},fmt::{self,Debug},hash::Hash,iter::{Extend,FromIterator},ops::RangeBounds};#[derive(Clone)]pub struct HashCounter{map:HashMap}implDebug for HashCounterwhere T:Debug{fn fmt(&self,f:&mut fmt::Formatter<'_>)->fmt::Result{f.debug_map().entries(self.iter()).finish()}}implDefault for HashCounterwhere T:Eq+Hash{fn default()->Self{Self{map:HashMap::default()}}}implHashCounter{pub fn len(&self)->usize{self.map.len()}pub fn is_empty(&self)->bool{self.map.is_empty()}pub fn clear(&mut self){self.map.clear();}pub fn keys(&self)->hash_map::Keys<'_,T,usize>{self.map.keys()}pub fn values(&self)->hash_map::Values<'_,T,usize>{self.map.values()}pub fn iter(&self)->hash_map::Iter<'_,T,usize>{self.map.iter()}pub fn drain(&mut self)->hash_map::Drain<'_,T,usize>{self.map.drain()}}implHashCounterwhere T:Eq+Hash{pub fn new()->Self{Self::default()}pub fn with_capacity(capacity:usize)->Self{Self{map:HashMap::with_capacity(capacity)}}pub fn get(&self,item:&T)->usize{self.map.get(item).cloned().unwrap_or_default()}pub fn add(&mut self,item:T){self.add_count(item,1)}pub fn add_count(&mut self,item:T,count:usize){*self.map.entry(item).or_default()+=count;}pub fn remove(&mut self,item:&T)->bool{self.remove_count(item,1)==1}pub fn remove_count(&mut self,item:&T,count:usize)->usize{if let Some(cnt)=self.map.get_mut(item){if*cnt<=count{let cnt=*cnt;self.map.remove(item);cnt}else{*cnt-=count;count}}else{0}}pub fn append(&mut self,other:&mut Self){if self.map.len()Extendfor HashCounterwhere T:Eq+Hash{fn extend>(&mut self,iter:I){for item in iter{self.add(item)}}}implExtend<(T,usize)>for HashCounterwhere T:Eq+Hash{fn extend>(&mut self,iter:I){for(item,count)in iter{self.add_count(item,count)}}}implFromIteratorfor HashCounterwhere T:Eq+Hash{fn from_iter>(iter:I)->Self{let mut map=Self::default();map.extend(iter);map}}implFromIterator<(T,usize)>for HashCounterwhere T:Eq+Hash{fn from_iter>(iter:I)->Self{let mut map=Self::default();map.extend(iter);map}}#[derive(Clone)]pub struct BTreeCounter{map:BTreeMap}implDebug for BTreeCounterwhere T:Debug{fn fmt(&self,f:&mut fmt::Formatter<'_>)->fmt::Result{f.debug_map().entries(self.iter()).finish()}}implDefault for BTreeCounterwhere T:Ord{fn default()->Self{Self{map:BTreeMap::default()}}}implBTreeCounter{pub fn len(&self)->usize{self.map.len()}pub fn is_empty(&self)->bool{self.map.is_empty()}pub fn keys(&self)->btree_map::Keys<'_,T,usize>{self.map.keys()}pub fn values(&self)->btree_map::Values<'_,T,usize>{self.map.values()}pub fn iter(&self)->btree_map::Iter<'_,T,usize>{self.map.iter()}pub fn range(&self,range:R)->btree_map::Range<'_,T,usize>where Q:Ord,R:RangeBounds,T:Borrow+Ord{self.map.range(range)}}implBTreeCounterwhere T:Ord{pub fn new()->Self{Self::default()}pub fn clear(&mut self){self.map.clear();}pub fn get(&self,item:&T)->usize{self.map.get(item).cloned().unwrap_or_default()}pub fn add(&mut self,item:T){self.add_count(item,1)}pub fn add_count(&mut self,item:T,count:usize){*self.map.entry(item).or_default()+=count;}pub fn remove(&mut self,item:&T)->bool{self.remove_count(item,1)==1}pub fn remove_count(&mut self,item:&T,count:usize)->usize{if let Some(cnt)=self.map.get_mut(item){if*cnt<=count{let cnt=*cnt;self.map.remove(item);cnt}else{*cnt-=count;count}}else{0}}}implExtendfor BTreeCounterwhere T:Ord{fn extend>(&mut self,iter:I){for item in iter{self.add(item)}}}implExtend<(T,usize)>for BTreeCounterwhere T:Ord{fn extend>(&mut self,iter:I){for(item,count)in iter{self.add_count(item,count)}}}implFromIteratorfor BTreeCounterwhere T:Ord{fn from_iter>(iter:I)->Self{let mut map=Self::default();map.extend(iter);map}}implFromIterator<(T,usize)>for BTreeCounterwhere T:Ord{fn from_iter>(iter:I)->Self{let mut map=Self::default();map.extend(iter);map}}}