Auto merge of #32054 - seanmonstar:impl-debug-core, r=alexcrichton

libcore: add Debug implementations to most missing types

Also adds `#![deny(missing_debug_implementations)]` to the core crate.

cc #31869
This commit is contained in:
bors 2016-03-21 00:07:33 -07:00
commit 7ec8f5c369
17 changed files with 319 additions and 34 deletions

View File

@ -416,14 +416,14 @@ pub fn encode_utf16_raw(mut ch: u32, dst: &mut [u16]) -> Option<usize> {
/// ///
/// [`escape_unicode()`]: ../../std/primitive.char.html#method.escape_unicode /// [`escape_unicode()`]: ../../std/primitive.char.html#method.escape_unicode
/// [`char`]: ../../std/primitive.char.html /// [`char`]: ../../std/primitive.char.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct EscapeUnicode { pub struct EscapeUnicode {
c: char, c: char,
state: EscapeUnicodeState state: EscapeUnicodeState
} }
#[derive(Clone)] #[derive(Clone, Debug)]
enum EscapeUnicodeState { enum EscapeUnicodeState {
Backslash, Backslash,
Type, Type,
@ -496,13 +496,13 @@ impl Iterator for EscapeUnicode {
/// ///
/// [`escape_default()`]: ../../std/primitive.char.html#method.escape_default /// [`escape_default()`]: ../../std/primitive.char.html#method.escape_default
/// [`char`]: ../../std/primitive.char.html /// [`char`]: ../../std/primitive.char.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct EscapeDefault { pub struct EscapeDefault {
state: EscapeDefaultState state: EscapeDefaultState
} }
#[derive(Clone)] #[derive(Clone, Debug)]
enum EscapeDefaultState { enum EscapeDefaultState {
Backslash(char), Backslash(char),
Char(char), Char(char),

View File

@ -54,6 +54,7 @@ impl<'a, 'b: 'a> fmt::Write for PadAdapter<'a, 'b> {
/// ///
/// Constructed by the `Formatter::debug_struct` method. /// Constructed by the `Formatter::debug_struct` method.
#[must_use] #[must_use]
#[allow(missing_debug_implementations)]
#[stable(feature = "debug_builders", since = "1.2.0")] #[stable(feature = "debug_builders", since = "1.2.0")]
pub struct DebugStruct<'a, 'b: 'a> { pub struct DebugStruct<'a, 'b: 'a> {
fmt: &'a mut fmt::Formatter<'b>, fmt: &'a mut fmt::Formatter<'b>,
@ -120,6 +121,7 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
/// ///
/// Constructed by the `Formatter::debug_tuple` method. /// Constructed by the `Formatter::debug_tuple` method.
#[must_use] #[must_use]
#[allow(missing_debug_implementations)]
#[stable(feature = "debug_builders", since = "1.2.0")] #[stable(feature = "debug_builders", since = "1.2.0")]
pub struct DebugTuple<'a, 'b: 'a> { pub struct DebugTuple<'a, 'b: 'a> {
fmt: &'a mut fmt::Formatter<'b>, fmt: &'a mut fmt::Formatter<'b>,
@ -231,6 +233,7 @@ impl<'a, 'b: 'a> DebugInner<'a, 'b> {
/// ///
/// Constructed by the `Formatter::debug_set` method. /// Constructed by the `Formatter::debug_set` method.
#[must_use] #[must_use]
#[allow(missing_debug_implementations)]
#[stable(feature = "debug_builders", since = "1.2.0")] #[stable(feature = "debug_builders", since = "1.2.0")]
pub struct DebugSet<'a, 'b: 'a> { pub struct DebugSet<'a, 'b: 'a> {
inner: DebugInner<'a, 'b>, inner: DebugInner<'a, 'b>,
@ -279,6 +282,7 @@ impl<'a, 'b: 'a> DebugSet<'a, 'b> {
/// ///
/// Constructed by the `Formatter::debug_list` method. /// Constructed by the `Formatter::debug_list` method.
#[must_use] #[must_use]
#[allow(missing_debug_implementations)]
#[stable(feature = "debug_builders", since = "1.2.0")] #[stable(feature = "debug_builders", since = "1.2.0")]
pub struct DebugList<'a, 'b: 'a> { pub struct DebugList<'a, 'b: 'a> {
inner: DebugInner<'a, 'b>, inner: DebugInner<'a, 'b>,
@ -327,6 +331,7 @@ impl<'a, 'b: 'a> DebugList<'a, 'b> {
/// ///
/// Constructed by the `Formatter::debug_map` method. /// Constructed by the `Formatter::debug_map` method.
#[must_use] #[must_use]
#[allow(missing_debug_implementations)]
#[stable(feature = "debug_builders", since = "1.2.0")] #[stable(feature = "debug_builders", since = "1.2.0")]
pub struct DebugMap<'a, 'b: 'a> { pub struct DebugMap<'a, 'b: 'a> {
fmt: &'a mut fmt::Formatter<'b>, fmt: &'a mut fmt::Formatter<'b>,

View File

@ -14,7 +14,7 @@
use prelude::v1::*; use prelude::v1::*;
use cell::{Cell, RefCell, Ref, RefMut, BorrowState}; use cell::{UnsafeCell, Cell, RefCell, Ref, RefMut, BorrowState};
use marker::PhantomData; use marker::PhantomData;
use mem; use mem;
use num::flt2dec; use num::flt2dec;
@ -25,6 +25,7 @@ use str;
#[unstable(feature = "fmt_flags_align", issue = "27726")] #[unstable(feature = "fmt_flags_align", issue = "27726")]
/// Possible alignments returned by `Formatter::align` /// Possible alignments returned by `Formatter::align`
#[derive(Debug)]
pub enum Alignment { pub enum Alignment {
/// Indication that contents should be left-aligned. /// Indication that contents should be left-aligned.
Left, Left,
@ -152,6 +153,7 @@ impl<'a, W: Write + ?Sized> Write for &'a mut W {
/// A struct to represent both where to emit formatting strings to and how they /// A struct to represent both where to emit formatting strings to and how they
/// should be formatted. A mutable version of this is passed to all formatting /// should be formatted. A mutable version of this is passed to all formatting
/// traits. /// traits.
#[allow(missing_debug_implementations)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Formatter<'a> { pub struct Formatter<'a> {
flags: u32, flags: u32,
@ -175,6 +177,7 @@ enum Void {}
/// compile time it is ensured that the function and the value have the correct /// compile time it is ensured that the function and the value have the correct
/// types, and then this struct is used to canonicalize arguments to one type. /// types, and then this struct is used to canonicalize arguments to one type.
#[derive(Copy)] #[derive(Copy)]
#[allow(missing_debug_implementations)]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", #[unstable(feature = "fmt_internals", reason = "internal to format_args!",
issue = "0")] issue = "0")]
#[doc(hidden)] #[doc(hidden)]
@ -1585,7 +1588,9 @@ impl<T: ?Sized> Debug for PhantomData<T> {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<T: Copy + Debug> Debug for Cell<T> { impl<T: Copy + Debug> Debug for Cell<T> {
fn fmt(&self, f: &mut Formatter) -> Result { fn fmt(&self, f: &mut Formatter) -> Result {
write!(f, "Cell {{ value: {:?} }}", self.get()) f.debug_struct("Cell")
.field("value", &self.get())
.finish()
} }
} }
@ -1594,9 +1599,15 @@ impl<T: ?Sized + Debug> Debug for RefCell<T> {
fn fmt(&self, f: &mut Formatter) -> Result { fn fmt(&self, f: &mut Formatter) -> Result {
match self.borrow_state() { match self.borrow_state() {
BorrowState::Unused | BorrowState::Reading => { BorrowState::Unused | BorrowState::Reading => {
write!(f, "RefCell {{ value: {:?} }}", self.borrow()) f.debug_struct("RefCell")
.field("value", &self.borrow())
.finish()
}
BorrowState::Writing => {
f.debug_struct("RefCell")
.field("value", &"<borrowed>")
.finish()
} }
BorrowState::Writing => write!(f, "RefCell {{ <borrowed> }}"),
} }
} }
} }
@ -1615,5 +1626,12 @@ impl<'b, T: ?Sized + Debug> Debug for RefMut<'b, T> {
} }
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<T: ?Sized + Debug> Debug for UnsafeCell<T> {
fn fmt(&self, f: &mut Formatter) -> Result {
f.pad("UnsafeCell")
}
}
// If you expected tests to be here, look instead at the run-pass/ifmt.rs test, // If you expected tests to be here, look instead at the run-pass/ifmt.rs test,
// it's a lot easier than creating all of the rt::Piece structures here. // it's a lot easier than creating all of the rt::Piece structures here.

View File

@ -13,6 +13,7 @@
//! //!
//! These definitions are similar to their `ct` equivalents, but differ in that //! These definitions are similar to their `ct` equivalents, but differ in that
//! these can be statically allocated and are slightly optimized for the runtime //! these can be statically allocated and are slightly optimized for the runtime
#![allow(missing_debug_implementations)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct Argument { pub struct Argument {

View File

@ -73,6 +73,7 @@
use prelude::v1::*; use prelude::v1::*;
use fmt;
use marker; use marker;
use mem; use mem;
@ -215,6 +216,13 @@ pub trait BuildHasher {
#[stable(since = "1.7.0", feature = "build_hasher")] #[stable(since = "1.7.0", feature = "build_hasher")]
pub struct BuildHasherDefault<H>(marker::PhantomData<H>); pub struct BuildHasherDefault<H>(marker::PhantomData<H>);
#[stable(since = "1.9.0", feature = "core_impl_debug")]
impl<H> fmt::Debug for BuildHasherDefault<H> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad("BuildHasherDefault")
}
}
#[stable(since = "1.7.0", feature = "build_hasher")] #[stable(since = "1.7.0", feature = "build_hasher")]
impl<H: Default + Hasher> BuildHasher for BuildHasherDefault<H> { impl<H: Default + Hasher> BuildHasher for BuildHasherDefault<H> {
type Hasher = H; type Hasher = H;

View File

@ -30,6 +30,7 @@ use super::Hasher;
/// Although the SipHash algorithm is considered to be generally strong, /// Although the SipHash algorithm is considered to be generally strong,
/// it is not intended for cryptographic purposes. As such, all /// it is not intended for cryptographic purposes. As such, all
/// cryptographic uses of this implementation are _strongly discouraged_. /// cryptographic uses of this implementation are _strongly discouraged_.
#[derive(Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct SipHasher { pub struct SipHasher {
k0: u64, k0: u64,

View File

@ -303,6 +303,7 @@ use clone::Clone;
use cmp; use cmp;
use cmp::{Ord, PartialOrd, PartialEq, Ordering}; use cmp::{Ord, PartialOrd, PartialEq, Ordering};
use default::Default; use default::Default;
use fmt;
use marker; use marker;
use mem; use mem;
use num::{Zero, One}; use num::{Zero, One};
@ -2929,7 +2930,7 @@ impl<A, B> ExactSizeIterator for Zip<A, B>
/// ///
/// [`rev()`]: trait.Iterator.html#method.rev /// [`rev()`]: trait.Iterator.html#method.rev
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Rev<T> { pub struct Rev<T> {
@ -2961,7 +2962,7 @@ impl<I> DoubleEndedIterator for Rev<I> where I: DoubleEndedIterator {
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[stable(feature = "iter_cloned", since = "1.1.0")] #[stable(feature = "iter_cloned", since = "1.1.0")]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct Cloned<I> { pub struct Cloned<I> {
it: I, it: I,
} }
@ -3002,7 +3003,7 @@ impl<'a, I, T: 'a> ExactSizeIterator for Cloned<I>
/// ///
/// [`cycle()`]: trait.Iterator.html#method.cycle /// [`cycle()`]: trait.Iterator.html#method.cycle
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Cycle<I> { pub struct Cycle<I> {
@ -3040,7 +3041,7 @@ impl<I> Iterator for Cycle<I> where I: Clone + Iterator {
/// ///
/// [`chain()`]: trait.Iterator.html#method.chain /// [`chain()`]: trait.Iterator.html#method.chain
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Chain<A, B> { pub struct Chain<A, B> {
@ -3062,7 +3063,7 @@ pub struct Chain<A, B> {
// //
// The fourth state (neither iterator is remaining) only occurs after Chain has // The fourth state (neither iterator is remaining) only occurs after Chain has
// returned None once, so we don't need to store this state. // returned None once, so we don't need to store this state.
#[derive(Clone)] #[derive(Clone, Debug)]
enum ChainState { enum ChainState {
// both front and back iterator are remaining // both front and back iterator are remaining
Both, Both,
@ -3184,7 +3185,7 @@ impl<A, B> DoubleEndedIterator for Chain<A, B> where
/// ///
/// [`zip()`]: trait.Iterator.html#method.zip /// [`zip()`]: trait.Iterator.html#method.zip
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Zip<A, B> { pub struct Zip<A, B> {
@ -3307,6 +3308,15 @@ pub struct Map<I, F> {
f: F, f: F,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, F> fmt::Debug for Map<I, F> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Map")
.field("iter", &self.iter)
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<B, I: Iterator, F> Iterator for Map<I, F> where F: FnMut(I::Item) -> B { impl<B, I: Iterator, F> Iterator for Map<I, F> where F: FnMut(I::Item) -> B {
type Item = B; type Item = B;
@ -3347,6 +3357,15 @@ pub struct Filter<I, P> {
predicate: P, predicate: P,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, P> fmt::Debug for Filter<I, P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Filter")
.field("iter", &self.iter)
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool { impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool {
type Item = I::Item; type Item = I::Item;
@ -3398,6 +3417,15 @@ pub struct FilterMap<I, F> {
f: F, f: F,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, F> fmt::Debug for FilterMap<I, F> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("FilterMap")
.field("iter", &self.iter)
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<B, I: Iterator, F> Iterator for FilterMap<I, F> impl<B, I: Iterator, F> Iterator for FilterMap<I, F>
where F: FnMut(I::Item) -> Option<B>, where F: FnMut(I::Item) -> Option<B>,
@ -3443,7 +3471,7 @@ impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for FilterMap<I, F>
/// ///
/// [`enumerate()`]: trait.Iterator.html#method.enumerate /// [`enumerate()`]: trait.Iterator.html#method.enumerate
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Enumerate<I> { pub struct Enumerate<I> {
@ -3517,7 +3545,7 @@ impl<I> DoubleEndedIterator for Enumerate<I> where
/// ///
/// [`peekable()`]: trait.Iterator.html#method.peekable /// [`peekable()`]: trait.Iterator.html#method.peekable
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Peekable<I: Iterator> { pub struct Peekable<I: Iterator> {
@ -3676,6 +3704,16 @@ pub struct SkipWhile<I, P> {
predicate: P, predicate: P,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, P> fmt::Debug for SkipWhile<I, P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SkipWhile")
.field("iter", &self.iter)
.field("flag", &self.flag)
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<I: Iterator, P> Iterator for SkipWhile<I, P> impl<I: Iterator, P> Iterator for SkipWhile<I, P>
where P: FnMut(&I::Item) -> bool where P: FnMut(&I::Item) -> bool
@ -3716,6 +3754,16 @@ pub struct TakeWhile<I, P> {
predicate: P, predicate: P,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, P> fmt::Debug for TakeWhile<I, P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("TakeWhile")
.field("iter", &self.iter)
.field("flag", &self.flag)
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<I: Iterator, P> Iterator for TakeWhile<I, P> impl<I: Iterator, P> Iterator for TakeWhile<I, P>
where P: FnMut(&I::Item) -> bool where P: FnMut(&I::Item) -> bool
@ -3752,7 +3800,7 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
/// ///
/// [`skip()`]: trait.Iterator.html#method.skip /// [`skip()`]: trait.Iterator.html#method.skip
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Skip<I> { pub struct Skip<I> {
@ -3843,7 +3891,7 @@ impl<I> DoubleEndedIterator for Skip<I> where I: DoubleEndedIterator + ExactSize
/// ///
/// [`take()`]: trait.Iterator.html#method.take /// [`take()`]: trait.Iterator.html#method.take
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Take<I> { pub struct Take<I> {
@ -3914,6 +3962,16 @@ pub struct Scan<I, St, F> {
state: St, state: St,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, St: fmt::Debug, F> fmt::Debug for Scan<I, St, F> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Scan")
.field("iter", &self.iter)
.field("state", &self.state)
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<B, I, St, F> Iterator for Scan<I, St, F> where impl<B, I, St, F> Iterator for Scan<I, St, F> where
I: Iterator, I: Iterator,
@ -3951,6 +4009,19 @@ pub struct FlatMap<I, U: IntoIterator, F> {
backiter: Option<U::IntoIter>, backiter: Option<U::IntoIter>,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, U: IntoIterator, F> fmt::Debug for FlatMap<I, U, F>
where U::IntoIter: fmt::Debug
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("FlatMap")
.field("iter", &self.iter)
.field("frontiter", &self.frontiter)
.field("backiter", &self.backiter)
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F> impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
where F: FnMut(I::Item) -> U, where F: FnMut(I::Item) -> U,
@ -4014,7 +4085,7 @@ impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F> wher
/// ///
/// [`fuse()`]: trait.Iterator.html#method.fuse /// [`fuse()`]: trait.Iterator.html#method.fuse
/// [`Iterator`]: trait.Iterator.html /// [`Iterator`]: trait.Iterator.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Fuse<I> { pub struct Fuse<I> {
@ -4109,6 +4180,15 @@ pub struct Inspect<I, F> {
f: F, f: F,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<I: fmt::Debug, F> fmt::Debug for Inspect<I, F> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Inspect")
.field("iter", &self.iter)
.finish()
}
}
impl<I: Iterator, F> Inspect<I, F> where F: FnMut(&I::Item) { impl<I: Iterator, F> Inspect<I, F> where F: FnMut(&I::Item) {
#[inline] #[inline]
fn do_inspect(&mut self, elt: Option<I::Item>) -> Option<I::Item> { fn do_inspect(&mut self, elt: Option<I::Item>) -> Option<I::Item> {
@ -4272,7 +4352,7 @@ step_impl_no_between!(u64 i64);
/// The resulting iterator handles overflow by stopping. The `A` /// The resulting iterator handles overflow by stopping. The `A`
/// parameter is the type being iterated over, while `R` is the range /// parameter is the type being iterated over, while `R` is the range
/// type (usually one of `std::ops::{Range, RangeFrom, RangeInclusive}`. /// type (usually one of `std::ops::{Range, RangeFrom, RangeInclusive}`.
#[derive(Clone)] #[derive(Clone, Debug)]
#[unstable(feature = "step_by", reason = "recent addition", #[unstable(feature = "step_by", reason = "recent addition",
issue = "27741")] issue = "27741")]
pub struct StepBy<A, R> { pub struct StepBy<A, R> {
@ -4679,7 +4759,7 @@ impl<A: Step + One> DoubleEndedIterator for ops::RangeInclusive<A> where
/// This `struct` is created by the [`repeat()`] function. See its documentation for more. /// This `struct` is created by the [`repeat()`] function. See its documentation for more.
/// ///
/// [`repeat()`]: fn.repeat.html /// [`repeat()`]: fn.repeat.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Repeat<A> { pub struct Repeat<A> {
element: A element: A
@ -4761,6 +4841,13 @@ pub fn repeat<T: Clone>(elt: T) -> Repeat<T> {
#[stable(feature = "iter_empty", since = "1.2.0")] #[stable(feature = "iter_empty", since = "1.2.0")]
pub struct Empty<T>(marker::PhantomData<T>); pub struct Empty<T>(marker::PhantomData<T>);
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<T> fmt::Debug for Empty<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad("Empty")
}
}
#[stable(feature = "iter_empty", since = "1.2.0")] #[stable(feature = "iter_empty", since = "1.2.0")]
impl<T> Iterator for Empty<T> { impl<T> Iterator for Empty<T> {
type Item = T; type Item = T;
@ -4830,7 +4917,7 @@ pub fn empty<T>() -> Empty<T> {
/// This `struct` is created by the [`once()`] function. See its documentation for more. /// This `struct` is created by the [`once()`] function. See its documentation for more.
/// ///
/// [`once()`]: fn.once.html /// [`once()`]: fn.once.html
#[derive(Clone)] #[derive(Clone, Debug)]
#[stable(feature = "iter_once", since = "1.2.0")] #[stable(feature = "iter_once", since = "1.2.0")]
pub struct Once<T> { pub struct Once<T> {
inner: ::option::IntoIter<T> inner: ::option::IntoIter<T>

View File

@ -56,6 +56,7 @@
#![no_core] #![no_core]
#![deny(missing_docs)] #![deny(missing_docs)]
#![deny(missing_debug_implementations)]
#![cfg_attr(not(stage0), deny(warnings))] #![cfg_attr(not(stage0), deny(warnings))]
#![feature(allow_internal_unstable)] #![feature(allow_internal_unstable)]

View File

@ -222,6 +222,7 @@ impl<'a> Part<'a> {
/// Formatted result containing one or more parts. /// Formatted result containing one or more parts.
/// This can be written to the byte buffer or converted to the allocated string. /// This can be written to the byte buffer or converted to the allocated string.
#[allow(missing_debug_implementations)]
#[derive(Clone)] #[derive(Clone)]
pub struct Formatted<'a> { pub struct Formatted<'a> {
/// A byte slice representing a sign, either `""`, `"-"` or `"+"`. /// A byte slice representing a sign, either `""`, `"-"` or `"+"`.

View File

@ -763,7 +763,7 @@ impl<'a, T> IntoIterator for &'a mut Option<T> {
// The Option Iterators // The Option Iterators
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#[derive(Clone)] #[derive(Clone, Debug)]
struct Item<A> { struct Item<A> {
opt: Option<A> opt: Option<A>
} }
@ -796,6 +796,7 @@ impl<A> ExactSizeIterator for Item<A> {}
/// An iterator over a reference of the contained item in an Option. /// An iterator over a reference of the contained item in an Option.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[derive(Debug)]
pub struct Iter<'a, A: 'a> { inner: Item<&'a A> } pub struct Iter<'a, A: 'a> { inner: Item<&'a A> }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -826,6 +827,7 @@ impl<'a, A> Clone for Iter<'a, A> {
/// An iterator over a mutable reference of the contained item in an Option. /// An iterator over a mutable reference of the contained item in an Option.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[derive(Debug)]
pub struct IterMut<'a, A: 'a> { inner: Item<&'a mut A> } pub struct IterMut<'a, A: 'a> { inner: Item<&'a mut A> }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -848,7 +850,7 @@ impl<'a, A> DoubleEndedIterator for IterMut<'a, A> {
impl<'a, A> ExactSizeIterator for IterMut<'a, A> {} impl<'a, A> ExactSizeIterator for IterMut<'a, A> {}
/// An iterator over the item contained inside an Option. /// An iterator over the item contained inside an Option.
#[derive(Clone)] #[derive(Clone, Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct IntoIter<A> { inner: Item<A> } pub struct IntoIter<A> { inner: Item<A> }

View File

@ -520,6 +520,7 @@ impl<T: ?Sized> PartialOrd for *mut T {
/// modified without a unique path to the `Unique` reference. Useful /// modified without a unique path to the `Unique` reference. Useful
/// for building abstractions like `Vec<T>` or `Box<T>`, which /// for building abstractions like `Vec<T>` or `Box<T>`, which
/// internally use raw pointers to manage the memory that they own. /// internally use raw pointers to manage the memory that they own.
#[allow(missing_debug_implementations)]
#[unstable(feature = "unique", reason = "needs an RFC to flesh out design", #[unstable(feature = "unique", reason = "needs an RFC to flesh out design",
issue = "27730")] issue = "27730")]
pub struct Unique<T: ?Sized> { pub struct Unique<T: ?Sized> {
@ -592,6 +593,7 @@ impl<T> fmt::Pointer for Unique<T> {
/// of this wrapper has shared ownership of the referent. Useful for /// of this wrapper has shared ownership of the referent. Useful for
/// building abstractions like `Rc<T>` or `Arc<T>`, which internally /// building abstractions like `Rc<T>` or `Arc<T>`, which internally
/// use raw pointers to manage the memory that they own. /// use raw pointers to manage the memory that they own.
#[allow(missing_debug_implementations)]
#[unstable(feature = "shared", reason = "needs an RFC to flesh out design", #[unstable(feature = "shared", reason = "needs an RFC to flesh out design",
issue = "27730")] issue = "27730")]
pub struct Shared<T: ?Sized> { pub struct Shared<T: ?Sized> {

View File

@ -59,6 +59,7 @@ use mem;
/// println!("data pointer = {:?}, length = {}", repr.data, repr.len); /// println!("data pointer = {:?}, length = {}", repr.data, repr.len);
/// ``` /// ```
#[repr(C)] #[repr(C)]
#[allow(missing_debug_implementations)]
pub struct Slice<T> { pub struct Slice<T> {
pub data: *const T, pub data: *const T,
pub len: usize, pub len: usize,
@ -143,6 +144,7 @@ impl<T> Clone for Slice<T> {
/// ``` /// ```
#[repr(C)] #[repr(C)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[allow(missing_debug_implementations)]
pub struct TraitObject { pub struct TraitObject {
pub data: *mut (), pub data: *mut (),
pub vtable: *mut (), pub vtable: *mut (),

View File

@ -799,6 +799,7 @@ impl<'a, T, E> IntoIterator for &'a mut Result<T, E> {
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
/// An iterator over a reference to the `Ok` variant of a `Result`. /// An iterator over a reference to the `Ok` variant of a `Result`.
#[derive(Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Iter<'a, T: 'a> { inner: Option<&'a T> } pub struct Iter<'a, T: 'a> { inner: Option<&'a T> }
@ -830,6 +831,7 @@ impl<'a, T> Clone for Iter<'a, T> {
} }
/// An iterator over a mutable reference to the `Ok` variant of a `Result`. /// An iterator over a mutable reference to the `Ok` variant of a `Result`.
#[derive(Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct IterMut<'a, T: 'a> { inner: Option<&'a mut T> } pub struct IterMut<'a, T: 'a> { inner: Option<&'a mut T> }
@ -856,6 +858,7 @@ impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {} impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
/// An iterator over the value in a `Ok` variant of a `Result`. /// An iterator over the value in a `Ok` variant of a `Result`.
#[derive(Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct IntoIter<T> { inner: Option<T> } pub struct IntoIter<T> { inner: Option<T> }

View File

@ -38,6 +38,7 @@ use cmp::{Ordering, PartialEq, PartialOrd, Eq, Ord};
use cmp::Ordering::{Less, Equal, Greater}; use cmp::Ordering::{Less, Equal, Greater};
use cmp; use cmp;
use default::Default; use default::Default;
use fmt;
use intrinsics::assume; use intrinsics::assume;
use iter::*; use iter::*;
use ops::{FnMut, self, Index}; use ops::{FnMut, self, Index};
@ -877,6 +878,15 @@ pub struct Iter<'a, T: 'a> {
_marker: marker::PhantomData<&'a T>, _marker: marker::PhantomData<&'a T>,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug> fmt::Debug for Iter<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple("Iter")
.field(&self.as_slice())
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<'a, T: Sync> Sync for Iter<'a, T> {} unsafe impl<'a, T: Sync> Sync for Iter<'a, T> {}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -925,6 +935,15 @@ pub struct IterMut<'a, T: 'a> {
_marker: marker::PhantomData<&'a mut T>, _marker: marker::PhantomData<&'a mut T>,
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug> fmt::Debug for IterMut<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple("IterMut")
.field(&make_slice!(self.ptr, self.end))
.finish()
}
}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<'a, T: Sync> Sync for IterMut<'a, T> {} unsafe impl<'a, T: Sync> Sync for IterMut<'a, T> {}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -980,6 +999,16 @@ pub struct Split<'a, T:'a, P> where P: FnMut(&T) -> bool {
finished: bool finished: bool
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for Split<'a, T, P> where P: FnMut(&T) -> bool {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Split")
.field("v", &self.v)
.field("finished", &self.finished)
.finish()
}
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]` // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<'a, T, P> Clone for Split<'a, T, P> where P: Clone + FnMut(&T) -> bool { impl<'a, T, P> Clone for Split<'a, T, P> where P: Clone + FnMut(&T) -> bool {
@ -1053,6 +1082,16 @@ pub struct SplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool {
finished: bool finished: bool
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SplitMut")
.field("v", &self.v)
.field("finished", &self.finished)
.finish()
}
}
impl<'a, T, P> SplitIter for SplitMut<'a, T, P> where P: FnMut(&T) -> bool { impl<'a, T, P> SplitIter for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
#[inline] #[inline]
fn finish(&mut self) -> Option<&'a mut [T]> { fn finish(&mut self) -> Option<&'a mut [T]> {
@ -1127,6 +1166,7 @@ impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> where
/// An private iterator over subslices separated by elements that /// An private iterator over subslices separated by elements that
/// match a predicate function, splitting at most a fixed number of /// match a predicate function, splitting at most a fixed number of
/// times. /// times.
#[derive(Debug)]
struct GenericSplitN<I> { struct GenericSplitN<I> {
iter: I, iter: I,
count: usize, count: usize,
@ -1162,6 +1202,15 @@ pub struct SplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<Split<'a, T, P>> inner: GenericSplitN<Split<'a, T, P>>
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for SplitN<'a, T, P> where P: FnMut(&T) -> bool {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SplitN")
.field("inner", &self.inner)
.finish()
}
}
/// An iterator over subslices separated by elements that match a /// An iterator over subslices separated by elements that match a
/// predicate function, limited to a given number of splits, starting /// predicate function, limited to a given number of splits, starting
/// from the end of the slice. /// from the end of the slice.
@ -1170,6 +1219,15 @@ pub struct RSplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<Split<'a, T, P>> inner: GenericSplitN<Split<'a, T, P>>
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for RSplitN<'a, T, P> where P: FnMut(&T) -> bool {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("RSplitN")
.field("inner", &self.inner)
.finish()
}
}
/// An iterator over subslices separated by elements that match a predicate /// An iterator over subslices separated by elements that match a predicate
/// function, limited to a given number of splits. /// function, limited to a given number of splits.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -1177,6 +1235,15 @@ pub struct SplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<SplitMut<'a, T, P>> inner: GenericSplitN<SplitMut<'a, T, P>>
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for SplitNMut<'a, T, P> where P: FnMut(&T) -> bool {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SplitNMut")
.field("inner", &self.inner)
.finish()
}
}
/// An iterator over subslices separated by elements that match a /// An iterator over subslices separated by elements that match a
/// predicate function, limited to a given number of splits, starting /// predicate function, limited to a given number of splits, starting
/// from the end of the slice. /// from the end of the slice.
@ -1185,6 +1252,15 @@ pub struct RSplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<SplitMut<'a, T, P>> inner: GenericSplitN<SplitMut<'a, T, P>>
} }
#[stable(feature = "core_impl_debug", since = "1.9.0")]
impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for RSplitNMut<'a, T, P> where P: FnMut(&T) -> bool {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("RSplitNMut")
.field("inner", &self.inner)
.finish()
}
}
macro_rules! forward_iterator { macro_rules! forward_iterator {
($name:ident: $elem:ident, $iter_of:ty) => { ($name:ident: $elem:ident, $iter_of:ty) => {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -1212,6 +1288,7 @@ forward_iterator! { SplitNMut: T, &'a mut [T] }
forward_iterator! { RSplitNMut: T, &'a mut [T] } forward_iterator! { RSplitNMut: T, &'a mut [T] }
/// An iterator over overlapping subslices of length `size`. /// An iterator over overlapping subslices of length `size`.
#[derive(Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Windows<'a, T:'a> { pub struct Windows<'a, T:'a> {
v: &'a [T], v: &'a [T],
@ -1305,6 +1382,7 @@ impl<'a, T> ExactSizeIterator for Windows<'a, T> {}
/// ///
/// When the slice len is not evenly divided by the chunk size, the last slice /// When the slice len is not evenly divided by the chunk size, the last slice
/// of the iteration will be the remainder. /// of the iteration will be the remainder.
#[derive(Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Chunks<'a, T:'a> { pub struct Chunks<'a, T:'a> {
v: &'a [T], v: &'a [T],
@ -1405,6 +1483,7 @@ impl<'a, T> ExactSizeIterator for Chunks<'a, T> {}
/// An iterator over a slice in (non-overlapping) mutable chunks (`size` /// An iterator over a slice in (non-overlapping) mutable chunks (`size`
/// elements at a time). When the slice len is not evenly divided by the chunk /// elements at a time). When the slice len is not evenly divided by the chunk
/// size, the last slice of the iteration will be the remainder. /// size, the last slice of the iteration will be the remainder.
#[derive(Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct ChunksMut<'a, T:'a> { pub struct ChunksMut<'a, T:'a> {
v: &'a mut [T], v: &'a mut [T],

View File

@ -323,7 +323,7 @@ Section: Iterators
/// Created with the method [`chars()`]. /// Created with the method [`chars()`].
/// ///
/// [`chars()`]: ../../std/primitive.str.html#method.chars /// [`chars()`]: ../../std/primitive.str.html#method.chars
#[derive(Clone)] #[derive(Clone, Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct Chars<'a> { pub struct Chars<'a> {
iter: slice::Iter<'a, u8> iter: slice::Iter<'a, u8>
@ -468,7 +468,7 @@ impl<'a> Chars<'a> {
} }
/// Iterator for a string's characters and their byte offsets. /// Iterator for a string's characters and their byte offsets.
#[derive(Clone)] #[derive(Clone, Debug)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct CharIndices<'a> { pub struct CharIndices<'a> {
front_offset: usize, front_offset: usize,
@ -533,7 +533,7 @@ impl<'a> CharIndices<'a> {
/// ///
/// [`bytes()`]: ../../std/primitive.str.html#method.bytes /// [`bytes()`]: ../../std/primitive.str.html#method.bytes
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct Bytes<'a>(Cloned<slice::Iter<'a, u8>>); pub struct Bytes<'a>(Cloned<slice::Iter<'a, u8>>);
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -662,6 +662,17 @@ macro_rules! generate_pattern_iterators {
$(#[$common_stability_attribute])* $(#[$common_stability_attribute])*
pub struct $forward_iterator<'a, P: Pattern<'a>>($internal_iterator<'a, P>); pub struct $forward_iterator<'a, P: Pattern<'a>>($internal_iterator<'a, P>);
$(#[$common_stability_attribute])*
impl<'a, P: Pattern<'a>> fmt::Debug for $forward_iterator<'a, P>
where P::Searcher: fmt::Debug
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple(stringify!($forward_iterator))
.field(&self.0)
.finish()
}
}
$(#[$common_stability_attribute])* $(#[$common_stability_attribute])*
impl<'a, P: Pattern<'a>> Iterator for $forward_iterator<'a, P> { impl<'a, P: Pattern<'a>> Iterator for $forward_iterator<'a, P> {
type Item = $iterty; type Item = $iterty;
@ -685,6 +696,17 @@ macro_rules! generate_pattern_iterators {
$(#[$common_stability_attribute])* $(#[$common_stability_attribute])*
pub struct $reverse_iterator<'a, P: Pattern<'a>>($internal_iterator<'a, P>); pub struct $reverse_iterator<'a, P: Pattern<'a>>($internal_iterator<'a, P>);
$(#[$common_stability_attribute])*
impl<'a, P: Pattern<'a>> fmt::Debug for $reverse_iterator<'a, P>
where P::Searcher: fmt::Debug
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple(stringify!($reverse_iterator))
.field(&self.0)
.finish()
}
}
$(#[$common_stability_attribute])* $(#[$common_stability_attribute])*
impl<'a, P: Pattern<'a>> Iterator for $reverse_iterator<'a, P> impl<'a, P: Pattern<'a>> Iterator for $reverse_iterator<'a, P>
where P::Searcher: ReverseSearcher<'a> where P::Searcher: ReverseSearcher<'a>
@ -746,6 +768,7 @@ derive_pattern_clone!{
clone SplitInternal clone SplitInternal
with |s| SplitInternal { matcher: s.matcher.clone(), ..*s } with |s| SplitInternal { matcher: s.matcher.clone(), ..*s }
} }
struct SplitInternal<'a, P: Pattern<'a>> { struct SplitInternal<'a, P: Pattern<'a>> {
start: usize, start: usize,
end: usize, end: usize,
@ -754,6 +777,18 @@ struct SplitInternal<'a, P: Pattern<'a>> {
finished: bool, finished: bool,
} }
impl<'a, P: Pattern<'a>> fmt::Debug for SplitInternal<'a, P> where P::Searcher: fmt::Debug {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SplitInternal")
.field("start", &self.start)
.field("end", &self.end)
.field("matcher", &self.matcher)
.field("allow_trailing_empty", &self.allow_trailing_empty)
.field("finished", &self.finished)
.finish()
}
}
impl<'a, P: Pattern<'a>> SplitInternal<'a, P> { impl<'a, P: Pattern<'a>> SplitInternal<'a, P> {
#[inline] #[inline]
fn get_end(&mut self) -> Option<&'a str> { fn get_end(&mut self) -> Option<&'a str> {
@ -852,12 +887,22 @@ derive_pattern_clone!{
clone SplitNInternal clone SplitNInternal
with |s| SplitNInternal { iter: s.iter.clone(), ..*s } with |s| SplitNInternal { iter: s.iter.clone(), ..*s }
} }
struct SplitNInternal<'a, P: Pattern<'a>> { struct SplitNInternal<'a, P: Pattern<'a>> {
iter: SplitInternal<'a, P>, iter: SplitInternal<'a, P>,
/// The number of splits remaining /// The number of splits remaining
count: usize, count: usize,
} }
impl<'a, P: Pattern<'a>> fmt::Debug for SplitNInternal<'a, P> where P::Searcher: fmt::Debug {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SplitNInternal")
.field("iter", &self.iter)
.field("count", &self.count)
.finish()
}
}
impl<'a, P: Pattern<'a>> SplitNInternal<'a, P> { impl<'a, P: Pattern<'a>> SplitNInternal<'a, P> {
#[inline] #[inline]
fn next(&mut self) -> Option<&'a str> { fn next(&mut self) -> Option<&'a str> {
@ -902,8 +947,17 @@ derive_pattern_clone!{
clone MatchIndicesInternal clone MatchIndicesInternal
with |s| MatchIndicesInternal(s.0.clone()) with |s| MatchIndicesInternal(s.0.clone())
} }
struct MatchIndicesInternal<'a, P: Pattern<'a>>(P::Searcher); struct MatchIndicesInternal<'a, P: Pattern<'a>>(P::Searcher);
impl<'a, P: Pattern<'a>> fmt::Debug for MatchIndicesInternal<'a, P> where P::Searcher: fmt::Debug {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple("MatchIndicesInternal")
.field(&self.0)
.finish()
}
}
impl<'a, P: Pattern<'a>> MatchIndicesInternal<'a, P> { impl<'a, P: Pattern<'a>> MatchIndicesInternal<'a, P> {
#[inline] #[inline]
fn next(&mut self) -> Option<(usize, &'a str)> { fn next(&mut self) -> Option<(usize, &'a str)> {
@ -944,8 +998,17 @@ derive_pattern_clone!{
clone MatchesInternal clone MatchesInternal
with |s| MatchesInternal(s.0.clone()) with |s| MatchesInternal(s.0.clone())
} }
struct MatchesInternal<'a, P: Pattern<'a>>(P::Searcher); struct MatchesInternal<'a, P: Pattern<'a>>(P::Searcher);
impl<'a, P: Pattern<'a>> fmt::Debug for MatchesInternal<'a, P> where P::Searcher: fmt::Debug {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple("MatchesInternal")
.field(&self.0)
.finish()
}
}
impl<'a, P: Pattern<'a>> MatchesInternal<'a, P> { impl<'a, P: Pattern<'a>> MatchesInternal<'a, P> {
#[inline] #[inline]
fn next(&mut self) -> Option<&'a str> { fn next(&mut self) -> Option<&'a str> {
@ -988,7 +1051,7 @@ generate_pattern_iterators! {
/// ///
/// [`lines()`]: ../../std/primitive.str.html#method.lines /// [`lines()`]: ../../std/primitive.str.html#method.lines
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct Lines<'a>(Map<SplitTerminator<'a, char>, LinesAnyMap>); pub struct Lines<'a>(Map<SplitTerminator<'a, char>, LinesAnyMap>);
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -1019,7 +1082,7 @@ impl<'a> DoubleEndedIterator for Lines<'a> {
/// [`lines_any()`]: ../../std/primitive.str.html#method.lines_any /// [`lines_any()`]: ../../std/primitive.str.html#method.lines_any
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_deprecated(since = "1.4.0", reason = "use lines()/Lines instead now")] #[rustc_deprecated(since = "1.4.0", reason = "use lines()/Lines instead now")]
#[derive(Clone)] #[derive(Clone, Debug)]
#[allow(deprecated)] #[allow(deprecated)]
pub struct LinesAny<'a>(Lines<'a>); pub struct LinesAny<'a>(Lines<'a>);
@ -1242,7 +1305,7 @@ static UTF8_CHAR_WIDTH: [u8; 256] = [
/// Struct that contains a `char` and the index of the first byte of /// Struct that contains a `char` and the index of the first byte of
/// the next `char` in a string. This can be used as a data structure /// the next `char` in a string. This can be used as a data structure
/// for iterating over the UTF-8 bytes of a string. /// for iterating over the UTF-8 bytes of a string.
#[derive(Copy, Clone)] #[derive(Copy, Clone, Debug)]
#[unstable(feature = "str_char", #[unstable(feature = "str_char",
reason = "existence of this struct is uncertain as it is frequently \ reason = "existence of this struct is uncertain as it is frequently \
able to be replaced with char.len_utf8() and/or \ able to be replaced with char.len_utf8() and/or \

View File

@ -20,6 +20,7 @@
use prelude::v1::*; use prelude::v1::*;
use cmp; use cmp;
use fmt;
use usize; use usize;
// Pattern // Pattern
@ -275,7 +276,7 @@ impl<'a> CharEq for &'a [char] {
struct CharEqPattern<C: CharEq>(C); struct CharEqPattern<C: CharEq>(C);
#[derive(Clone)] #[derive(Clone, Debug)]
struct CharEqSearcher<'a, C: CharEq> { struct CharEqSearcher<'a, C: CharEq> {
char_eq: C, char_eq: C,
haystack: &'a str, haystack: &'a str,
@ -415,7 +416,7 @@ macro_rules! searcher_methods {
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
/// Associated type for `<char as Pattern<'a>>::Searcher`. /// Associated type for `<char as Pattern<'a>>::Searcher`.
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct CharSearcher<'a>(<CharEqPattern<char> as Pattern<'a>>::Searcher); pub struct CharSearcher<'a>(<CharEqPattern<char> as Pattern<'a>>::Searcher);
unsafe impl<'a> Searcher<'a> for CharSearcher<'a> { unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
@ -440,7 +441,7 @@ impl<'a> Pattern<'a> for char {
// Todo: Change / Remove due to ambiguity in meaning. // Todo: Change / Remove due to ambiguity in meaning.
/// Associated type for `<&[char] as Pattern<'a>>::Searcher`. /// Associated type for `<&[char] as Pattern<'a>>::Searcher`.
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct CharSliceSearcher<'a, 'b>(<CharEqPattern<&'b [char]> as Pattern<'a>>::Searcher); pub struct CharSliceSearcher<'a, 'b>(<CharEqPattern<&'b [char]> as Pattern<'a>>::Searcher);
unsafe impl<'a, 'b> Searcher<'a> for CharSliceSearcher<'a, 'b> { unsafe impl<'a, 'b> Searcher<'a> for CharSliceSearcher<'a, 'b> {
@ -467,6 +468,17 @@ impl<'a, 'b> Pattern<'a> for &'b [char] {
pub struct CharPredicateSearcher<'a, F>(<CharEqPattern<F> as Pattern<'a>>::Searcher) pub struct CharPredicateSearcher<'a, F>(<CharEqPattern<F> as Pattern<'a>>::Searcher)
where F: FnMut(char) -> bool; where F: FnMut(char) -> bool;
impl<'a, F> fmt::Debug for CharPredicateSearcher<'a, F>
where F: FnMut(char) -> bool
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("CharPredicateSearcher")
.field("haystack", &self.0.haystack)
.field("char_indices", &self.0.char_indices)
.field("ascii_only", &self.0.ascii_only)
.finish()
}
}
unsafe impl<'a, F> Searcher<'a> for CharPredicateSearcher<'a, F> unsafe impl<'a, F> Searcher<'a> for CharPredicateSearcher<'a, F>
where F: FnMut(char) -> bool where F: FnMut(char) -> bool
{ {

View File

@ -162,7 +162,7 @@ unsafe impl<T> Sync for AtomicPtr<T> {}
/// Rust's memory orderings are [the same as /// Rust's memory orderings are [the same as
/// LLVM's](http://llvm.org/docs/LangRef.html#memory-model-for-concurrent-operations). /// LLVM's](http://llvm.org/docs/LangRef.html#memory-model-for-concurrent-operations).
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[derive(Copy, Clone)] #[derive(Copy, Clone, Debug)]
pub enum Ordering { pub enum Ordering {
/// No ordering constraints, only atomic operations. Corresponds to LLVM's /// No ordering constraints, only atomic operations. Corresponds to LLVM's
/// `Monotonic` ordering. /// `Monotonic` ordering.