Rollup merge of #28896 - mkpankov:core-fmt, r=nrc
<!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/rust-lang/rust/28896) <!-- Reviewable:end -->
This commit is contained in:
@@ -61,7 +61,8 @@ pub struct DebugStruct<'a, 'b: 'a> {
|
|||||||
has_fields: bool,
|
has_fields: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn debug_struct_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>, name: &str)
|
pub fn debug_struct_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>,
|
||||||
|
name: &str)
|
||||||
-> DebugStruct<'a, 'b> {
|
-> DebugStruct<'a, 'b> {
|
||||||
let result = fmt.write_str(name);
|
let result = fmt.write_str(name);
|
||||||
DebugStruct {
|
DebugStruct {
|
||||||
@@ -84,7 +85,8 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
|
|||||||
|
|
||||||
if self.is_pretty() {
|
if self.is_pretty() {
|
||||||
let mut writer = PadAdapter::new(self.fmt);
|
let mut writer = PadAdapter::new(self.fmt);
|
||||||
fmt::write(&mut writer, format_args!("{}\n{}: {:#?}", prefix, name, value))
|
fmt::write(&mut writer,
|
||||||
|
format_args!("{}\n{}: {:#?}", prefix, name, value))
|
||||||
} else {
|
} else {
|
||||||
write!(self.fmt, "{} {}: {:?}", prefix, name, value)
|
write!(self.fmt, "{} {}: {:?}", prefix, name, value)
|
||||||
}
|
}
|
||||||
@@ -195,10 +197,18 @@ impl<'a, 'b: 'a> DebugInner<'a, 'b> {
|
|||||||
self.result = self.result.and_then(|_| {
|
self.result = self.result.and_then(|_| {
|
||||||
if self.is_pretty() {
|
if self.is_pretty() {
|
||||||
let mut writer = PadAdapter::new(self.fmt);
|
let mut writer = PadAdapter::new(self.fmt);
|
||||||
let prefix = if self.has_fields { "," } else { "" };
|
let prefix = if self.has_fields {
|
||||||
|
","
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
fmt::write(&mut writer, format_args!("{}\n{:#?}", prefix, entry))
|
fmt::write(&mut writer, format_args!("{}\n{:#?}", prefix, entry))
|
||||||
} else {
|
} else {
|
||||||
let prefix = if self.has_fields { ", " } else { "" };
|
let prefix = if self.has_fields {
|
||||||
|
", "
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
write!(self.fmt, "{}{:?}", prefix, entry)
|
write!(self.fmt, "{}{:?}", prefix, entry)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -207,7 +217,11 @@ impl<'a, 'b: 'a> DebugInner<'a, 'b> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn finish(&mut self) {
|
pub fn finish(&mut self) {
|
||||||
let prefix = if self.is_pretty() && self.has_fields { "\n" } else { "" };
|
let prefix = if self.is_pretty() && self.has_fields {
|
||||||
|
"\n"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
self.result = self.result.and_then(|_| self.fmt.write_str(prefix));
|
self.result = self.result.and_then(|_| self.fmt.write_str(prefix));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,7 +246,7 @@ pub fn debug_set_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugSet<'a, 'b
|
|||||||
fmt: fmt,
|
fmt: fmt,
|
||||||
result: result,
|
result: result,
|
||||||
has_fields: false,
|
has_fields: false,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,7 +261,9 @@ impl<'a, 'b: 'a> DebugSet<'a, 'b> {
|
|||||||
/// Adds the contents of an iterator of entries to the set output.
|
/// Adds the contents of an iterator of entries to the set output.
|
||||||
#[stable(feature = "debug_builders", since = "1.2.0")]
|
#[stable(feature = "debug_builders", since = "1.2.0")]
|
||||||
pub fn entries<D, I>(&mut self, entries: I) -> &mut DebugSet<'a, 'b>
|
pub fn entries<D, I>(&mut self, entries: I) -> &mut DebugSet<'a, 'b>
|
||||||
where D: fmt::Debug, I: IntoIterator<Item=D> {
|
where D: fmt::Debug,
|
||||||
|
I: IntoIterator<Item = D>
|
||||||
|
{
|
||||||
for entry in entries {
|
for entry in entries {
|
||||||
self.entry(&entry);
|
self.entry(&entry);
|
||||||
}
|
}
|
||||||
@@ -278,7 +294,7 @@ pub fn debug_list_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugList<'a,
|
|||||||
fmt: fmt,
|
fmt: fmt,
|
||||||
result: result,
|
result: result,
|
||||||
has_fields: false,
|
has_fields: false,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +309,9 @@ impl<'a, 'b: 'a> DebugList<'a, 'b> {
|
|||||||
/// Adds the contents of an iterator of entries to the list output.
|
/// Adds the contents of an iterator of entries to the list output.
|
||||||
#[stable(feature = "debug_builders", since = "1.2.0")]
|
#[stable(feature = "debug_builders", since = "1.2.0")]
|
||||||
pub fn entries<D, I>(&mut self, entries: I) -> &mut DebugList<'a, 'b>
|
pub fn entries<D, I>(&mut self, entries: I) -> &mut DebugList<'a, 'b>
|
||||||
where D: fmt::Debug, I: IntoIterator<Item=D> {
|
where D: fmt::Debug,
|
||||||
|
I: IntoIterator<Item = D>
|
||||||
|
{
|
||||||
for entry in entries {
|
for entry in entries {
|
||||||
self.entry(&entry);
|
self.entry(&entry);
|
||||||
}
|
}
|
||||||
@@ -335,10 +353,19 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
|
|||||||
self.result = self.result.and_then(|_| {
|
self.result = self.result.and_then(|_| {
|
||||||
if self.is_pretty() {
|
if self.is_pretty() {
|
||||||
let mut writer = PadAdapter::new(self.fmt);
|
let mut writer = PadAdapter::new(self.fmt);
|
||||||
let prefix = if self.has_fields { "," } else { "" };
|
let prefix = if self.has_fields {
|
||||||
fmt::write(&mut writer, format_args!("{}\n{:#?}: {:#?}", prefix, key, value))
|
","
|
||||||
} else {
|
} else {
|
||||||
let prefix = if self.has_fields { ", " } else { "" };
|
""
|
||||||
|
};
|
||||||
|
fmt::write(&mut writer,
|
||||||
|
format_args!("{}\n{:#?}: {:#?}", prefix, key, value))
|
||||||
|
} else {
|
||||||
|
let prefix = if self.has_fields {
|
||||||
|
", "
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
write!(self.fmt, "{}{:?}: {:?}", prefix, key, value)
|
write!(self.fmt, "{}{:?}: {:?}", prefix, key, value)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -350,7 +377,10 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
|
|||||||
/// Adds the contents of an iterator of entries to the map output.
|
/// Adds the contents of an iterator of entries to the map output.
|
||||||
#[stable(feature = "debug_builders", since = "1.2.0")]
|
#[stable(feature = "debug_builders", since = "1.2.0")]
|
||||||
pub fn entries<K, V, I>(&mut self, entries: I) -> &mut DebugMap<'a, 'b>
|
pub fn entries<K, V, I>(&mut self, entries: I) -> &mut DebugMap<'a, 'b>
|
||||||
where K: fmt::Debug, V: fmt::Debug, I: IntoIterator<Item=(K, V)> {
|
where K: fmt::Debug,
|
||||||
|
V: fmt::Debug,
|
||||||
|
I: IntoIterator<Item = (K, V)>
|
||||||
|
{
|
||||||
for (k, v) in entries {
|
for (k, v) in entries {
|
||||||
self.entry(&k, &v);
|
self.entry(&k, &v);
|
||||||
}
|
}
|
||||||
@@ -360,7 +390,11 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
|
|||||||
/// Finishes output and returns any error encountered.
|
/// Finishes output and returns any error encountered.
|
||||||
#[stable(feature = "debug_builders", since = "1.2.0")]
|
#[stable(feature = "debug_builders", since = "1.2.0")]
|
||||||
pub fn finish(&mut self) -> fmt::Result {
|
pub fn finish(&mut self) -> fmt::Result {
|
||||||
let prefix = if self.is_pretty() && self.has_fields { "\n" } else { "" };
|
let prefix = if self.is_pretty() && self.has_fields {
|
||||||
|
"\n"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
self.result.and_then(|_| write!(self.fmt, "{}}}", prefix))
|
self.result.and_then(|_| write!(self.fmt, "{}}}", prefix))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,9 @@ trait GenericRadix {
|
|||||||
fn base(&self) -> u8;
|
fn base(&self) -> u8;
|
||||||
|
|
||||||
/// A radix-specific prefix string.
|
/// A radix-specific prefix string.
|
||||||
fn prefix(&self) -> &'static str { "" }
|
fn prefix(&self) -> &'static str {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
|
||||||
/// Converts an integer to corresponding radix digit.
|
/// Converts an integer to corresponding radix digit.
|
||||||
fn digit(&self, x: u8) -> u8;
|
fn digit(&self, x: u8) -> u8;
|
||||||
@@ -70,7 +72,10 @@ trait GenericRadix {
|
|||||||
x = x / base; // Deaccumulate the number.
|
x = x / base; // Deaccumulate the number.
|
||||||
*byte = self.digit(n.to_u8()); // Store the digit in the buffer.
|
*byte = self.digit(n.to_u8()); // Store the digit in the buffer.
|
||||||
curr -= 1;
|
curr -= 1;
|
||||||
if x == zero { break }; // No more digits left to accumulate.
|
if x == zero {
|
||||||
|
// No more digits left to accumulate.
|
||||||
|
break
|
||||||
|
};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Do the same as above, but accounting for two's complement.
|
// Do the same as above, but accounting for two's complement.
|
||||||
@@ -79,7 +84,10 @@ trait GenericRadix {
|
|||||||
x = x / base; // Deaccumulate the number.
|
x = x / base; // Deaccumulate the number.
|
||||||
*byte = self.digit(n.to_u8()); // Store the digit in the buffer.
|
*byte = self.digit(n.to_u8()); // Store the digit in the buffer.
|
||||||
curr -= 1;
|
curr -= 1;
|
||||||
if x == zero { break }; // No more digits left to accumulate.
|
if x == zero {
|
||||||
|
// No more digits left to accumulate.
|
||||||
|
break
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let buf = unsafe { str::from_utf8_unchecked(&buf[curr..]) };
|
let buf = unsafe { str::from_utf8_unchecked(&buf[curr..]) };
|
||||||
@@ -141,13 +149,17 @@ pub struct Radix {
|
|||||||
|
|
||||||
impl Radix {
|
impl Radix {
|
||||||
fn new(base: u8) -> Radix {
|
fn new(base: u8) -> Radix {
|
||||||
assert!(2 <= base && base <= 36, "the base must be in the range of 2..36: {}", base);
|
assert!(2 <= base && base <= 36,
|
||||||
|
"the base must be in the range of 2..36: {}",
|
||||||
|
base);
|
||||||
Radix { base: base }
|
Radix { base: base }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GenericRadix for Radix {
|
impl GenericRadix for Radix {
|
||||||
fn base(&self) -> u8 { self.base }
|
fn base(&self) -> u8 {
|
||||||
|
self.base
|
||||||
|
}
|
||||||
fn digit(&self, x: u8) -> u8 {
|
fn digit(&self, x: u8) -> u8 {
|
||||||
match x {
|
match x {
|
||||||
x @ 0 ... 9 => b'0' + x,
|
x @ 0 ... 9 => b'0' + x,
|
||||||
|
|||||||
@@ -53,5 +53,5 @@ pub enum Count {
|
|||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub enum Position {
|
pub enum Position {
|
||||||
Next,
|
Next,
|
||||||
At(usize)
|
At(usize),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,9 @@ pub trait Hash {
|
|||||||
|
|
||||||
/// Feeds a slice of this type into the state provided.
|
/// Feeds a slice of this type into the state provided.
|
||||||
#[stable(feature = "hash_slice", since = "1.3.0")]
|
#[stable(feature = "hash_slice", since = "1.3.0")]
|
||||||
fn hash_slice<H: Hasher>(data: &[Self], state: &mut H) where Self: Sized {
|
fn hash_slice<H: Hasher>(data: &[Self], state: &mut H)
|
||||||
|
where Self: Sized
|
||||||
|
{
|
||||||
for piece in data {
|
for piece in data {
|
||||||
piece.hash(state);
|
piece.hash(state);
|
||||||
}
|
}
|
||||||
@@ -121,7 +123,9 @@ pub trait Hasher {
|
|||||||
/// Write a single `u8` into this hasher
|
/// Write a single `u8` into this hasher
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
fn write_u8(&mut self, i: u8) { self.write(&[i]) }
|
fn write_u8(&mut self, i: u8) {
|
||||||
|
self.write(&[i])
|
||||||
|
}
|
||||||
/// Write a single `u16` into this hasher.
|
/// Write a single `u16` into this hasher.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
@@ -145,8 +149,7 @@ pub trait Hasher {
|
|||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
fn write_usize(&mut self, i: usize) {
|
fn write_usize(&mut self, i: usize) {
|
||||||
let bytes = unsafe {
|
let bytes = unsafe {
|
||||||
::slice::from_raw_parts(&i as *const usize as *const u8,
|
::slice::from_raw_parts(&i as *const usize as *const u8, mem::size_of::<usize>())
|
||||||
mem::size_of::<usize>())
|
|
||||||
};
|
};
|
||||||
self.write(bytes);
|
self.write(bytes);
|
||||||
}
|
}
|
||||||
@@ -154,23 +157,33 @@ pub trait Hasher {
|
|||||||
/// Write a single `i8` into this hasher.
|
/// Write a single `i8` into this hasher.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
fn write_i8(&mut self, i: i8) { self.write_u8(i as u8) }
|
fn write_i8(&mut self, i: i8) {
|
||||||
|
self.write_u8(i as u8)
|
||||||
|
}
|
||||||
/// Write a single `i16` into this hasher.
|
/// Write a single `i16` into this hasher.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
fn write_i16(&mut self, i: i16) { self.write_u16(i as u16) }
|
fn write_i16(&mut self, i: i16) {
|
||||||
|
self.write_u16(i as u16)
|
||||||
|
}
|
||||||
/// Write a single `i32` into this hasher.
|
/// Write a single `i32` into this hasher.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
fn write_i32(&mut self, i: i32) { self.write_u32(i as u32) }
|
fn write_i32(&mut self, i: i32) {
|
||||||
|
self.write_u32(i as u32)
|
||||||
|
}
|
||||||
/// Write a single `i64` into this hasher.
|
/// Write a single `i64` into this hasher.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
fn write_i64(&mut self, i: i64) { self.write_u64(i as u64) }
|
fn write_i64(&mut self, i: i64) {
|
||||||
|
self.write_u64(i as u64)
|
||||||
|
}
|
||||||
/// Write a single `isize` into this hasher.
|
/// Write a single `isize` into this hasher.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "hasher_write", since = "1.3.0")]
|
#[stable(feature = "hasher_write", since = "1.3.0")]
|
||||||
fn write_isize(&mut self, i: isize) { self.write_usize(i as usize) }
|
fn write_isize(&mut self, i: isize) {
|
||||||
|
self.write_usize(i as usize)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -80,8 +80,7 @@ macro_rules! u8to64_le {
|
|||||||
unsafe fn load_u64_le(buf: &[u8], i: usize) -> u64 {
|
unsafe fn load_u64_le(buf: &[u8], i: usize) -> u64 {
|
||||||
debug_assert!(i + 8 <= buf.len());
|
debug_assert!(i + 8 <= buf.len());
|
||||||
let mut data = 0u64;
|
let mut data = 0u64;
|
||||||
ptr::copy_nonoverlapping(buf.get_unchecked(i),
|
ptr::copy_nonoverlapping(buf.get_unchecked(i), &mut data as *mut _ as *mut u8, 8);
|
||||||
&mut data as *mut _ as *mut u8, 8);
|
|
||||||
data.to_le()
|
data.to_le()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,12 +151,12 @@ impl Hasher for SipHasher {
|
|||||||
if self.ntail != 0 {
|
if self.ntail != 0 {
|
||||||
needed = 8 - self.ntail;
|
needed = 8 - self.ntail;
|
||||||
if length < needed {
|
if length < needed {
|
||||||
self.tail |= u8to64_le!(msg, 0, length) << 8*self.ntail;
|
self.tail |= u8to64_le!(msg, 0, length) << 8 * self.ntail;
|
||||||
self.ntail += length;
|
self.ntail += length;
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let m = self.tail | u8to64_le!(msg, 0, needed) << 8*self.ntail;
|
let m = self.tail | u8to64_le!(msg, 0, needed) << 8 * self.ntail;
|
||||||
|
|
||||||
self.v3 ^= m;
|
self.v3 ^= m;
|
||||||
compress!(self.v0, self.v1, self.v2, self.v3);
|
compress!(self.v0, self.v1, self.v2, self.v3);
|
||||||
|
|||||||
Reference in New Issue
Block a user