add support for no_std

This commit is contained in:
Trevor Spiteri 2018-08-12 12:11:28 +02:00
parent 048033b68c
commit 6998d667b1
8 changed files with 78 additions and 22 deletions

View File

@ -14,8 +14,12 @@ documentation = "https://docs.rs/fixed"
repository = "https://gitlab.com/tspiteri/fixed"
readme = "README.md"
keywords = ["mathematics", "numerics"]
categories = ["algorithms", "data-structures", "science"]
categories = ["algorithms", "data-structures", "no-std", "science"]
license = "MIT/Apache-2.0"
[dependencies]
typenum = "1.3"
[features]
default = ["std"]
std = []

View File

@ -35,6 +35,10 @@ fixed-point numbers.
## Whats new
### Version 0.1.2 news (unreleased)
* The crate can now be used without the standard library `std`.
### Version 0.1.1 news (2018-08-11)
* Comparisons are now supported between all fixed-point numbers with
@ -103,6 +107,24 @@ You also need to declare it by adding this to your crate root (usually
extern crate fixed;
```
## Optional features
The *fixed* crate has one optional features:
1. `std`, enabled by default. This adds a dependency on the standard
library `std`. Currently this makes no difference functionally,
but that may change in the future.
The `std` feature is enabled by default; to use the crate without a
dependency on the standard library `std`, you can add the dependency
like this to [*Cargo.toml*]:
```toml
[dependencies.fixed]
version = "0.1.1"
default-features = false
```
## License
This crate is free software: you can redistribute it and/or modify it

View File

@ -5,6 +5,11 @@ modification, are permitted in any medium without royalty provided the
copyright notice and this notice are preserved. This file is offered
as-is, without any warranty. -->
Version 0.1.2 (unreleased)
==========================
* The crate can now be used without the standard library `std`.
Version 0.1.1 (2018-08-11)
==========================

View File

@ -13,14 +13,14 @@
// <https://www.apache.org/licenses/LICENSE-2.0> and
// <https://opensource.org/licenses/MIT>.
use frac::Unsigned;
use std::cmp::Ordering;
use std::iter::{Product, Sum};
use std::mem;
use std::ops::{
use core::cmp::Ordering;
use core::iter::{Product, Sum};
use core::mem;
use core::ops::{
Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign,
Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign,
};
use frac::Unsigned;
use {
FixedHelper, FixedI128, FixedI16, FixedI32, FixedI64, FixedI8, FixedU128, FixedU16, FixedU32,
FixedU64, FixedU8,

View File

@ -13,8 +13,8 @@
// <https://www.apache.org/licenses/LICENSE-2.0> and
// <https://opensource.org/licenses/MIT>.
use core::cmp::Ordering;
use frac::{self, Unsigned};
use std::cmp::Ordering;
use {
FixedI128, FixedI16, FixedI32, FixedI64, FixedI8, FixedU128, FixedU16, FixedU32, FixedU64,
FixedU8,
@ -135,7 +135,7 @@ mod tests {
#[test]
fn cmp_signed() {
use std::cmp::Ordering::*;
use core::cmp::Ordering::*;
let neg1_16 = FixedI32::<frac::U16>::from_int(-1).unwrap();
let neg1_20 = FixedI32::<frac::U20>::from_int(-1).unwrap();
let mut a = neg1_16;
@ -172,7 +172,7 @@ mod tests {
#[test]
fn cmp_unsigned() {
use std::cmp::Ordering::*;
use core::cmp::Ordering::*;
let one_16 = FixedU32::<frac::U16>::from_int(1).unwrap();
let one_20 = FixedU32::<frac::U20>::from_int(1).unwrap();
let mut a = one_16;

View File

@ -13,9 +13,11 @@
// <https://www.apache.org/licenses/LICENSE-2.0> and
// <https://opensource.org/licenses/MIT>.
use std::cmp::Ordering;
use std::fmt::{Binary, Debug, Display, Formatter, LowerHex, Octal, Result as FmtResult, UpperHex};
use std::str;
use core::cmp::Ordering;
use core::fmt::{
Binary, Debug, Display, Formatter, LowerHex, Octal, Result as FmtResult, UpperHex,
};
use core::str;
use typenum::Unsigned;
use FixedHelper;
@ -158,6 +160,7 @@ fn dec_int_digits(int_bits: u32) -> u32 {
let digits = (int_bits * 3 + i) / 10;
// check that digits is ceil(log10(2^int_bits - 1)), except when int_bits < 2
#[cfg(feature = "std")]
debug_assert!(
int_bits < 2 || digits == (f64::from(int_bits).exp2() - 1.0).log10().ceil() as u32
);
@ -179,8 +182,10 @@ fn dec_frac_digits(frac_bits: u32) -> u32 {
// check that error < delta, where
// error = 0.5 * 10^-digits
// delta = 2^-frac_bits
#[cfg(feature = "std")]
debug_assert!(0.5 * 10f64.powi(0 - digits as i32) < (-f64::from(frac_bits)).exp2());
// check that error with one less digit >= delta
#[cfg(feature = "std")]
debug_assert!(0.5 * 10f64.powi(1 - digits as i32) >= (-f64::from(frac_bits)).exp2());
digits
@ -272,7 +277,7 @@ where
fmt.pad_integral(!is_neg, "", buf)
}
#[cfg(test)]
#[cfg(all(test, feature = "std"))]
mod tests {
use *;
@ -304,7 +309,6 @@ mod tests {
let bits = !0u32 ^ i;
let flt = bits as f64 / (frac as f64).exp2();
let fix = FixedU32::<Frac>::from_bits(bits);
println!("i is {}", i);
assert_eq!(format!("{}", fix), format!("{:.2}", flt));
}
}

View File

@ -13,9 +13,8 @@
// <https://www.apache.org/licenses/LICENSE-2.0> and
// <https://opensource.org/licenses/MIT>.
use std::cmp::Ordering;
use std::mem;
use core::cmp::Ordering;
use core::mem;
use typenum::Unsigned;
use {
FixedI128, FixedI16, FixedI32, FixedI64, FixedI8, FixedU128, FixedU16, FixedU32, FixedU64,

View File

@ -75,6 +75,24 @@ You also need to declare it by adding this to your crate root (usually
extern crate fixed;
```
## Optional features
The *fixed* crate has one optional features:
1. `std`, enabled by default. This adds a dependency on the standard
library `std`. Currently this makes no difference functionally,
but that may change in the future.
The `std` feature is enabled by default; to use the crate without a
dependency on the standard library `std`, you can add the dependency
like this to [*Cargo.toml*]:
```toml
[dependencies.fixed]
version = "0.1.1"
default-features = false
```
## License
This crate is free software: you can redistribute it and/or modify it
@ -110,11 +128,15 @@ additional terms or conditions.
[channels]: https://doc.rust-lang.org/book/second-edition/appendix-07-nightly-rust.html
[const generics]: https://github.com/rust-lang/rust/issues/44580
*/
#![cfg_attr(not(feature = "std"), no_std)]
#![warn(missing_docs)]
#![doc(html_root_url = "https://docs.rs/fixed/0.1.1")]
#![doc(test(attr(deny(warnings))))]
#![cfg_attr(nightly_repr_transparent, feature(repr_transparent))]
#[cfg(feature = "std")]
extern crate core;
extern crate typenum;
macro_rules! if_signed {
@ -139,13 +161,13 @@ pub mod frac;
mod helper;
use arith::MulDivDir;
use core::cmp::Ordering;
use core::f32;
use core::f64;
use core::hash::{Hash, Hasher};
use core::marker::PhantomData;
use frac::Unsigned;
use helper::FixedHelper;
use std::cmp::Ordering;
use std::f32;
use std::f64;
use std::hash::{Hash, Hasher};
use std::marker::PhantomData;
macro_rules! pass_method {
($comment:expr, $Fixed:ident($Inner:ty) => fn $method:ident()) => {