Some renaming and minor style fixes

This commit is contained in:
Timothy Warren 2022-02-11 15:48:41 -05:00
parent 1f15ff93f5
commit 37d8b1f5e8
5 changed files with 47 additions and 39 deletions

View File

@ -1,7 +1,7 @@
[package] [package]
name = "rusty-numbers" name = "rusty-numbers"
version = "0.2.0" version = "0.2.0"
authors = ["Timothy J. Warren <tim@timshomepage.net>"] authors = ["Timothy J. Warren <tim@timshome.page>"]
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -13,10 +13,13 @@ clean:
rm cobertura.xml rm cobertura.xml
rm coverage.html rm coverage.html
fmt:
cargo +nightly fmt
test: test:
cargo test cargo test
test-no-std: test-no-std:
cargo test --no-default-features --features alloc cargo test --no-default-features --features alloc
.PHONY: test test-no-std .PHONY: test test-no-std fmt

7
rustfmt.toml Normal file
View File

@ -0,0 +1,7 @@
unstable_features = true
format_code_in_doc_comments = true
format_macro_matchers = true
format_strings = false
imports_granularity = "Module"
group_imports = "StdExternalCrate"
use_field_init_shorthand = true

View File

@ -1,4 +1,3 @@
#![allow(unused_variables)]
//! \[WIP\] Arbitrarily large integers //! \[WIP\] Arbitrarily large integers
use crate::num::FracOp; use crate::num::FracOp;
use crate::num::Sign::{self, Negative, Positive}; use crate::num::Sign::{self, Negative, Positive};
@ -9,19 +8,17 @@ extern crate alloc;
use alloc::string::*; use alloc::string::*;
#[cfg(all(feature = "alloc", not(feature = "std")))] #[cfg(all(feature = "alloc", not(feature = "std")))]
use alloc::vec::*; use alloc::vec::*;
#[cfg(feature = "std")]
use std::prelude::v1::*;
use core::cmp::{Ordering, PartialEq, PartialOrd}; use core::cmp::{Ordering, PartialEq, PartialOrd};
use core::convert::TryInto; use core::convert::TryInto;
use core::mem::replace;
use core::ops::{ use core::ops::{
Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Sub, SubAssign, Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Sub, SubAssign,
}; };
use core::usize; use core::usize;
#[cfg(feature = "std")]
use std::prelude::v1::*;
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
/// The representation of a `BigInt`
pub struct BigInt { pub struct BigInt {
inner: Vec<usize>, inner: Vec<usize>,
sign: Sign, sign: Sign,
@ -33,7 +30,7 @@ macro_rules! big_int {
($w:literal) => { ($w:literal) => {
$crate::bigint::BigInt::from($w) $crate::bigint::BigInt::from($w)
}; };
(-$x:literal) => { (- $x:literal) => {
$crate::bigint::BigInt::from(-$x) $crate::bigint::BigInt::from(-$x)
}; };
} }
@ -73,11 +70,15 @@ impl BigInt {
/// ///
/// The various `From` implementations are more useful in most cases /// The various `From` implementations are more useful in most cases
#[must_use] #[must_use]
pub fn new() -> Self { pub fn zero() -> Self {
Self::default() Self::default()
} }
fn new_empty() -> Self { pub fn new(initial: impl Into<BigInt>) -> Self {
initial.into()
}
fn empty() -> Self {
Self { Self {
inner: Vec::new(), inner: Vec::new(),
sign: Sign::Positive, sign: Sign::Positive,
@ -140,8 +141,7 @@ impl BigInt {
/// # Panics /// # Panics
/// * If radix is not between 1 and 36 inclusive /// * If radix is not between 1 and 36 inclusive
/// * Some branches are not yet implemented /// * Some branches are not yet implemented
#[allow(clippy::needless_pass_by_value)] pub fn from_str_radix<T: ToString + ?Sized>(s: &T, radix: usize) -> BigInt {
pub fn from_str_radix<T: ToString>(s: T, radix: usize) -> BigInt {
// Two lines due to borrow checker complaints // Two lines due to borrow checker complaints
let input = s.to_string().to_ascii_uppercase(); let input = s.to_string().to_ascii_uppercase();
let input = input.trim(); let input = input.trim();
@ -188,6 +188,9 @@ impl BigInt {
todo!(); todo!();
} }
/// Get the larger number of digits when comparing two `BigInt`s.
/// This is helpful to determine sizing for a `BigInt` after
/// a numeric operation.
fn get_ceil_digit_count(a: &Self, b: &Self) -> usize { fn get_ceil_digit_count(a: &Self, b: &Self) -> usize {
let a_digits = a.inner.len(); let a_digits = a.inner.len();
let b_digits = b.inner.len(); let b_digits = b.inner.len();
@ -356,8 +359,6 @@ impl Mul for BigInt {
#[must_use] #[must_use]
fn mul(self, rhs: Self) -> Self::Output { fn mul(self, rhs: Self) -> Self::Output {
let input_digits = Self::get_ceil_digit_count(&self, &rhs);
// Multiplication can result in twice the number of digits // Multiplication can result in twice the number of digits
let out_digits = Self::get_ceil_digit_count(&self, &rhs) * 2; let out_digits = Self::get_ceil_digit_count(&self, &rhs) * 2;
@ -369,7 +370,7 @@ impl Div for BigInt {
type Output = Self; type Output = Self;
#[must_use] #[must_use]
fn div(self, rhs: Self) -> Self::Output { fn div(self, _rhs: Self) -> Self::Output {
todo!() todo!()
} }
} }
@ -378,42 +379,42 @@ impl Rem for BigInt {
type Output = Self; type Output = Self;
#[must_use] #[must_use]
fn rem(self, rhs: Self) -> Self::Output { fn rem(self, _rhs: Self) -> Self::Output {
todo!() todo!()
} }
} }
impl AddAssign for BigInt { impl AddAssign for BigInt {
fn add_assign(&mut self, rhs: Self) { fn add_assign(&mut self, rhs: Self) {
let this = replace(self, BigInt::new()); let this = core::mem::replace(self, BigInt::zero());
*self = this + rhs; *self = this + rhs;
} }
} }
impl SubAssign for BigInt { impl SubAssign for BigInt {
fn sub_assign(&mut self, rhs: Self) { fn sub_assign(&mut self, rhs: Self) {
let this = replace(self, BigInt::new()); let this = core::mem::replace(self, BigInt::zero());
*self = this - rhs; *self = this - rhs;
} }
} }
impl MulAssign for BigInt { impl MulAssign for BigInt {
fn mul_assign(&mut self, rhs: Self) { fn mul_assign(&mut self, rhs: Self) {
let this = replace(self, BigInt::new()); let this = core::mem::replace(self, BigInt::zero());
*self = this * rhs; *self = this * rhs;
} }
} }
impl DivAssign for BigInt { impl DivAssign for BigInt {
fn div_assign(&mut self, rhs: Self) { fn div_assign(&mut self, rhs: Self) {
let this = replace(self, BigInt::new()); let this = core::mem::replace(self, BigInt::zero());
*self = this / rhs; *self = this / rhs;
} }
} }
impl RemAssign for BigInt { impl RemAssign for BigInt {
fn rem_assign(&mut self, rhs: Self) { fn rem_assign(&mut self, rhs: Self) {
let this = replace(self, BigInt::new()); let this = core::mem::replace(self, BigInt::zero());
*self = this % rhs; *self = this % rhs;
} }
} }
@ -510,7 +511,7 @@ macro_rules! impl_from_smaller {
impl From<$u> for BigInt { impl From<$u> for BigInt {
/// Create a `BigInt` from an unsigned integer primitive /// Create a `BigInt` from an unsigned integer primitive
fn from(n: $u) -> Self { fn from(n: $u) -> Self {
let mut new = Self::new_empty(); let mut new = Self::empty();
new.inner.push(n as usize); new.inner.push(n as usize);
new new
@ -823,7 +824,7 @@ mod tests {
let a = BigInt::from(core::usize::MAX); let a = BigInt::from(core::usize::MAX);
let b = BigInt::from(5); let b = BigInt::from(5);
let product = a * b; let _product = a * b;
} }
#[test] #[test]
@ -841,7 +842,7 @@ mod tests {
let a = BigInt::from(128); let a = BigInt::from(128);
let b = BigInt::from(32); let b = BigInt::from(32);
let quotient = a / b; let _quotient = a / b;
} }
#[test] #[test]
@ -859,7 +860,7 @@ mod tests {
let a = BigInt::from(5); let a = BigInt::from(5);
let b = BigInt::from(2); let b = BigInt::from(2);
let rem = a % b; let _rem = a % b;
} }
#[test] #[test]
@ -873,8 +874,8 @@ mod tests {
#[test] #[test]
fn test_zeros() { fn test_zeros() {
let a = BigInt::new(); let a = BigInt::zero();
let b = BigInt::new(); let b = BigInt::zero();
let c = a.clone() - b.clone(); let c = a.clone() - b.clone();
assert_eq!(a.clone(), b.clone()); assert_eq!(a.clone(), b.clone());
@ -978,7 +979,7 @@ mod tests {
#[test] #[test]
fn test_from_str_radix_1() { fn test_from_str_radix_1() {
let s = "1".repeat(32); let s = "1".repeat(32);
let num = BigInt::from_str_radix(s, 1); let num = BigInt::from_str_radix(&s, 1);
assert_eq!(num.inner[0], 32_usize); assert_eq!(num.inner[0], 32_usize);
} }
@ -988,7 +989,7 @@ mod tests {
let zeroes = "0".repeat(24); let zeroes = "0".repeat(24);
let s = ones + &zeroes; let s = ones + &zeroes;
let num = BigInt::from_str_radix(s, 1); let num = BigInt::from_str_radix(&s, 1);
assert_eq!(num.inner[0], 32_usize); assert_eq!(num.inner[0], 32_usize);
} }

View File

@ -1,9 +1,10 @@
//! # Rational Numbers (fractions) //! # Rational Numbers (fractions)
use core::cmp::{Ord, Ordering, PartialOrd};
use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
use crate::num::Sign::{Negative, Positive}; use crate::num::Sign::{Negative, Positive};
use crate::num::{FracOp, Int, Sign, Unsigned}; use crate::num::{FracOp, Int, Sign, Unsigned};
use core::cmp::{Ord, Ordering, PartialOrd};
use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
/// Type representing a fraction /// Type representing a fraction
/// ///
@ -79,9 +80,7 @@ impl<T: Unsigned> Frac<T> {
/// # Panics /// # Panics
/// if `d` is 0, this constructor will panic /// if `d` is 0, this constructor will panic
pub fn new_unreduced<N: Int<Un = T>>(n: N, d: N) -> Frac<T> { pub fn new_unreduced<N: Int<Un = T>>(n: N, d: N) -> Frac<T> {
if d.is_zero() { assert!(!d.is_zero(), "Fraction can not have a zero denominator");
panic!("Fraction can not have a zero denominator");
}
let mut sign = Positive; let mut sign = Positive;
@ -104,14 +103,12 @@ impl<T: Unsigned> Frac<T> {
} }
} }
/// Create a new rational from all the raw parts /// Create a new, reduced rational from all the raw parts
/// ///
/// # Panics /// # Panics
/// if `d` is 0, this constructor will panic /// if `d` is 0, this constructor will panic
fn raw(n: T, d: T, s: Sign) -> Frac<T> { fn raw(n: T, d: T, s: Sign) -> Frac<T> {
if d.is_zero() { assert!(!d.is_zero(), "Fraction can not have a zero denominator");
panic!("Fraction can not have a zero denominator");
}
Frac { Frac {
numerator: n, numerator: n,