-//! Generic array are commonly used as a return value for hash digests, so
-//! it's a good idea to allow to hexlify them easily. This module implements
-//! `std::fmt::LowerHex` and `std::fmt::UpperHex` traits.
-//!
-//! Example:
-//!
-//! ```rust
-//! # #[macro_use]
-//! # extern crate generic_array;
-//! # extern crate typenum;
-//! # fn main() {
-//! let array = arr![u8; 10, 20, 30];
-//! assert_eq!(format!("{:x}", array), "0a141e");
-//! # }
-//! ```
-//!
-
-use {ArrayLength, GenericArray};
-use core::fmt;
-use core::ops::Add;
-use core::str;
-use typenum::*;
-
-static LOWER_CHARS: &'static [u8] = b"0123456789abcdef";
-static UPPER_CHARS: &'static [u8] = b"0123456789ABCDEF";
-
-impl<T: ArrayLength<u8>> fmt::LowerHex for GenericArray<u8, T>
-where
- T: Add<T>,
- <T as Add<T>>::Output: ArrayLength<u8>,
-{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let max_digits = f.precision().unwrap_or_else(|| self.len());
-
- if T::to_usize() < 1024 {
- // For small arrays use a stack allocated
- // buffer of 2x number of bytes
- let mut res = GenericArray::<u8, Sum<T, T>>::default();
-
- for (i, c) in self.iter().take(max_digits).enumerate() {
- res[i * 2] = LOWER_CHARS[(c >> 4) as usize];
- res[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize];
- }
- f.write_str(
- unsafe { str::from_utf8_unchecked(&res[..max_digits * 2]) },
- )?;
- } else {
- // For large array use chunks of up to 1024 bytes (2048 hex chars)
- let mut buf = [0u8; 2048];
-
- for chunk in self[..max_digits].chunks(1024) {
- for (i, c) in chunk.iter().enumerate() {
- buf[i * 2] = LOWER_CHARS[(c >> 4) as usize];
- buf[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize];
- }
- f.write_str(unsafe {
- str::from_utf8_unchecked(&buf[..chunk.len() * 2])
- })?;
- }
- }
- Ok(())
- }
-}
-
-impl<T: ArrayLength<u8>> fmt::UpperHex for GenericArray<u8, T>
-where
- T: Add<T>,
- <T as Add<T>>::Output: ArrayLength<u8>,
-{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let max_digits = f.precision().unwrap_or_else(|| self.len());
-
- if T::to_usize() < 1024 {
- // For small arrays use a stack allocated
- // buffer of 2x number of bytes
- let mut res = GenericArray::<u8, Sum<T, T>>::default();
-
- for (i, c) in self.iter().take(max_digits).enumerate() {
- res[i * 2] = UPPER_CHARS[(c >> 4) as usize];
- res[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize];
- }
- f.write_str(
- unsafe { str::from_utf8_unchecked(&res[..max_digits * 2]) },
- )?;
- } else {
- // For large array use chunks of up to 1024 bytes (2048 hex chars)
- let mut buf = [0u8; 2048];
-
- for chunk in self[..max_digits].chunks(1024) {
- for (i, c) in chunk.iter().enumerate() {
- buf[i * 2] = UPPER_CHARS[(c >> 4) as usize];
- buf[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize];
- }
- f.write_str(unsafe {
- str::from_utf8_unchecked(&buf[..chunk.len() * 2])
- })?;
- }
- }
- Ok(())
- }
-}
+//! Generic array are commonly used as a return value for hash digests, so\r
+//! it's a good idea to allow to hexlify them easily. This module implements\r
+//! `std::fmt::LowerHex` and `std::fmt::UpperHex` traits.\r
+//!\r
+//! Example:\r
+//!\r
+//! ```rust\r
+//! # #[macro_use]\r
+//! # extern crate generic_array;\r
+//! # extern crate typenum;\r
+//! # fn main() {\r
+//! let array = arr![u8; 10, 20, 30];\r
+//! assert_eq!(format!("{:x}", array), "0a141e");\r
+//! # }\r
+//! ```\r
+//!\r
+\r
+use {ArrayLength, GenericArray};\r
+use core::cmp::min;\r
+use core::fmt;\r
+use core::ops::Add;\r
+use core::str;\r
+use typenum::*;\r
+\r
+static LOWER_CHARS: &'static [u8] = b"0123456789abcdef";\r
+static UPPER_CHARS: &'static [u8] = b"0123456789ABCDEF";\r
+\r
+impl<T: ArrayLength<u8>> fmt::LowerHex for GenericArray<u8, T>\r
+where\r
+ T: Add<T>,\r
+ <T as Add<T>>::Output: ArrayLength<u8>,\r
+{\r
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\r
+ let max_digits = f.precision().unwrap_or_else(|| self.len() * 2);\r
+ let max_hex = (max_digits >> 1) + (max_digits & 1);\r
+\r
+ if T::to_usize() < 1024 {\r
+ // For small arrays use a stack allocated\r
+ // buffer of 2x number of bytes\r
+ let mut res = GenericArray::<u8, Sum<T, T>>::default();\r
+\r
+ for (i, c) in self.iter().take(max_hex).enumerate() {\r
+ res[i * 2] = LOWER_CHARS[(c >> 4) as usize];\r
+ res[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize];\r
+ }\r
+ f.write_str(unsafe { str::from_utf8_unchecked(&res[..max_digits]) })?;\r
+ } else {\r
+ // For large array use chunks of up to 1024 bytes (2048 hex chars)\r
+ let mut buf = [0u8; 2048];\r
+ let mut digits_left = max_digits;\r
+\r
+ for chunk in self[..max_hex].chunks(1024) {\r
+ for (i, c) in chunk.iter().enumerate() {\r
+ buf[i * 2] = LOWER_CHARS[(c >> 4) as usize];\r
+ buf[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize];\r
+ }\r
+ let n = min(chunk.len() * 2, digits_left);\r
+ f.write_str(unsafe { str::from_utf8_unchecked(&buf[..n]) })?;\r
+ digits_left -= n;\r
+ }\r
+ }\r
+ Ok(())\r
+ }\r
+}\r
+\r
+impl<T: ArrayLength<u8>> fmt::UpperHex for GenericArray<u8, T>\r
+where\r
+ T: Add<T>,\r
+ <T as Add<T>>::Output: ArrayLength<u8>,\r
+{\r
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\r
+ let max_digits = f.precision().unwrap_or_else(|| self.len() * 2);\r
+ let max_hex = (max_digits >> 1) + (max_digits & 1);\r
+\r
+ if T::to_usize() < 1024 {\r
+ // For small arrays use a stack allocated\r
+ // buffer of 2x number of bytes\r
+ let mut res = GenericArray::<u8, Sum<T, T>>::default();\r
+\r
+ for (i, c) in self.iter().take(max_hex).enumerate() {\r
+ res[i * 2] = UPPER_CHARS[(c >> 4) as usize];\r
+ res[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize];\r
+ }\r
+ f.write_str(unsafe { str::from_utf8_unchecked(&res[..max_digits]) })?;\r
+ } else {\r
+ // For large array use chunks of up to 1024 bytes (2048 hex chars)\r
+ let mut buf = [0u8; 2048];\r
+ let mut digits_left = max_digits;\r
+\r
+ for chunk in self[..max_hex].chunks(1024) {\r
+ for (i, c) in chunk.iter().enumerate() {\r
+ buf[i * 2] = UPPER_CHARS[(c >> 4) as usize];\r
+ buf[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize];\r
+ }\r
+ let n = min(chunk.len() * 2, digits_left);\r
+ f.write_str(unsafe { str::from_utf8_unchecked(&buf[..n]) })?;\r
+ digits_left -= n;\r
+ }\r
+ }\r
+ Ok(())\r
+ }\r
+}\r