Skip to main content

nekolib/traits/
count.rs

1//! 計数クエリ。
2
3use std::fmt::Debug;
4use std::ops::RangeBounds;
5
6/// 計数クエリ。
7pub trait Count<I> {
8    fn count(&self, range: impl RangeBounds<usize>, value: I) -> usize;
9}
10
11/// 三方向計数クエリ。
12pub trait Count3way<I> {
13    fn count_3way(
14        &self,
15        range: impl RangeBounds<usize>,
16        value: I,
17    ) -> Count3wayResult;
18}
19
20#[derive(Clone, Copy, Debug, Eq, PartialEq)]
21pub struct Count3wayResult {
22    lt: usize,
23    eq: usize,
24    gt: usize,
25}
26
27impl Count3wayResult {
28    pub fn new(lt: usize, eq: usize, gt: usize) -> Self { Self { lt, eq, gt } }
29    pub fn lt(&self) -> usize { self.lt }
30    pub fn eq(&self) -> usize { self.eq }
31    pub fn gt(&self) -> usize { self.gt }
32    pub fn le(&self) -> usize { self.lt + self.eq }
33    pub fn ge(&self) -> usize { self.gt + self.eq }
34    pub fn ne(&self) -> usize { self.lt + self.gt }
35}