mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	 64dfd1090d
			
		
	
	
		64dfd1090d
		
	
	
	
	
		
			
			Since all output characters taken from `BASE_64` are valid UTF8 chars there is no need to waste cycles on validation. Even though it's obviously a perf win, I've also used a [benchmark](https://gist.github.com/ttsugriy/e1e63c07927d8f31e71695a9c617bbf3) on M1 MacBook Air with following results: ``` Running benches/base_n_benchmark.rs (target/release/deps/base_n_benchmark-825fe5895b5c2693) push_str/old time: [14.670 µs 14.852 µs 15.074 µs] Performance has regressed. Found 11 outliers among 100 measurements (11.00%) 4 (4.00%) high mild 7 (7.00%) high severe push_str/new time: [12.573 µs 12.674 µs 12.801 µs] Performance has regressed. Found 11 outliers among 100 measurements (11.00%) 7 (7.00%) high mild 4 (4.00%) high severe ```
		
			
				
	
	
		
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| /// Converts unsigned integers into a string representation with some base.
 | |
| /// Bases up to and including 36 can be used for case-insensitive things.
 | |
| use std::str;
 | |
| 
 | |
| #[cfg(test)]
 | |
| mod tests;
 | |
| 
 | |
| pub const MAX_BASE: usize = 64;
 | |
| pub const ALPHANUMERIC_ONLY: usize = 62;
 | |
| pub const CASE_INSENSITIVE: usize = 36;
 | |
| 
 | |
| const BASE_64: &[u8; MAX_BASE] =
 | |
|     b"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@$";
 | |
| 
 | |
| #[inline]
 | |
| pub fn push_str(mut n: u128, base: usize, output: &mut String) {
 | |
|     debug_assert!(base >= 2 && base <= MAX_BASE);
 | |
|     let mut s = [0u8; 128];
 | |
|     let mut index = s.len();
 | |
| 
 | |
|     let base = base as u128;
 | |
| 
 | |
|     loop {
 | |
|         index -= 1;
 | |
|         s[index] = BASE_64[(n % base) as usize];
 | |
|         n /= base;
 | |
| 
 | |
|         if n == 0 {
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     output.push_str(unsafe {
 | |
|         // SAFETY: `s` is populated using only valid utf8 characters from `BASE_64`
 | |
|         str::from_utf8_unchecked(&s[index..])
 | |
|     });
 | |
| }
 | |
| 
 | |
| #[inline]
 | |
| pub fn encode(n: u128, base: usize) -> String {
 | |
|     let mut s = String::new();
 | |
|     push_str(n, base, &mut s);
 | |
|     s
 | |
| }
 |