mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-02 19:45:46 +00:00
d5f5648b37
We use cargo vendor to generate a .cargo/config file and the vendor directory. Vendoring allows us to lock our dependencies and to modify them easily from the top level Cargo.toml. We vendor all dependencies, including the crates.io ones, which allows for network isolated builds. Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
66 lines
2.1 KiB
Markdown
66 lines
2.1 KiB
Markdown
# NumToA
|
|
|
|
## `#![no_std]` Compatible with Zero Heap Allocations
|
|
|
|
The standard library provides a convenient method of converting numbers into strings, but these strings are
|
|
heap-allocated. If you have an application which needs to convert large volumes of numbers into strings, but don't
|
|
want to pay the price of heap allocation, this crate provides an efficient `no_std`-compatible method of heaplessly converting numbers
|
|
into their string representations, storing the representation within a reusable byte array.
|
|
|
|
## Supports Multiple Bases
|
|
|
|
In addition to supporting the standard base 10 conversion, this implementation allows you to select the base of
|
|
your choice. Therefore, if you want a binary representation, set the base to 2. If you want hexadecimal, set the
|
|
base to 16.
|
|
|
|
## No Unsafe
|
|
|
|
Both the standard library and itoa crate rely on unsafe functions, but this implementation has been able to avoid
|
|
the use of unsafe entirely.
|
|
|
|
## Fast
|
|
|
|
Performance is roughly identical to that of the `itoa` crate when performing base 10 conversions. Below is a benchmark
|
|
of printing 0 through 5,000,000 to `/dev/null`
|
|
|
|
```
|
|
std: 1150615048 ns
|
|
itoa: 838556714 ns
|
|
numtoa: 825544518 ns
|
|
```
|
|
|
|
## Base 10 Example
|
|
|
|
```rust
|
|
use numtoa::NumToA;
|
|
use std::io::{self, Write};
|
|
|
|
let stdout = io::stdout();
|
|
let mut stdout = stdout.lock();
|
|
let mut buffer = [0u8; 20];
|
|
|
|
let number: u32 = 162392;
|
|
let mut start_index = number.numtoa(10, &mut buffer);
|
|
let _ = stdout.write(&buffer[start_index..]);
|
|
let _ = stdout.write(b"\n");
|
|
assert_eq!(&buffer[start_index..], b"162392");
|
|
|
|
let other_number: i32 = -6235;
|
|
start_index = other_number.numtoa(10, &mut buffer);
|
|
let _ = stdout.write(&buffer[start_index..]);
|
|
let _ = stdout.write(b"\n");
|
|
assert_eq!(&buffer[start_index..], b"-6235");
|
|
|
|
let large_num: u64 = 35320842;
|
|
start_index = large_num.numtoa(10, &mut buffer);
|
|
let _ = stdout.write(&buffer[start_index..]);
|
|
let _ = stdout.write(b"\n");
|
|
assert_eq!(&buffer[start_index..], b"35320842");
|
|
|
|
let max_u64: u64 = 18446744073709551615;
|
|
start_index = max_u64.numtoa(10, &mut buffer);
|
|
let _ = stdout.write(&buffer[start_index..]);
|
|
let _ = stdout.write(b"\n");
|
|
assert_eq!(&buffer[start_index..], b"18446744073709551615");
|
|
```
|