Support no_std

Fixes #3.
This commit is contained in:
Mike Hommey 2018-03-17 10:14:54 +09:00
parent 9f3e867f04
commit 70883abe4d
5 changed files with 22 additions and 3 deletions

View File

@ -13,5 +13,7 @@ matrix:
script: script:
- cargo build --verbose --features "$FEATURES" - cargo build --verbose --features "$FEATURES"
- cargo test --verbose --features "$FEATURES" - cargo test --verbose --features "$FEATURES"
- cargo build --verbose --no-default-features --features "$FEATURES"
- cargo test --verbose --no-default-features --features "$FEATURES"
- if [ "$BUILD_BENCH" == "true" ]; then cargo bench --verbose --no-run --features "$FEATURES"; fi - if [ "$BUILD_BENCH" == "true" ]; then cargo bench --verbose --no-run --features "$FEATURES"; fi

View File

@ -11,4 +11,6 @@ readme = "README.md"
exclude = ["performance.png"] exclude = ["performance.png"]
[features] [features]
default = ["std"]
i128 = [] i128 = []
std = []

View File

@ -53,6 +53,9 @@ where `itoa::Integer` is implemented for `i8`, `u8`, `i16`, `u16`, `i32`, `u32`,
only available with the nightly compiler when the `i128` feature is enabled for only available with the nightly compiler when the `i128` feature is enabled for
this crate. The return value gives the number of bytes written. this crate. The return value gives the number of bytes written.
The `write` function is only available when the `std` feature is enabled
(default is enabled).
## Dependency ## Dependency
Itoa is available on [crates.io](https://crates.io/crates/itoa). Use the Itoa is available on [crates.io](https://crates.io/crates/itoa). Use the

View File

@ -8,6 +8,8 @@
#![doc(html_root_url = "https://docs.rs/itoa/0.3.4")] #![doc(html_root_url = "https://docs.rs/itoa/0.3.4")]
#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(feature = "i128", feature(i128_type, i128))] #![cfg_attr(feature = "i128", feature(i128_type, i128))]
#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless, unreadable_literal))] #![cfg_attr(feature = "cargo-clippy", allow(cast_lossless, unreadable_literal))]
@ -15,8 +17,13 @@
#[cfg(feature = "i128")] #[cfg(feature = "i128")]
mod udiv128; mod udiv128;
#[cfg(feature = "std")]
use std::{fmt, io, mem, ptr, slice, str}; use std::{fmt, io, mem, ptr, slice, str};
#[cfg(not(feature = "std"))]
use core::{fmt, mem, ptr, slice, str};
#[cfg(feature = "std")]
#[inline] #[inline]
pub fn write<W: io::Write, V: Integer>(wr: W, value: V) -> io::Result<usize> { pub fn write<W: io::Write, V: Integer>(wr: W, value: V) -> io::Result<usize> {
value.write(wr) value.write(wr)
@ -33,6 +40,7 @@ mod private {
} }
pub trait Integer: private::Sealed { pub trait Integer: private::Sealed {
#[cfg(feature = "std")]
fn write<W: io::Write>(self, W) -> io::Result<usize>; fn write<W: io::Write>(self, W) -> io::Result<usize>;
fn fmt<W: fmt::Write>(self, W) -> fmt::Result; fn fmt<W: fmt::Write>(self, W) -> fmt::Result;
@ -56,6 +64,7 @@ const MAX_LEN: usize = 40; // i128::MIN (including minus sign)
macro_rules! impl_IntegerCommon { macro_rules! impl_IntegerCommon {
($t:ident) => { ($t:ident) => {
impl Integer for $t { impl Integer for $t {
#[cfg(feature = "std")]
fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> { fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> {
let mut buf = unsafe { mem::uninitialized() }; let mut buf = unsafe { mem::uninitialized() };
let bytes = self.write_to(&mut buf); let bytes = self.write_to(&mut buf);

View File

@ -17,9 +17,12 @@ macro_rules! test {
$(#[$attr])* $(#[$attr])*
#[test] #[test]
fn $name() { fn $name() {
#[cfg(feature = "std")]
{
let mut buf = [b'\0'; 40]; let mut buf = [b'\0'; 40];
let len = itoa::write(&mut buf[..], $value).unwrap(); let len = itoa::write(&mut buf[..], $value).unwrap();
assert_eq!(&buf[0..len], $expected.as_bytes()); assert_eq!(&buf[0..len], $expected.as_bytes());
}
let mut s = String::new(); let mut s = String::new();
itoa::fmt(&mut s, $value).unwrap(); itoa::fmt(&mut s, $value).unwrap();