heh
Diffstat (limited to 'src/util.rs')
-rw-r--r--src/util.rs70
1 files changed, 64 insertions, 6 deletions
diff --git a/src/util.rs b/src/util.rs
index 91abd99..90a0130 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -876,6 +876,29 @@ pub mod 読む {
}
}
}
+ pub trait Ten {
+ fn ten() -> Self;
+ }
+ macro_rules! tenz {
+ ($for:ty) => {
+ impl Ten for $for {
+ fn ten() -> $for {
+ 10
+ }
+ }
+ };
+ }
+ tenz!(u8);
+ tenz!(u16);
+ tenz!(u32);
+ tenz!(u64);
+ tenz!(u128);
+ tenz!(i8);
+ tenz!(i16);
+ tenz!(i32);
+ tenz!(i64);
+ tenz!(i128);
+
const DIG: [u8; 256] = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0,
@@ -910,16 +933,45 @@ pub mod 読む {
}
Ok(num)
}
+ pub fn 迄または完了<
+ T: Default
+ + std::ops::Mul<T, Output = T>
+ + std::ops::Add<T, Output = T>
+ + From<u8>
+ + Copy
+ + Ten,
+ >(
+ x: &mut &[u8],
+ until: u8,
+ ) -> T {
+ let mut n = T::default();
+ while let Ok(x) = x.by() {
+ if x == until {
+ return n;
+ }
+ n = n * T::ten() + T::from(x - b'0')
+ }
+ n
+ }
- pub fn 不全の(x: &mut &[u8]) -> u64 {
- let mut n = 0;
+ pub fn 迄<
+ T: Default
+ + std::ops::Mul<T, Output = T>
+ + std::ops::Add<T, Output = T>
+ + From<u8>
+ + Copy
+ + Ten,
+ >(
+ x: &mut &[u8],
+ until: u8,
+ ) -> T {
+ let mut n = T::default();
loop {
- let byte = x[0];
- x.skip(1);
- if byte == b' ' {
+ let byte = x.by().ψ();
+ if byte == until {
return n;
}
- n = n * 10 + (byte - b'0') as u64;
+ n = n * T::ten() + T::from(byte - b'0');
}
}
@@ -1274,3 +1326,9 @@ impl<const N: usize, T> Push<T, N> for [T; N] {
std::array::from_fn(|_| iter.next().unwrap())
}
}
+
+impl<T> Push<T, 1> for T {
+ fn and(self, and: T) -> [T; 2] {
+ [self, and]
+ }
+}