Some renaming and minor style fixes
This commit is contained in:
parent
1f15ff93f5
commit
37d8b1f5e8
@ -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
|
||||||
|
5
Makefile
5
Makefile
@ -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
7
rustfmt.toml
Normal 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
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user