Removed num module, using external num crate once again, started working on expr module (math expression parser)
This commit is contained in:
parent
182f73db27
commit
ab5fa70b7b
5 changed files with 21 additions and 76 deletions
1
src/expr.rs
Normal file
1
src/expr.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mod bexpr_tree;
|
19
src/expr/bexpr_tree.rs
Normal file
19
src/expr/bexpr_tree.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
pub struct BExprTree<T> {
|
||||||
|
children: Box<Vec<Node<T>>>
|
||||||
|
}
|
||||||
|
|
||||||
|
type BinaryOp<T> = Box<dyn Fn(T, T) -> T>;
|
||||||
|
type UnaryOp<T> = Box<dyn Fn(T) -> T>;
|
||||||
|
|
||||||
|
enum Node<T> {
|
||||||
|
Binary(BinaryOp<T>, Box<Node<T>>, Box<Node<T>>),
|
||||||
|
Unary(UnaryOp<T>, Box<Node<T>>),
|
||||||
|
Token(T)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -1,2 +1,2 @@
|
||||||
pub mod num;
|
pub mod expr;
|
||||||
pub mod matrix;
|
pub mod matrix;
|
||||||
|
|
40
src/num.rs
40
src/num.rs
|
@ -1,40 +0,0 @@
|
||||||
mod bigint;
|
|
||||||
|
|
||||||
use std::ops::*;
|
|
||||||
|
|
||||||
pub trait Signed: Neg {}
|
|
||||||
pub trait NumOps<Rhs = Self>: Sized + Add<Rhs> + Sub<Rhs> + Mul<Rhs> + Div<Rhs> {}
|
|
||||||
pub trait NumAssignOps<Rhs = Self>: AddAssign<Rhs> + SubAssign<Rhs> + MulAssign<Rhs> + DivAssign<Rhs> {}
|
|
||||||
pub trait Num: PartialEq + Default + NumOps + NumAssignOps {}
|
|
||||||
|
|
||||||
macro_rules! impl_num {
|
|
||||||
($t:ty) => {
|
|
||||||
impl NumOps for $t {}
|
|
||||||
impl NumAssignOps for $t {}
|
|
||||||
impl Num for $t {}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! impl_sign_num {
|
|
||||||
($t:ty) => {
|
|
||||||
impl_num!($t);
|
|
||||||
impl Signed for $t {}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
impl_num!(u8);
|
|
||||||
impl_num!(u16);
|
|
||||||
impl_num!(u32);
|
|
||||||
impl_num!(u64);
|
|
||||||
impl_num!(u128);
|
|
||||||
impl_num!(usize);
|
|
||||||
|
|
||||||
impl_sign_num!(i8);
|
|
||||||
impl_sign_num!(i16);
|
|
||||||
impl_sign_num!(i32);
|
|
||||||
impl_sign_num!(i64);
|
|
||||||
impl_sign_num!(i128);
|
|
||||||
impl_sign_num!(isize);
|
|
||||||
|
|
||||||
impl_sign_num!(f32);
|
|
||||||
impl_sign_num!(f64);
|
|
|
@ -1,35 +0,0 @@
|
||||||
pub struct BigInt {
|
|
||||||
negative: bool,
|
|
||||||
num: BigUInt
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct BigUInt {
|
|
||||||
data: Vec<u64>
|
|
||||||
}
|
|
||||||
|
|
||||||
impl BigUInt {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self::new_from(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_from(num: u64) -> Self {
|
|
||||||
Self { data: vec![num] }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl BigInt {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self { negative: false, num: BigUInt::new() }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_from(num: i64) -> Self {
|
|
||||||
let (negative, num) = if num < 0 { (true, -num as u64) }
|
|
||||||
else { (false, num as u64) };
|
|
||||||
Self { negative, num: BigUInt::new_from(num) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in a new issue