utils: add misc and implement CustomBounded
This commit is contained in:
		
							
								
								
									
										25
									
								
								utils/misc/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								utils/misc/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
# This file is automatically @generated by Cargo.
 | 
			
		||||
# It is not intended for manual editing.
 | 
			
		||||
version = 4
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "autocfg"
 | 
			
		||||
version = "1.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "misc"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "num-traits",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num-traits"
 | 
			
		||||
version = "0.2.19"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										7
									
								
								utils/misc/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								utils/misc/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "misc"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
num-traits = "0.2.19"
 | 
			
		||||
							
								
								
									
										95
									
								
								utils/misc/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								utils/misc/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
use num_traits::Signed;
 | 
			
		||||
use std::ops::{Add, AddAssign};
 | 
			
		||||
use std::fmt::{Debug, Display};
 | 
			
		||||
 | 
			
		||||
/// Wrapped signed integer with custom upper bound with wrapping of 0s to the upper bound
 | 
			
		||||
#[derive(Eq, Clone, Copy)]
 | 
			
		||||
pub struct CustomWrapped<T: Signed + Copy> {
 | 
			
		||||
    pub val: T,
 | 
			
		||||
    pub bound: T,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + Copy> Add<T> for CustomWrapped<T> {
 | 
			
		||||
    type Output = CustomWrapped<T>;
 | 
			
		||||
    fn add(self, rhs: T) -> Self::Output {
 | 
			
		||||
        Self {
 | 
			
		||||
            val: ((self.val + rhs % self.bound) + self.bound) % self.bound,
 | 
			
		||||
            bound: self.bound,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + Copy> Add<T> for &CustomWrapped<T> {
 | 
			
		||||
    type Output = CustomWrapped<T>;
 | 
			
		||||
    fn add(self, rhs: T) -> Self::Output {
 | 
			
		||||
        CustomWrapped {
 | 
			
		||||
            val: ((self.val + rhs % self.bound) + self.bound) % self.bound,
 | 
			
		||||
            bound: self.bound,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + Copy> AddAssign<T> for CustomWrapped<T> {
 | 
			
		||||
    fn add_assign(&mut self, rhs: T) {
 | 
			
		||||
        self.val = ((self.val + rhs % self.bound) + self.bound) % self.bound
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + Copy> CustomWrapped<T> {
 | 
			
		||||
    pub fn new(val: T, bound: T) -> Self {
 | 
			
		||||
        Self { val, bound }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + Copy + PartialEq> PartialEq for CustomWrapped<T> {
 | 
			
		||||
    fn eq(&self, other: &Self) -> bool {
 | 
			
		||||
        self.val.eq(&other.val)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + PartialOrd + Copy> PartialOrd for CustomWrapped<T> {
 | 
			
		||||
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
 | 
			
		||||
        self.val.partial_cmp(&other.val)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + Ord + Copy> Ord for CustomWrapped<T> {
 | 
			
		||||
    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
 | 
			
		||||
        self.val.cmp(&other.val)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + PartialEq + Copy> PartialEq<T> for CustomWrapped<T> {
 | 
			
		||||
    fn eq(&self, other: &T) -> bool {
 | 
			
		||||
        self.val == *other
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Signed + PartialOrd + Copy> PartialOrd<T> for CustomWrapped<T> {
 | 
			
		||||
    fn partial_cmp(&self, other: &T) -> Option<std::cmp::Ordering> {
 | 
			
		||||
        self.val.partial_cmp(other)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Display + Signed + Copy> Display for CustomWrapped<T> where T: Display {
 | 
			
		||||
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
			
		||||
        self.val.fmt(f)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// impl<T> Into<T> for CustomWrapped<T> {
 | 
			
		||||
//     fn into(self) -> T {
 | 
			
		||||
//         self.val
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn it_works() {
 | 
			
		||||
        let result = add(2, 2);
 | 
			
		||||
        assert_eq!(result, 4);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user