Skip to main content

Unital

Trait Unital 

Source
pub trait Unital: Magma {
    // Required method
    fn unit() -> Self::T;

    // Provided methods
    fn is_unit(x: &Self::T) -> bool
       where Self::T: PartialEq { ... }
    fn set_unit(x: &mut Self::T) { ... }
}
Expand description

$\exists e \in T, \forall a \in T, e \circ a = a \circ e = e$

Required Methods§

Source

fn unit() -> Self::T

identity element: $e$

Provided Methods§

Source

fn is_unit(x: &Self::T) -> bool
where Self::T: PartialEq,

Examples found in repository?
crates/competitive/src/algebra/lazy_map.rs (line 19)
18    fn is_act_unit(act: &Self::Act) -> bool {
19        <Self::ActMonoid as Unital>::is_unit(act)
20    }
More examples
Hide additional examples
crates/competitive/src/tree/top_tree.rs (line 103)
102    fn is_unit(action: &A::Action) -> bool {
103        <A::ActionMonoid as Unital>::is_unit(action)
104    }
crates/competitive/src/data_structure/dual_segment_tree.rs (line 73)
71    fn propagate_at(&mut self, k: usize) {
72        let a = replace(&mut self.lazy[k], M::unit());
73        if !M::ActMonoid::is_unit(&a) {
74            self.update_at(2 * k, &a);
75            self.update_at(2 * k + 1, &a);
76        }
77    }
78    pub fn update<R>(&mut self, range: R, a: M::Act)
79    where
80        R: RangeBounds<usize>,
81    {
82        let range = range
83            .to_range_bounded(0, self.keys.len())
84            .expect("invalid range");
85        if range.is_empty() || M::ActMonoid::is_unit(&a) {
86            return;
87        }
88        let mut l = range.start + self.n;
89        let mut r = range.end + self.n;
90        for i in (1..=self.n.trailing_zeros()).rev() {
91            if (l >> i) << i != l {
92                self.propagate_at(l >> i);
93            }
94            if (r >> i) << i != r && ((l >> i) << i == l || l >> i != (r - 1) >> i) {
95                self.propagate_at((r - 1) >> i);
96            }
97        }
98        while l < r {
99            if l & 1 != 0 {
100                self.update_at(l, &a);
101                l += 1;
102            }
103            if r & 1 != 0 {
104                r -= 1;
105                self.update_at(r, &a);
106            }
107            l >>= 1;
108            r >>= 1;
109        }
110    }
crates/competitive/src/data_structure/pairing_heap.rs (line 40)
39    fn propagate(&mut self) {
40        if !<A::ActMonoid as Unital>::is_unit(&self.lazy) {
41            let act = replace(&mut self.lazy, A::unit());
42            if let Some(node) = self.first_child.as_mut() {
43                node.apply(&act);
44            }
45            if let Some(node) = self.next_sibling.as_mut() {
46                node.apply(&act);
47            }
48        }
49    }
Source

fn set_unit(x: &mut Self::T)

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

Source§

impl Unital for ()

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital, D: Unital, E: Unital, F: Unital, G: Unital, H: Unital, I: Unital, J: Unital> Unital for (A, B, C, D, E, F, G, H, I, J)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital, D: Unital, E: Unital, F: Unital, G: Unital, H: Unital, I: Unital> Unital for (A, B, C, D, E, F, G, H, I)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital, D: Unital, E: Unital, F: Unital, G: Unital, H: Unital> Unital for (A, B, C, D, E, F, G, H)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital, D: Unital, E: Unital, F: Unital, G: Unital> Unital for (A, B, C, D, E, F, G)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital, D: Unital, E: Unital, F: Unital> Unital for (A, B, C, D, E, F)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital, D: Unital, E: Unital> Unital for (A, B, C, D, E)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital, D: Unital> Unital for (A, B, C, D)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital, C: Unital> Unital for (A, B, C)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital, B: Unital> Unital for (A, B)

Source§

fn unit() -> Self::T

Source§

impl<A: Unital> Unital for (A,)

Source§

fn unit() -> Self::T

Implementors§

Source§

impl Unital for Gf2_63

Source§

impl Unital for Mersenne61

Source§

impl Unital for Mersenne61Add

Source§

impl Unital for PermutationOperation

Source§

impl Unital for SumMinimum

Source§

impl<M, const N: usize> Unital for ArrayOperation<M, N>
where M: Unital,

Source§

impl<M> Unital for CountingOperation<M>
where M: Unital<T: PartialEq> + Idempotent,

Source§

impl<M> Unital for ReverseOperation<M>
where M: Unital,

Source§

impl<R, const X: usize, const Y: usize> Unital for FloorSum<R, X, Y>
where R: SemiRing,

Source§

impl<R> Unital for FloorPowerSum<R>
where R: SemiRing,

Source§

impl<T> Unital for AdditiveOperation<T>
where T: Clone + Zero + Add<Output = T>,

Source§

impl<T> Unital for BitAndOperation<T>
where T: Clone + BitAndIdentity,

Source§

impl<T> Unital for BitOrOperation<T>
where T: Clone + BitOrIdentity,

Source§

impl<T> Unital for BitXorOperation<T>
where T: Clone + BitXorIdentity,

Source§

impl<T> Unital for ConcatenateOperation<T>
where T: Clone,

Source§

impl<T> Unital for FindMajorityOperation<T>
where T: Clone + Eq,

Source§

impl<T> Unital for FirstOperation<T>
where T: Clone,

Source§

impl<T> Unital for LastOperation<T>
where T: Clone,

Source§

impl<T> Unital for LinearOperation<T>
where T: Clone + Zero + One + Add<Output = T> + Mul<Output = T>,

Source§

impl<T> Unital for LogicalLinearOperation<T>
where T: Clone + BitXorIdentity + BitAndIdentity + BitXor<Output = T> + BitAnd<Output = T>,

Source§

impl<T> Unital for MaxOperation<T>
where T: Clone + Ord + Bounded,

Source§

impl<T> Unital for MinOperation<T>
where T: Clone + Ord + Bounded,

Source§

impl<T> Unital for MinimumIntervalMovementOperation<T>
where T: Clone + Ord + Add<Output = T> + Sub<Output = T> + Zero + Bounded,

Source§

impl<T> Unital for MultiplicativeOperation<T>
where T: Clone + One + Mul<Output = T>,

Source§

impl<T> Unital for RangeChminChmaxAdd<T>
where T: Copy + Zero + One + Ord + Bounded + Add<Output = T> + Sub<Output = T> + Mul<Output = T> + PartialEq,

Source§

impl<T> Unital for RangeSumRangeChminChmaxAdd<T>
where T: Copy + Zero + One + Ord + Bounded + Add<Output = T> + Sub<Output = T> + Mul<Output = T> + PartialEq,

Source§

impl<T> Unital for SortedConcatenateOperation<T>
where T: Clone + Ord,

Source§

impl<const K: usize, T, U> Unital for DedupedBottomkOperation<K, T, U>
where T: Clone + Ord + Bounded, U: Clone + Eq,

Source§

impl<const K: usize, T, U> Unital for DedupedTopkOperation<K, T, U>
where T: Clone + Ord + Bounded, U: Clone + Eq,

Source§

impl<const K: usize, T> Unital for BottomkOperation<K, T>
where T: Clone + Ord + Bounded,

Source§

impl<const K: usize, T> Unital for TopkOperation<K, T>
where T: Clone + Ord + Bounded,