]> git.proxmox.com Git - rustc.git/blobdiff - vendor/generic-array/src/hex.rs
New upstream version 1.44.1+dfsg1
[rustc.git] / vendor / generic-array / src / hex.rs
index 1ce5332f781e8a9424037dd4a41aaed96ded626e..09a6608e37ce07fc1c30383a38a38313d3aa361e 100644 (file)
-//! 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