mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-02 19:45:46 +00:00
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");
|
||
|
```
|