// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
//! Threadsafe reference-counted boxes (the `Arc<T>` type).
//!
/// }
/// ```
#[unsafe_no_drop_flag]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Arc<T> {
// FIXME #12808: strange name to try to avoid interfering with
// field accesses of the contained type via Deref
/// Weak pointers will not keep the data inside of the `Arc` alive, and can be used to break cycles
/// between `Arc` pointers.
#[unsafe_no_drop_flag]
-#[unstable = "Weak pointers may not belong in this module."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
pub struct Weak<T> {
// FIXME #12808: strange name to try to avoid interfering with
// field accesses of the contained type via Deref
/// let five = Arc::new(5i);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(data: T) -> Arc<T> {
// Start the weak pointer count as 1 which is the weak pointer that's
// held by all the strong pointers (kinda), see std/rc.rs for more info
///
/// let weak_five = five.downgrade();
/// ```
- #[unstable = "Weak pointers may not belong in this module."]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
pub fn downgrade(&self) -> Weak<T> {
// See the clone() impl for why this is relaxed
self.inner().weak.fetch_add(1, Relaxed);
/// Get the number of weak references to this value.
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn weak_count<T>(this: &Arc<T>) -> uint { this.inner().weak.load(SeqCst) - 1 }
/// Get the number of strong references to this value.
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn strong_count<T>(this: &Arc<T>) -> uint { this.inner().strong.load(SeqCst) }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Clone for Arc<T> {
/// Makes a clone of the `Arc<T>`.
///
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Deref for Arc<T> {
type Target = T;
/// let mut_five = five.make_unique();
/// ```
#[inline]
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn make_unique(&mut self) -> &mut T {
// Note that we hold a strong reference, which also counts as a weak reference, so we only
// clone if there is an additional reference of either kind.
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Sync + Send> Drop for Arc<T> {
/// Drops the `Arc<T>`.
///
}
}
-#[unstable = "Weak pointers may not belong in this module."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
impl<T: Sync + Send> Weak<T> {
/// Upgrades a weak reference to a strong reference.
///
}
}
-#[unstable = "Weak pointers may not belong in this module."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
impl<T: Sync + Send> Clone for Weak<T> {
/// Makes a clone of the `Weak<T>`.
///
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Sync + Send> Drop for Weak<T> {
/// Drops the `Weak<T>`.
///
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: PartialEq> PartialEq for Arc<T> {
/// Equality for two `Arc<T>`s.
///
/// ```
fn ne(&self, other: &Arc<T>) -> bool { *(*self) != *(*other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: PartialOrd> PartialOrd for Arc<T> {
/// Partial comparison for two `Arc<T>`s.
///
/// ```
fn ge(&self, other: &Arc<T>) -> bool { *(*self) >= *(*other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> Ord for Arc<T> {
fn cmp(&self, other: &Arc<T>) -> Ordering { (**self).cmp(&**other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Eq> Eq for Arc<T> {}
impl<T: fmt::Show> fmt::Show for Arc<T> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: fmt::String> fmt::String for Arc<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::String::fmt(&**self, f)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Default + Sync + Send> Default for Arc<T> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Arc<T> { Arc::new(Default::default()) }
}
//! A unique pointer type.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use core::any::Any;
use core::clone::Clone;
/// }
/// ```
#[lang = "exchange_heap"]
-#[unstable = "may be renamed; uncertain about custom allocator design"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be renamed; uncertain about custom allocator design")]
pub static HEAP: () = ();
/// A type that represents a uniquely-owned value.
#[lang = "owned_box"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Box<T>(Unique<T>);
impl<T> Box<T> {
/// Moves `x` into a freshly allocated box on the global exchange heap.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(x: T) -> Box<T> {
box x
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Default> Default for Box<T> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Box<T> { box Default::default() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Default for Box<[T]> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Box<[T]> { box [] }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Clone> Clone for Box<T> {
/// Returns a copy of the owned box.
#[inline]
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: ?Sized + PartialEq> PartialEq for Box<T> {
#[inline]
fn eq(&self, other: &Box<T>) -> bool { PartialEq::eq(&**self, &**other) }
#[inline]
fn ne(&self, other: &Box<T>) -> bool { PartialEq::ne(&**self, &**other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: ?Sized + PartialOrd> PartialOrd for Box<T> {
#[inline]
fn partial_cmp(&self, other: &Box<T>) -> Option<Ordering> {
#[inline]
fn gt(&self, other: &Box<T>) -> bool { PartialOrd::gt(&**self, &**other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: ?Sized + Ord> Ord for Box<T> {
#[inline]
fn cmp(&self, other: &Box<T>) -> Ordering {
Ord::cmp(&**self, &**other)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: ?Sized + Eq> Eq for Box<T> {}
impl<S: hash::Hasher, T: ?Sized + Hash<S>> Hash<S> for Box<T> {
}
/// Extension methods for an owning `Any` trait object.
-#[unstable = "this trait will likely disappear once compiler bugs blocking \
- a direct impl on `Box<Any>` have been fixed "]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this trait will likely disappear once compiler bugs blocking \
+ a direct impl on `Box<Any>` have been fixed ")]
// FIXME(#18737): this should be a direct impl on `Box<Any>`. If you're
// removing this please make sure that you can downcase on
// `Box<Any + Send>` as well as `Box<Any>`
pub trait BoxAny {
/// Returns the boxed value if it is of type `T`, or
/// `Err(Self)` if it isn't.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn downcast<T: 'static>(self) -> Result<Box<T>, Self>;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl BoxAny for Box<Any> {
#[inline]
fn downcast<T: 'static>(self) -> Result<Box<T>, Box<Any>> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: ?Sized + fmt::String> fmt::String for Box<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::String::fmt(&**self, f)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: ?Sized> Deref for Box<T> {
type Target = T;
fn deref(&self) -> &T { &**self }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: ?Sized> DerefMut for Box<T> {
fn deref_mut(&mut self) -> &mut T { &mut **self }
}
///
/// These statistics may be inconsistent if other threads use the allocator
/// during the call.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn stats_print() {
imp::stats_print();
}
//! default global allocator. It is not compatible with the libc allocator API.
#![crate_name = "alloc"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
//! }
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use core::borrow::BorrowFrom;
use core::cell::Cell;
///
/// See the [module level documentation](../index.html) for more details.
#[unsafe_no_drop_flag]
-#[stable]
#[cfg(stage0)] // NOTE remove impl after next snapshot
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Rc<T> {
// FIXME #12808: strange names to try to avoid interfering with field accesses of the contained
// type via Deref
///
/// See the [module level documentation](../index.html) for more details.
#[unsafe_no_drop_flag]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub struct Rc<T> {
// FIXME #12808: strange names to try to avoid interfering with field accesses of the contained
///
/// let five = Rc::new(5i);
/// ```
- #[stable]
#[cfg(stage0)] // NOTE remove after next snapshot
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(value: T) -> Rc<T> {
unsafe {
Rc {
///
/// let five = Rc::new(5i);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub fn new(value: T) -> Rc<T> {
unsafe {
/// let weak_five = five.downgrade();
/// ```
#[cfg(stage0)] // NOTE remove after next snapshot
- #[unstable = "Weak pointers may not belong in this module"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module")]
pub fn downgrade(&self) -> Weak<T> {
self.inc_weak();
Weak {
/// let weak_five = five.downgrade();
/// ```
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
- #[unstable = "Weak pointers may not belong in this module"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module")]
pub fn downgrade(&self) -> Weak<T> {
self.inc_weak();
Weak { _ptr: self._ptr }
/// Get the number of weak references to this value.
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn weak_count<T>(this: &Rc<T>) -> uint { this.weak() - 1 }
/// Get the number of strong references to this value.
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn strong_count<T>(this: &Rc<T>) -> uint { this.strong() }
/// Returns true if there are no other `Rc` or `Weak<T>` values that share the same inner value.
/// rc::is_unique(&five);
/// ```
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn is_unique<T>(rc: &Rc<T>) -> bool {
weak_count(rc) == 0 && strong_count(rc) == 1
}
/// assert_eq!(rc::try_unwrap(x), Err(Rc::new(4u)));
/// ```
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn try_unwrap<T>(rc: Rc<T>) -> Result<T, Rc<T>> {
if is_unique(&rc) {
unsafe {
/// assert!(rc::get_mut(&mut x).is_none());
/// ```
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn get_mut<'a, T>(rc: &'a mut Rc<T>) -> Option<&'a mut T> {
if is_unique(rc) {
let inner = unsafe { &mut **rc._ptr };
/// let mut_five = five.make_unique();
/// ```
#[inline]
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn make_unique(&mut self) -> &mut T {
if !is_unique(self) {
*self = Rc::new((**self).clone())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Deref for Rc<T> {
type Target = T;
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Drop for Rc<T> {
/// Drops the `Rc<T>`.
///
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Clone for Rc<T> {
/// Makes a clone of the `Rc<T>`.
///
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Default> Default for Rc<T> {
/// Creates a new `Rc<T>`, with the `Default` value for `T`.
///
/// let x: Rc<int> = Default::default();
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Rc<T> {
Rc::new(Default::default())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: PartialEq> PartialEq for Rc<T> {
/// Equality for two `Rc<T>`s.
///
fn ne(&self, other: &Rc<T>) -> bool { **self != **other }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Eq> Eq for Rc<T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: PartialOrd> PartialOrd for Rc<T> {
/// Partial comparison for two `Rc<T>`s.
///
fn ge(&self, other: &Rc<T>) -> bool { **self >= **other }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> Ord for Rc<T> {
/// Comparison for two `Rc<T>`s.
///
}
}
-#[unstable = "Show is experimental."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "Show is experimental.")]
impl<T: fmt::Show> fmt::Show for Rc<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Rc({:?})", **self)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: fmt::String> fmt::String for Rc<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::String::fmt(&**self, f)
///
/// See the [module level documentation](../index.html) for more.
#[unsafe_no_drop_flag]
-#[unstable = "Weak pointers may not belong in this module."]
#[cfg(stage0)] // NOTE remove impl after next snapshot
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
pub struct Weak<T> {
// FIXME #12808: strange names to try to avoid interfering with
// field accesses of the contained type via Deref
///
/// See the [module level documentation](../index.html) for more.
#[unsafe_no_drop_flag]
-#[unstable = "Weak pointers may not belong in this module."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub struct Weak<T> {
// FIXME #12808: strange names to try to avoid interfering with
impl<T> !marker::Sync for Weak<T> {}
-#[unstable = "Weak pointers may not belong in this module."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
impl<T> Weak<T> {
/// Upgrades a weak reference to a strong reference.
///
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Drop for Weak<T> {
/// Drops the `Weak<T>`.
///
}
}
-#[unstable = "Weak pointers may not belong in this module."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Weak pointers may not belong in this module.")]
impl<T> Clone for Weak<T> {
/// Makes a clone of the `Weak<T>`.
///
}
}
-#[unstable = "Show is experimental."]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "Show is experimental.")]
impl<T: fmt::Show> fmt::Show for Weak<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "(Weak)")
//! more complex, slower arena which can hold objects of any type.
#![crate_name = "arena"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
//! ```
#![allow(missing_docs)]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use core::prelude::*;
///
/// This will be a max-heap.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct BinaryHeap<T> {
data: Vec<T>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> Default for BinaryHeap<T> {
#[inline]
fn default() -> BinaryHeap<T> { BinaryHeap::new() }
/// let mut heap = BinaryHeap::new();
/// heap.push(4u);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> BinaryHeap<T> { BinaryHeap { data: vec![] } }
/// Creates an empty `BinaryHeap` with a specific capacity.
/// let mut heap = BinaryHeap::with_capacity(10);
/// heap.push(4u);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(capacity: uint) -> BinaryHeap<T> {
BinaryHeap { data: Vec::with_capacity(capacity) }
}
/// println!("{}", x);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter { iter: self.data.iter() }
}
/// println!("{}", x);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
IntoIter { iter: self.data.into_iter() }
}
/// assert_eq!(heap.peek(), Some(&5));
///
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn peek(&self) -> Option<&T> {
self.data.get(0)
}
/// assert!(heap.capacity() >= 100);
/// heap.push(4u);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint { self.data.capacity() }
/// Reserves the minimum capacity for exactly `additional` more elements to be inserted in the
/// assert!(heap.capacity() >= 100);
/// heap.push(4u);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_exact(&mut self, additional: uint) {
self.data.reserve_exact(additional);
}
/// assert!(heap.capacity() >= 100);
/// heap.push(4u);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve(&mut self, additional: uint) {
self.data.reserve(additional);
}
/// Discards as much additional capacity as possible.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn shrink_to_fit(&mut self) {
self.data.shrink_to_fit();
}
/// assert_eq!(heap.pop(), Some(1));
/// assert_eq!(heap.pop(), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop(&mut self) -> Option<T> {
self.data.pop().map(|mut item| {
if !self.is_empty() {
/// assert_eq!(heap.len(), 3);
/// assert_eq!(heap.peek(), Some(&5));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push(&mut self, item: T) {
let old_len = self.len();
self.data.push(item);
}
/// Returns the length of the binary heap.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.data.len() }
/// Checks if the binary heap is empty.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
/// Clears the binary heap, returning an iterator over the removed elements.
#[inline]
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn drain(&mut self) -> Drain<T> {
Drain { iter: self.data.drain() }
}
/// Drops all items from the binary heap.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) { self.drain(); }
}
/// `BinaryHeap` iterator.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter <'a, T: 'a> {
iter: slice::Iter<'a, T>,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Clone for Iter<'a, T> {
fn clone(&self) -> Iter<'a, T> {
Iter { iter: self.iter.clone() }
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<&'a T> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
/// An iterator that moves out of a `BinaryHeap`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<T> {
iter: vec::IntoIter<T>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> DoubleEndedIterator for IntoIter<T> {
#[inline]
fn next_back(&mut self) -> Option<T> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> ExactSizeIterator for IntoIter<T> {}
/// An iterator that drains a `BinaryHeap`.
-#[unstable = "recent addition"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recent addition")]
pub struct Drain<'a, T: 'a> {
iter: vec::Drain<'a, T>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: 'a> Iterator for Drain<'a, T> {
type Item = T;
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: 'a> DoubleEndedIterator for Drain<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<T> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: 'a> ExactSizeIterator for Drain<'a, T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> FromIterator<T> for BinaryHeap<T> {
fn from_iter<Iter: Iterator<Item=T>>(iter: Iter) -> BinaryHeap<T> {
BinaryHeap::from_vec(iter.collect())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> Extend<T> for BinaryHeap<T> {
fn extend<Iter: Iterator<Item=T>>(&mut self, mut iter: Iter) {
let (lower, _) = iter.size_hint();
/// println!("{:?}", bv);
/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
/// ```
-#[unstable = "RFC 509"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "RFC 509")]
pub struct Bitv {
/// Internal representation of the bit vector
storage: Vec<u32>,
/// use std::collections::Bitv;
/// let mut bv = Bitv::new();
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> Bitv {
Bitv { storage: Vec::new(), nbits: 0 }
}
///
/// It is important to note that this function does not specify the
/// *length* of the returned bitvector, but only the *capacity*.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(nbits: uint) -> Bitv {
Bitv {
storage: Vec::with_capacity(blocks_for_bits(nbits)),
/// assert_eq!(bv[1], true);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get(&self, i: uint) -> Option<bool> {
if i >= self.nbits {
return None;
/// assert_eq!(bv[3], true);
/// ```
#[inline]
- #[unstable = "panic semantics are likely to change in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "panic semantics are likely to change in the future")]
pub fn set(&mut self, i: uint, x: bool) {
assert!(i < self.nbits);
let w = i / u32::BITS;
/// assert_eq!(bv.iter().filter(|x| *x).count(), 7);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter {
Iter { bitv: self, next_idx: 0, end_idx: self.nbits }
}
/// bv.truncate(2);
/// assert!(bv.eq_vec(&[false, true]));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn truncate(&mut self, len: uint) {
if len < self.len() {
self.nbits = len;
/// assert_eq!(bv.len(), 3);
/// assert!(bv.capacity() >= 13);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve(&mut self, additional: uint) {
let desired_cap = self.len().checked_add(additional).expect("capacity overflow");
let storage_len = self.storage.len();
/// assert_eq!(bv.len(), 3);
/// assert!(bv.capacity() >= 13);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_exact(&mut self, additional: uint) {
let desired_cap = self.len().checked_add(additional).expect("capacity overflow");
let storage_len = self.storage.len();
/// assert!(bv.capacity() >= 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint {
self.storage.capacity().checked_mul(u32::BITS).unwrap_or(uint::MAX)
}
/// assert_eq!(bv.pop(), Some(false));
/// assert_eq!(bv.len(), 6);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop(&mut self) -> Option<bool> {
if self.is_empty() {
None
/// bv.push(false);
/// assert!(bv.eq_vec(&[true, false]));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push(&mut self, elem: bool) {
if self.nbits % u32::BITS == 0 {
self.storage.push(0);
/// Return the total number of bits in this vector
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.nbits }
/// Returns true if there are no bits in this vector
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
/// Clears all bits in this vector.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) {
for w in self.storage.iter_mut() { *w = 0u32; }
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Default for Bitv {
#[inline]
fn default() -> Bitv { Bitv::new() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl FromIterator<bool> for Bitv {
fn from_iter<I:Iterator<Item=bool>>(iterator: I) -> Bitv {
let mut ret = Bitv::new();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Extend<bool> for Bitv {
#[inline]
fn extend<I: Iterator<Item=bool>>(&mut self, mut iterator: I) {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Clone for Bitv {
#[inline]
fn clone(&self) -> Bitv {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialOrd for Bitv {
#[inline]
fn partial_cmp(&self, other: &Bitv) -> Option<Ordering> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Ord for Bitv {
#[inline]
fn cmp(&self, other: &Bitv) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl fmt::Show for Bitv {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
for bit in self.iter() {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<S: hash::Writer + hash::Hasher> hash::Hash<S> for Bitv {
fn hash(&self, state: &mut S) {
self.nbits.hash(state);
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl cmp::PartialEq for Bitv {
#[inline]
fn eq(&self, other: &Bitv) -> bool {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl cmp::Eq for Bitv {}
/// An iterator for `Bitv`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[derive(Clone)]
pub struct Iter<'a> {
bitv: &'a Bitv,
end_idx: uint,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Iter<'a> {
type Item = bool;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> DoubleEndedIterator for Iter<'a> {
#[inline]
fn next_back(&mut self) -> Option<bool> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> ExactSizeIterator for Iter<'a> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> RandomAccessIterator for Iter<'a> {
#[inline]
fn indexable(&self) -> uint {
/// assert!(bv[3]);
/// ```
#[derive(Clone)]
-#[unstable = "RFC 509"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "RFC 509")]
pub struct BitvSet {
bitv: Bitv,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Default for BitvSet {
#[inline]
fn default() -> BitvSet { BitvSet::new() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl FromIterator<uint> for BitvSet {
fn from_iter<I:Iterator<Item=uint>>(iterator: I) -> BitvSet {
let mut ret = BitvSet::new();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Extend<uint> for BitvSet {
#[inline]
fn extend<I: Iterator<Item=uint>>(&mut self, mut iterator: I) {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialOrd for BitvSet {
#[inline]
fn partial_cmp(&self, other: &BitvSet) -> Option<Ordering> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Ord for BitvSet {
#[inline]
fn cmp(&self, other: &BitvSet) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl cmp::PartialEq for BitvSet {
#[inline]
fn eq(&self, other: &BitvSet) -> bool {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl cmp::Eq for BitvSet {}
impl BitvSet {
/// let mut s = BitvSet::new();
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> BitvSet {
BitvSet { bitv: Bitv::new() }
}
/// assert!(s.capacity() >= 100);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(nbits: uint) -> BitvSet {
let bitv = Bitv::from_elem(nbits, false);
BitvSet::from_bitv(bitv)
/// assert!(s.capacity() >= 100);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint {
self.bitv.capacity()
}
/// s.reserve_len(10);
/// assert!(s.capacity() >= 10);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_len(&mut self, len: uint) {
let cur_len = self.bitv.len();
if len >= cur_len {
/// s.reserve_len_exact(10);
/// assert!(s.capacity() >= 10);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_len_exact(&mut self, len: uint) {
let cur_len = self.bitv.len();
if len >= cur_len {
/// println!("new capacity: {}", s.capacity());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn shrink_to_fit(&mut self) {
let bitv = &mut self.bitv;
// Obtain original length
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> bitv_set::Iter {
SetIter {set: self, next_idx: 0u}
}
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn union<'a>(&'a self, other: &'a BitvSet) -> Union<'a> {
fn or(w1: u32, w2: u32) -> u32 { w1 | w2 }
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn intersection<'a>(&'a self, other: &'a BitvSet) -> Intersection<'a> {
fn bitand(w1: u32, w2: u32) -> u32 { w1 & w2 }
let min = cmp::min(self.bitv.len(), other.bitv.len());
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn difference<'a>(&'a self, other: &'a BitvSet) -> Difference<'a> {
fn diff(w1: u32, w2: u32) -> u32 { w1 & !w2 }
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn symmetric_difference<'a>(&'a self, other: &'a BitvSet) -> SymmetricDifference<'a> {
fn bitxor(w1: u32, w2: u32) -> u32 { w1 ^ w2 }
/// Return the number of set bits in this set.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint {
self.bitv.blocks().fold(0, |acc, n| acc + n.count_ones())
}
/// Returns whether there are no bits set in this set
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool {
self.bitv.none()
}
/// Clears all bits in this set
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) {
self.bitv.clear();
}
/// Returns `true` if this set contains the specified integer.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn contains(&self, value: &uint) -> bool {
let bitv = &self.bitv;
*value < bitv.nbits && bitv[*value]
/// Returns `true` if the set has no elements in common with `other`.
/// This is equivalent to checking for an empty intersection.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_disjoint(&self, other: &BitvSet) -> bool {
self.intersection(other).next().is_none()
}
/// Returns `true` if the set is a subset of another.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_subset(&self, other: &BitvSet) -> bool {
let self_bitv = &self.bitv;
let other_bitv = &other.bitv;
/// Returns `true` if the set is a superset of another.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_superset(&self, other: &BitvSet) -> bool {
other.is_subset(self)
}
/// Adds a value to the set. Returns `true` if the value was not already
/// present in the set.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, value: uint) -> bool {
if self.contains(&value) {
return false;
/// Removes a value from the set. Returns `true` if the value was
/// present in the set.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove(&mut self, value: &uint) -> bool {
if !self.contains(value) {
return false;
/// An iterator for `BitvSet`.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SetIter<'a> {
set: &'a BitvSet,
next_idx: uint
next_idx: uint
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Union<'a>(TwoBitPositions<'a>);
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Intersection<'a>(Take<TwoBitPositions<'a>>);
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Difference<'a>(TwoBitPositions<'a>);
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SymmetricDifference<'a>(TwoBitPositions<'a>);
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for SetIter<'a> {
type Item = uint;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for TwoBitPositions<'a> {
type Item = uint;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Union<'a> {
type Item = uint;
#[inline] fn size_hint(&self) -> (uint, Option<uint>) { self.0.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Intersection<'a> {
type Item = uint;
#[inline] fn size_hint(&self) -> (uint, Option<uint>) { self.0.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Difference<'a> {
type Item = uint;
#[inline] fn size_hint(&self) -> (uint, Option<uint>) { self.0.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for SymmetricDifference<'a> {
type Item = uint;
/// done on each operation isn't *catastrophic*, and *is* still bounded by O(B log<sub>B</sub>n),
/// it is certainly much slower when it does.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct BTreeMap<K, V> {
root: Node<K, V>,
length: uint,
}
/// An iterator over a BTreeMap's entries.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, K: 'a, V: 'a> {
inner: AbsIter<Traversal<'a, K, V>>
}
/// A mutable iterator over a BTreeMap's entries.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, K: 'a, V: 'a> {
inner: AbsIter<MutTraversal<'a, K, V>>
}
/// An owning iterator over a BTreeMap's entries.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<K, V> {
inner: AbsIter<MoveTraversal<K, V>>
}
/// An iterator over a BTreeMap's keys.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Keys<'a, K: 'a, V: 'a> {
inner: Map<(&'a K, &'a V), &'a K, Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a K>
}
/// An iterator over a BTreeMap's values.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Values<'a, K: 'a, V: 'a> {
inner: Map<(&'a K, &'a V), &'a V, Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a V>
}
}
/// A view into a single entry in a map, which may either be vacant or occupied.
-#[unstable = "precise API still under development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still under development")]
pub enum Entry<'a, K:'a, V:'a> {
/// A vacant Entry
Vacant(VacantEntry<'a, K, V>),
}
/// A vacant Entry.
-#[unstable = "precise API still under development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still under development")]
pub struct VacantEntry<'a, K:'a, V:'a> {
key: K,
stack: stack::SearchStack<'a, K, V, node::handle::Edge, node::handle::Leaf>,
}
/// An occupied Entry.
-#[unstable = "precise API still under development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still under development")]
pub struct OccupiedEntry<'a, K:'a, V:'a> {
stack: stack::SearchStack<'a, K, V, node::handle::KV, node::handle::LeafOrInternal>,
}
impl<K: Ord, V> BTreeMap<K, V> {
/// Makes a new empty BTreeMap with a reasonable choice for B.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> BTreeMap<K, V> {
//FIXME(Gankro): Tune this as a function of size_of<K/V>?
BTreeMap::with_b(6)
/// a.clear();
/// assert!(a.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) {
let b = self.b;
// avoid recursive destructors by manually traversing the tree
/// assert_eq!(map.get(&1), Some(&"a"));
/// assert_eq!(map.get(&2), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V> where Q: BorrowFrom<K> + Ord {
let mut cur_node = &self.root;
loop {
/// assert_eq!(map.contains_key(&1), true);
/// assert_eq!(map.contains_key(&2), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool where Q: BorrowFrom<K> + Ord {
self.get(key).is_some()
}
/// assert_eq!(map[1], "b");
/// ```
// See `get` for implementation notes, this is basically a copy-paste with mut's added
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V> where Q: BorrowFrom<K> + Ord {
// temp_node is a Borrowck hack for having a mutable value outlive a loop iteration
let mut temp_node = &mut self.root;
/// assert_eq!(map.insert(37, "c"), Some("b"));
/// assert_eq!(map[37], "c");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, mut key: K, mut value: V) -> Option<V> {
// This is a stack of rawptrs to nodes paired with indices, respectively
// representing the nodes and edges of our search path. We have to store rawptrs
/// assert_eq!(map.remove(&1), Some("a"));
/// assert_eq!(map.remove(&1), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> where Q: BorrowFrom<K> + Ord {
// See `swap` for a more thorough description of the stuff going on in here
let mut stack = stack::PartialSearchStack::new(self);
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Ord, V> FromIterator<(K, V)> for BTreeMap<K, V> {
fn from_iter<T: Iterator<Item=(K, V)>>(iter: T) -> BTreeMap<K, V> {
let mut map = BTreeMap::new();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Ord, V> Extend<(K, V)> for BTreeMap<K, V> {
#[inline]
fn extend<T: Iterator<Item=(K, V)>>(&mut self, mut iter: T) {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<S: Hasher, K: Hash<S>, V: Hash<S>> Hash<S> for BTreeMap<K, V> {
fn hash(&self, state: &mut S) {
for elt in self.iter() {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Ord, V> Default for BTreeMap<K, V> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> BTreeMap<K, V> {
BTreeMap::new()
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: PartialEq, V: PartialEq> PartialEq for BTreeMap<K, V> {
fn eq(&self, other: &BTreeMap<K, V>) -> bool {
self.len() == other.len() &&
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Eq, V: Eq> Eq for BTreeMap<K, V> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: PartialOrd, V: PartialOrd> PartialOrd for BTreeMap<K, V> {
#[inline]
fn partial_cmp(&self, other: &BTreeMap<K, V>) -> Option<Ordering> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Ord, V: Ord> Ord for BTreeMap<K, V> {
#[inline]
fn cmp(&self, other: &BTreeMap<K, V>) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Show, V: Show> Show for BTreeMap<K, V> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "BTreeMap {{"));
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Ord, Q: ?Sized, V> Index<Q> for BTreeMap<K, V>
where Q: BorrowFrom<K> + Ord
{
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Ord, Q: ?Sized, V> IndexMut<Q> for BTreeMap<K, V>
where Q: BorrowFrom<K> + Ord
{
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for Iter<'a, K, V> {
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
fn next_back(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for IterMut<'a, K, V> {
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V> Iterator for IntoIter<K, V> {
type Item = (K, V);
fn next(&mut self) -> Option<(K, V)> { self.inner.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
fn next_back(&mut self) -> Option<(K, V)> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V> ExactSizeIterator for IntoIter<K, V> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for Keys<'a, K, V> {
type Item = &'a K;
fn next(&mut self) -> Option<(&'a K)> { self.inner.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
fn next_back(&mut self) -> Option<(&'a K)> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for Values<'a, K, V> {
type Item = &'a V;
fn next(&mut self) -> Option<(&'a V)> { self.inner.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
fn next_back(&mut self) -> Option<(&'a V)> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {}
impl<'a, K, V> Iterator for Range<'a, K, V> {
}
impl<'a, K: Ord, V> Entry<'a, K, V> {
- #[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
/// Returns a mutable reference to the entry if occupied, or the VacantEntry if vacant
pub fn get(self) -> Result<&'a mut V, VacantEntry<'a, K, V>> {
match self {
impl<'a, K: Ord, V> VacantEntry<'a, K, V> {
/// Sets the value of the entry with the VacantEntry's key,
/// and returns a mutable reference to it.
- #[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
pub fn insert(self, value: V) -> &'a mut V {
self.stack.insert(self.key, value)
}
impl<'a, K: Ord, V> OccupiedEntry<'a, K, V> {
/// Gets a reference to the value in the entry.
- #[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
pub fn get(&self) -> &V {
self.stack.peek()
}
/// Gets a mutable reference to the value in the entry.
- #[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
pub fn get_mut(&mut self) -> &mut V {
self.stack.peek_mut()
}
/// Converts the entry into a mutable reference to its value.
- #[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
pub fn into_mut(self) -> &'a mut V {
self.stack.into_top()
}
/// Sets the value of the entry with the OccupiedEntry's key,
/// and returns the entry's old value.
- #[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
pub fn insert(&mut self, mut value: V) -> V {
mem::swap(self.stack.peek_mut(), &mut value);
value
}
/// Takes the value of the entry out of the map, and returns it.
- #[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
pub fn remove(self) -> V {
self.stack.remove()
}
/// let (first_key, first_value) = map.iter().next().unwrap();
/// assert_eq!((*first_key, *first_value), (1u, "a"));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<K, V> {
let len = self.len();
// NB. The initial capacity for ringbuf is large enough to avoid reallocs in many cases.
/// }
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter_mut(&mut self) -> IterMut<K, V> {
let len = self.len();
let mut lca = RingBuf::new();
/// println!("{}: {}", key, value);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<K, V> {
let len = self.len();
let mut lca = RingBuf::new();
/// let keys: Vec<uint> = a.keys().cloned().collect();
/// assert_eq!(keys, vec![1u,2,]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn keys<'a>(&'a self) -> Keys<'a, K, V> {
fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((&'a K, &'a V)) -> &'a K = first; // coerce to fn pointer
/// let values: Vec<&str> = a.values().cloned().collect();
/// assert_eq!(values, vec!["a","b"]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn values<'a>(&'a self) -> Values<'a, K, V> {
fn second<A, B>((_, b): (A, B)) -> B { b }
let second: fn((&'a K, &'a V)) -> &'a V = second; // coerce to fn pointer
/// a.insert(1u, "a");
/// assert_eq!(a.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.length }
/// Return true if the map contains no elements.
/// a.insert(1u, "a");
/// assert!(!a.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
}
/// }
/// assert_eq!(Some((&5u, &"b")), map.range(Included(&4), Unbounded).next());
/// ```
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn range<'a>(&'a self, min: Bound<&K>, max: Bound<&K>) -> Range<'a, K, V> {
range_impl!(&self.root, min, max, as_slices_internal, iter, Range, edges, [])
}
/// println!("{} => {}", name, balance);
/// }
/// ```
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn range_mut<'a>(&'a mut self, min: Bound<&K>, max: Bound<&K>) -> RangeMut<'a, K, V> {
range_impl!(&mut self.root, min, max, as_slices_internal_mut, iter_mut, RangeMut,
edges_mut, [mut])
/// assert_eq!(count["a"], 3u);
/// ```
/// The key must have the same ordering before or after `.to_owned()` is called.
- #[unstable = "precise API still under development"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still under development")]
pub fn entry<'a>(&'a mut self, mut key: K) -> Entry<'a, K, V> {
// same basic logic of `swap` and `pop`, blended together
let mut stack = stack::PartialSearchStack::new(self);
}
// FIXME(gereeter) Write an efficient clone_from
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K: Clone, V: Clone> Clone for Node<K, V> {
fn clone(&self) -> Node<K, V> {
let mut ret = if self.is_leaf() {
/// See BTreeMap's documentation for a detailed discussion of this collection's performance
/// benefits and drawbacks.
#[derive(Clone, Hash, PartialEq, Eq, Ord, PartialOrd)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct BTreeSet<T>{
map: BTreeMap<T, ()>,
}
/// An iterator over a BTreeSet's items.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, T: 'a> {
iter: Keys<'a, T, ()>
}
/// An owning iterator over a BTreeSet's items.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<T> {
iter: Map<(T, ()), T, ::btree_map::IntoIter<T, ()>, fn((T, ())) -> T>
}
}
/// A lazy iterator producing elements in the set difference (in-order).
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Difference<'a, T:'a> {
a: Peekable<&'a T, Iter<'a, T>>,
b: Peekable<&'a T, Iter<'a, T>>,
}
/// A lazy iterator producing elements in the set symmetric difference (in-order).
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SymmetricDifference<'a, T:'a> {
a: Peekable<&'a T, Iter<'a, T>>,
b: Peekable<&'a T, Iter<'a, T>>,
}
/// A lazy iterator producing elements in the set intersection (in-order).
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Intersection<'a, T:'a> {
a: Peekable<&'a T, Iter<'a, T>>,
b: Peekable<&'a T, Iter<'a, T>>,
}
/// A lazy iterator producing elements in the set union (in-order).
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Union<'a, T:'a> {
a: Peekable<&'a T, Iter<'a, T>>,
b: Peekable<&'a T, Iter<'a, T>>,
///
/// let mut set: BTreeSet<int> = BTreeSet::new();
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> BTreeSet<T> {
BTreeSet { map: BTreeMap::new() }
}
/// Makes a new BTreeSet with the given B.
///
/// B cannot be less than 2.
- #[unstable = "probably want this to be on the type, eventually"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "probably want this to be on the type, eventually")]
pub fn with_b(b: uint) -> BTreeSet<T> {
BTreeSet { map: BTreeMap::with_b(b) }
}
/// let v: Vec<uint> = set.iter().map(|&x| x).collect();
/// assert_eq!(v, vec![1u,2,3,4]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter { iter: self.map.keys() }
}
/// let v: Vec<uint> = set.into_iter().collect();
/// assert_eq!(v, vec![1u,2,3,4]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((T, ())) -> T = first; // coerce to fn pointer
/// }
/// assert_eq!(Some(&5u), set.range(Included(&4), Unbounded).next());
/// ```
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn range<'a>(&'a self, min: Bound<&T>, max: Bound<&T>) -> Range<'a, T> {
fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((&'a T, &'a ())) -> &'a T = first; // coerce to fn pointer
/// let diff: Vec<uint> = a.difference(&b).cloned().collect();
/// assert_eq!(diff, vec![1u]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn difference<'a>(&'a self, other: &'a BTreeSet<T>) -> Difference<'a, T> {
Difference{a: self.iter().peekable(), b: other.iter().peekable()}
}
/// let sym_diff: Vec<uint> = a.symmetric_difference(&b).cloned().collect();
/// assert_eq!(sym_diff, vec![1u,3]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn symmetric_difference<'a>(&'a self, other: &'a BTreeSet<T>)
-> SymmetricDifference<'a, T> {
SymmetricDifference{a: self.iter().peekable(), b: other.iter().peekable()}
/// let intersection: Vec<uint> = a.intersection(&b).cloned().collect();
/// assert_eq!(intersection, vec![2u]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn intersection<'a>(&'a self, other: &'a BTreeSet<T>)
-> Intersection<'a, T> {
Intersection{a: self.iter().peekable(), b: other.iter().peekable()}
/// let union: Vec<uint> = a.union(&b).cloned().collect();
/// assert_eq!(union, vec![1u,2]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn union<'a>(&'a self, other: &'a BTreeSet<T>) -> Union<'a, T> {
Union{a: self.iter().peekable(), b: other.iter().peekable()}
}
/// v.insert(1i);
/// assert_eq!(v.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.map.len() }
/// Returns true if the set contains no elements
/// v.insert(1i);
/// assert!(!v.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
/// Clears the set, removing all values.
/// v.clear();
/// assert!(v.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) {
self.map.clear()
}
/// assert_eq!(set.contains(&1), true);
/// assert_eq!(set.contains(&4), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool where Q: BorrowFrom<T> + Ord {
self.map.contains_key(value)
}
/// b.insert(1);
/// assert_eq!(a.is_disjoint(&b), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_disjoint(&self, other: &BTreeSet<T>) -> bool {
self.intersection(other).next().is_none()
}
/// set.insert(4);
/// assert_eq!(set.is_subset(&sup), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_subset(&self, other: &BTreeSet<T>) -> bool {
// Stolen from TreeMap
let mut x = self.iter();
/// set.insert(2);
/// assert_eq!(set.is_superset(&sub), true);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_superset(&self, other: &BTreeSet<T>) -> bool {
other.is_subset(self)
}
/// assert_eq!(set.insert(2i), false);
/// assert_eq!(set.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, value: T) -> bool {
self.map.insert(value, ()).is_none()
}
/// assert_eq!(set.remove(&2), true);
/// assert_eq!(set.remove(&2), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool where Q: BorrowFrom<T> + Ord {
self.map.remove(value).is_some()
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> FromIterator<T> for BTreeSet<T> {
fn from_iter<Iter: Iterator<Item=T>>(iter: Iter) -> BTreeSet<T> {
let mut set = BTreeSet::new();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> Extend<T> for BTreeSet<T> {
#[inline]
fn extend<Iter: Iterator<Item=T>>(&mut self, mut iter: Iter) {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> Default for BTreeSet<T> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> BTreeSet<T> {
BTreeSet::new()
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T: Ord + Clone> Sub<&'b BTreeSet<T>> for &'a BTreeSet<T> {
type Output = BTreeSet<T>;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T: Ord + Clone> BitXor<&'b BTreeSet<T>> for &'a BTreeSet<T> {
type Output = BTreeSet<T>;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T: Ord + Clone> BitAnd<&'b BTreeSet<T>> for &'a BTreeSet<T> {
type Output = BTreeSet<T>;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T: Ord + Clone> BitOr<&'b BTreeSet<T>> for &'a BTreeSet<T> {
type Output = BTreeSet<T>;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Show> Show for BTreeSet<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "BTreeSet {{"));
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> { self.iter.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
fn next_back(&mut self) -> Option<&'a T> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<T> { self.iter.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> DoubleEndedIterator for IntoIter<T> {
fn next_back(&mut self) -> Option<T> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> ExactSizeIterator for IntoIter<T> {}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: Ord> Iterator for Difference<'a, T> {
type Item = &'a T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: Ord> Iterator for SymmetricDifference<'a, T> {
type Item = &'a T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: Ord> Iterator for Intersection<'a, T> {
type Item = &'a T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: Ord> Iterator for Union<'a, T> {
type Item = &'a T;
// Backlinks over DList::prev are raw pointers that form a full chain in
// the reverse direction.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use core::prelude::*;
use core::ptr;
/// A doubly-linked list.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct DList<T> {
length: uint,
list_head: Link<T>,
}
/// An iterator over references to the items of a `DList`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, T:'a> {
head: &'a Link<T>,
tail: Rawlink<Node<T>>,
}
// FIXME #19839: deriving is too aggressive on the bounds (T doesn't need to be Clone).
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Clone for Iter<'a, T> {
fn clone(&self) -> Iter<'a, T> {
Iter {
}
/// An iterator over mutable references to the items of a `DList`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, T:'a> {
list: &'a mut DList<T>,
head: Rawlink<Node<T>>,
/// An iterator over mutable references to the items of a `DList`.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<T> {
list: DList<T>
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Default for DList<T> {
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> DList<T> { DList::new() }
}
impl<T> DList<T> {
/// Creates an empty `DList`.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> DList<T> {
DList{list_head: None, list_tail: Rawlink::none(), length: 0}
}
/// Provides a forward iterator.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter{nelem: self.len(), head: &self.list_head, tail: self.list_tail}
}
/// Provides a forward iterator with mutable references.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter_mut(&mut self) -> IterMut<T> {
let head_raw = match self.list_head {
Some(ref mut h) => Rawlink::some(&mut **h),
/// Consumes the list into an iterator yielding elements by value.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
IntoIter{list: self}
}
/// assert!(!dl.is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool {
self.list_head.is_none()
}
///
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint {
self.length
}
///
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) {
*self = DList::new()
}
///
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn front(&self) -> Option<&T> {
self.list_head.as_ref().map(|head| &head.value)
}
///
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn front_mut(&mut self) -> Option<&mut T> {
self.list_head.as_mut().map(|head| &mut head.value)
}
///
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn back(&self) -> Option<&T> {
self.list_tail.resolve_immut().as_ref().map(|tail| &tail.value)
}
///
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn back_mut(&mut self) -> Option<&mut T> {
self.list_tail.resolve().map(|tail| &mut tail.value)
}
/// assert_eq!(dl.front().unwrap(), &1);
///
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push_front(&mut self, elt: T) {
self.push_front_node(box Node::new(elt))
}
///
/// ```
///
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop_front(&mut self) -> Option<T> {
self.pop_front_node().map(|box Node{value, ..}| value)
}
/// d.push_back(3);
/// assert_eq!(3, *d.back().unwrap());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push_back(&mut self, elt: T) {
self.push_back_node(box Node::new(elt))
}
/// d.push_back(3);
/// assert_eq!(d.pop_back(), Some(3));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop_back(&mut self) -> Option<T> {
self.pop_back_node().map(|box Node{value, ..}| value)
}
/// assert_eq!(splitted.pop_front(), Some(1));
/// assert_eq!(splitted.pop_front(), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn split_off(&mut self, at: uint) -> DList<T> {
let len = self.len();
assert!(at < len, "Cannot split off at a nonexistent index");
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Drop for DList<T> {
fn drop(&mut self) {
// Dissolve the dlist in backwards direction
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> Iterator for Iter<'a, A> {
type Item = &'a A;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> DoubleEndedIterator for Iter<'a, A> {
#[inline]
fn next_back(&mut self) -> Option<&'a A> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> ExactSizeIterator for Iter<'a, A> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> Iterator for IterMut<'a, A> {
type Item = &'a mut A;
#[inline]
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> DoubleEndedIterator for IterMut<'a, A> {
#[inline]
fn next_back(&mut self) -> Option<&'a mut A> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> ExactSizeIterator for IterMut<'a, A> {}
// private methods for IterMut
/// }
/// ```
#[inline]
- #[unstable = "this is probably better handled by a cursor type -- we'll see"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this is probably better handled by a cursor type -- we'll see")]
pub fn insert_next(&mut self, elt: A) {
self.insert_next_node(box Node::new(elt))
}
/// assert_eq!(it.next().unwrap(), &2);
/// ```
#[inline]
- #[unstable = "this is probably better handled by a cursor type -- we'll see"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this is probably better handled by a cursor type -- we'll see")]
pub fn peek_next(&mut self) -> Option<&mut A> {
if self.nelem == 0 {
return None
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> Iterator for IntoIter<A> {
type Item = A;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> DoubleEndedIterator for IntoIter<A> {
#[inline]
fn next_back(&mut self) -> Option<A> { self.list.pop_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> FromIterator<A> for DList<A> {
fn from_iter<T: Iterator<Item=A>>(iterator: T) -> DList<A> {
let mut ret = DList::new();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> Extend<A> for DList<A> {
fn extend<T: Iterator<Item=A>>(&mut self, mut iterator: T) {
for elt in iterator { self.push_back(elt); }
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: PartialEq> PartialEq for DList<A> {
fn eq(&self, other: &DList<A>) -> bool {
self.len() == other.len() &&
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Eq> Eq for DList<A> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: PartialOrd> PartialOrd for DList<A> {
fn partial_cmp(&self, other: &DList<A>) -> Option<Ordering> {
iter::order::partial_cmp(self.iter(), other.iter())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Ord> Ord for DList<A> {
#[inline]
fn cmp(&self, other: &DList<A>) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Clone> Clone for DList<A> {
fn clone(&self) -> DList<A> {
self.iter().map(|x| x.clone()).collect()
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: fmt::Show> fmt::Show for DList<A> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "DList ["));
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<S: Writer + Hasher, A: Hash<S>> Hash<S> for DList<A> {
fn hash(&self, state: &mut S) {
self.len().hash(state);
impl<E:CLike> EnumSet<E> {
/// Returns an empty `EnumSet`.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn new() -> EnumSet<E> {
EnumSet {bits: 0}
}
/// Returns the number of elements in the given `EnumSet`.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn len(&self) -> uint {
self.bits.count_ones()
}
/// Returns true if the `EnumSet` is empty.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn is_empty(&self) -> bool {
self.bits == 0
}
}
/// Returns `false` if the `EnumSet` contains any enum of the given `EnumSet`.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn is_disjoint(&self, other: &EnumSet<E>) -> bool {
(self.bits & other.bits) == 0
}
/// Returns `true` if a given `EnumSet` is included in this `EnumSet`.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn is_superset(&self, other: &EnumSet<E>) -> bool {
(self.bits & other.bits) == other.bits
}
/// Returns `true` if this `EnumSet` is included in the given `EnumSet`.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn is_subset(&self, other: &EnumSet<E>) -> bool {
other.is_superset(self)
}
}
/// Adds an enum to the `EnumSet`, and returns `true` if it wasn't there before
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn insert(&mut self, e: E) -> bool {
let result = !self.contains(&e);
self.bits |= bit(&e);
}
/// Removes an enum from the EnumSet
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn remove(&mut self, e: &E) -> bool {
let result = self.contains(e);
self.bits &= !bit(e);
}
/// Returns `true` if an `EnumSet` contains a given enum.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn contains(&self, e: &E) -> bool {
(self.bits & bit(e)) != 0
}
/// Returns an iterator over an `EnumSet`.
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn iter(&self) -> Iter<E> {
Iter::new(self.bits)
}
#![crate_name = "collections"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
pub mod vec;
pub mod vec_map;
-#[unstable = "RFC 509"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "RFC 509")]
pub mod bitv {
pub use bit::{Bitv, Iter};
}
-#[unstable = "RFC 509"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "RFC 509")]
pub mod bitv_set {
pub use bit::{BitvSet, Union, Intersection, Difference, SymmetricDifference};
pub use bit::SetIter as Iter;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub mod btree_map {
pub use btree::map::*;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub mod btree_set {
pub use btree::set::*;
}
/// Creates a `Vec` containing the arguments.
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! vec {
($x:expr; $y:expr) => ({
let xs: $crate::boxed::Box<[_]> = $crate::boxed::Box::new([$x; $y]);
//! ends of the container. It also has `O(1)` indexing like a vector. The contained elements are
//! not required to be copyable, and the queue will be sendable if the contained type is sendable.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use core::prelude::*;
static MINIMUM_CAPACITY: uint = 1u; // 2 - 1
/// `RingBuf` is a circular buffer, which can be used as a double-ended queue efficiently.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RingBuf<T> {
// tail and head are pointers into the buffer. Tail always points
// to the first element that could be read, Head always points
ptr: *mut T
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe impl<T: Send> Send for RingBuf<T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe impl<T: Sync> Sync for RingBuf<T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Clone> Clone for RingBuf<T> {
fn clone(&self) -> RingBuf<T> {
self.iter().map(|t| t.clone()).collect()
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Drop for RingBuf<T> {
fn drop(&mut self) {
self.clear();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Default for RingBuf<T> {
#[inline]
fn default() -> RingBuf<T> { RingBuf::new() }
impl<T> RingBuf<T> {
/// Creates an empty `RingBuf`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> RingBuf<T> {
RingBuf::with_capacity(INITIAL_CAPACITY)
}
/// Creates an empty `RingBuf` with space for at least `n` elements.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(n: uint) -> RingBuf<T> {
// +1 since the ringbuffer always leaves one space empty
let cap = cmp::max(n + 1, MINIMUM_CAPACITY + 1).next_power_of_two();
/// buf.push_back(5);
/// assert_eq!(buf.get(1).unwrap(), &4);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get(&self, i: uint) -> Option<&T> {
if i < self.len() {
let idx = self.wrap_index(self.tail + i);
///
/// assert_eq!(buf[1], 7);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get_mut(&mut self, i: uint) -> Option<&mut T> {
if i < self.len() {
let idx = self.wrap_index(self.tail + i);
/// assert_eq!(buf[0], 5);
/// assert_eq!(buf[2], 3);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn swap(&mut self, i: uint, j: uint) {
assert!(i < self.len());
assert!(j < self.len());
/// assert!(buf.capacity() >= 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint { self.cap - 1 }
/// Reserves the minimum capacity for exactly `additional` more elements to be inserted in the
/// buf.reserve_exact(10);
/// assert!(buf.capacity() >= 11);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_exact(&mut self, additional: uint) {
self.reserve(additional);
}
/// buf.reserve(10);
/// assert!(buf.capacity() >= 11);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve(&mut self, additional: uint) {
let new_len = self.len() + additional;
assert!(new_len + 1 > self.len(), "capacity overflow");
/// assert_eq!(buf.len(), 1);
/// assert_eq!(Some(&5), buf.get(0));
/// ```
- #[unstable = "matches collection reform specification; waiting on panic semantics"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification; waiting on panic semantics")]
pub fn truncate(&mut self, len: uint) {
for _ in range(len, self.len()) {
self.pop_back();
/// let b: &[_] = &[&5, &3, &4];
/// assert_eq!(buf.iter().collect::<Vec<&int>>().as_slice(), b);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter {
tail: self.tail,
/// let b: &[_] = &[&mut 3, &mut 1, &mut 2];
/// assert_eq!(&buf.iter_mut().collect::<Vec<&mut int>>()[], b);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter_mut<'a>(&'a mut self) -> IterMut<'a, T> {
IterMut {
tail: self.tail,
}
/// Consumes the list into an iterator yielding elements by value.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
IntoIter {
inner: self,
/// Returns a pair of slices which contain, in order, the contents of the
/// `RingBuf`.
#[inline]
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn as_slices<'a>(&'a self) -> (&'a [T], &'a [T]) {
unsafe {
let contiguous = self.is_contiguous();
/// Returns a pair of slices which contain, in order, the contents of the
/// `RingBuf`.
#[inline]
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn as_mut_slices<'a>(&'a mut self) -> (&'a mut [T], &'a mut [T]) {
unsafe {
let contiguous = self.is_contiguous();
/// v.push_back(1i);
/// assert_eq!(v.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { count(self.tail, self.head, self.cap) }
/// Returns true if the buffer contains no elements
/// v.push_front(1i);
/// assert!(!v.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
/// Creates a draining iterator that clears the `RingBuf` and iterates over
/// assert!(v.is_empty());
/// ```
#[inline]
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn drain(&mut self) -> Drain<T> {
Drain {
inner: self,
/// v.clear();
/// assert!(v.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
pub fn clear(&mut self) {
self.drain();
/// d.push_back(2i);
/// assert_eq!(d.front(), Some(&1i));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn front(&self) -> Option<&T> {
if !self.is_empty() { Some(&self[0]) } else { None }
}
/// }
/// assert_eq!(d.front(), Some(&9i));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn front_mut(&mut self) -> Option<&mut T> {
if !self.is_empty() { Some(&mut self[0]) } else { None }
}
/// d.push_back(2i);
/// assert_eq!(d.back(), Some(&2i));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn back(&self) -> Option<&T> {
if !self.is_empty() { Some(&self[self.len() - 1]) } else { None }
}
/// }
/// assert_eq!(d.back(), Some(&9i));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn back_mut(&mut self) -> Option<&mut T> {
let len = self.len();
if !self.is_empty() { Some(&mut self[len - 1]) } else { None }
/// assert_eq!(d.pop_front(), Some(2i));
/// assert_eq!(d.pop_front(), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop_front(&mut self) -> Option<T> {
if self.is_empty() {
None
/// d.push_front(2i);
/// assert_eq!(d.front(), Some(&2i));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push_front(&mut self, t: T) {
if self.is_full() {
self.reserve(1);
/// buf.push_back(3);
/// assert_eq!(3, *buf.back().unwrap());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push_back(&mut self, t: T) {
if self.is_full() {
self.reserve(1);
/// buf.push_back(3);
/// assert_eq!(buf.pop_back(), Some(3));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop_back(&mut self) -> Option<T> {
if self.is_empty() {
None
/// buf.push_back(10);
/// assert_eq!(buf.swap_back_remove(1), Some(99));
/// ```
- #[unstable = "the naming of this function may be altered"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the naming of this function may be altered")]
pub fn swap_back_remove(&mut self, index: uint) -> Option<T> {
let length = self.len();
if length > 0 && index < length - 1 {
/// buf.push_back(20i);
/// assert_eq!(buf.swap_front_remove(3), Some(99));
/// ```
- #[unstable = "the naming of this function may be altered"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the naming of this function may be altered")]
pub fn swap_front_remove(&mut self, index: uint) -> Option<T> {
let length = self.len();
if length > 0 && index < length && index != 0 {
/// buf.remove(2);
/// assert_eq!(Some(&15), buf.get(2));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove(&mut self, i: uint) -> Option<T> {
if self.is_empty() || self.len() <= i {
return None;
/// assert_eq!(a, b);
/// }
/// ```
- #[unstable = "matches collection reform specification; waiting on panic semantics"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification; waiting on panic semantics")]
pub fn resize(&mut self, new_len: uint, value: T) {
let len = self.len();
}
/// `RingBuf` iterator.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, T:'a> {
ring: &'a [T],
tail: uint,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<&'a T> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> RandomAccessIterator for Iter<'a, T> {
#[inline]
fn indexable(&self) -> uint {
// with returning the mutable reference. I couldn't find a way to
// make the lifetime checker happy so, but there should be a way.
/// `RingBuf` mutable iterator.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, T:'a> {
ptr: *mut T,
tail: uint,
marker: marker::ContravariantLifetime<'a>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<&'a mut T> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
/// A by-value RingBuf iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<T> {
inner: RingBuf<T>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Iterator for IntoIter<T> {
type Item = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> DoubleEndedIterator for IntoIter<T> {
#[inline]
fn next_back(&mut self) -> Option<T> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> ExactSizeIterator for IntoIter<T> {}
/// A draining RingBuf iterator
-#[unstable = "matches collection reform specification, waiting for dust to settle"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub struct Drain<'a, T: 'a> {
inner: &'a mut RingBuf<T>,
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: 'a> Drop for Drain<'a, T> {
fn drop(&mut self) {
for _ in *self {}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: 'a> Iterator for Drain<'a, T> {
type Item = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: 'a> DoubleEndedIterator for Drain<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<T> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: 'a> ExactSizeIterator for Drain<'a, T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: PartialEq> PartialEq for RingBuf<A> {
fn eq(&self, other: &RingBuf<A>) -> bool {
self.len() == other.len() &&
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Eq> Eq for RingBuf<A> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: PartialOrd> PartialOrd for RingBuf<A> {
fn partial_cmp(&self, other: &RingBuf<A>) -> Option<Ordering> {
iter::order::partial_cmp(self.iter(), other.iter())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Ord> Ord for RingBuf<A> {
#[inline]
fn cmp(&self, other: &RingBuf<A>) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<S: Writer + Hasher, A: Hash<S>> Hash<S> for RingBuf<A> {
fn hash(&self, state: &mut S) {
self.len().hash(state);
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> Index<uint> for RingBuf<A> {
type Output = A;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> IndexMut<uint> for RingBuf<A> {
type Output = A;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> FromIterator<A> for RingBuf<A> {
fn from_iter<T: Iterator<Item=A>>(iterator: T) -> RingBuf<A> {
let (lower, _) = iterator.size_hint();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> Extend<A> for RingBuf<A> {
fn extend<T: Iterator<Item=A>>(&mut self, mut iterator: T) {
for elt in iterator {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: fmt::Show> fmt::Show for RingBuf<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "RingBuf ["));
//! * Further iterators exist that split, chunk or permute the slice.
#![doc(primitive = "slice")]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use alloc::boxed::Box;
use core::borrow::{BorrowFrom, BorrowFromMut, ToOwned};
////////////////////////////////////////////////////////////////////////////////
/// Allocating extension methods for slices.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait SliceExt {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Item;
/// Sorts the slice, in place, using `compare` to compare
/// v.sort_by(|a, b| b.cmp(a));
/// assert!(v == [5, 4, 3, 2, 1]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn sort_by<F>(&mut self, compare: F) where F: FnMut(&Self::Item, &Self::Item) -> Ordering;
/// Consumes `src` and moves as many elements as it can into `self`
/// assert_eq!(num_moved, 3);
/// assert!(a == [6i, 7, 8, 4, 5]);
/// ```
- #[unstable = "uncertain about this API approach"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain about this API approach")]
fn move_from(&mut self, src: Vec<Self::Item>, start: uint, end: uint) -> uint;
/// Returns a subslice spanning the interval [`start`, `end`).
/// original slice (i.e. when `end > self.len()`) or when `start > end`.
///
/// Slicing with `start` equal to `end` yields an empty slice.
- #[unstable = "will be replaced by slice syntax"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by slice syntax")]
fn slice(&self, start: uint, end: uint) -> &[Self::Item];
/// Returns a subslice from `start` to the end of the slice.
/// Panics when `start` is strictly greater than the length of the original slice.
///
/// Slicing from `self.len()` yields an empty slice.
- #[unstable = "will be replaced by slice syntax"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by slice syntax")]
fn slice_from(&self, start: uint) -> &[Self::Item];
/// Returns a subslice from the start of the slice to `end`.
/// Panics when `end` is strictly greater than the length of the original slice.
///
/// Slicing to `0` yields an empty slice.
- #[unstable = "will be replaced by slice syntax"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by slice syntax")]
fn slice_to(&self, end: uint) -> &[Self::Item];
/// Divides one slice into two at an index.
/// indices from `[mid, len)` (excluding the index `len` itself).
///
/// Panics if `mid > len`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn split_at(&self, mid: uint) -> (&[Self::Item], &[Self::Item]);
/// Returns an iterator over the slice
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn iter(&self) -> Iter<Self::Item>;
/// Returns an iterator over subslices separated by elements that match
/// `pred`. The matched element is not contained in the subslices.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn split<F>(&self, pred: F) -> Split<Self::Item, F>
where F: FnMut(&Self::Item) -> bool;
/// Returns an iterator over subslices separated by elements that match
/// `pred`, limited to splitting at most `n` times. The matched element is
/// not contained in the subslices.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn splitn<F>(&self, n: uint, pred: F) -> SplitN<Self::Item, F>
where F: FnMut(&Self::Item) -> bool;
/// `pred` limited to splitting at most `n` times. This starts at the end of
/// the slice and works backwards. The matched element is not contained in
/// the subslices.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn rsplitn<F>(&self, n: uint, pred: F) -> RSplitN<Self::Item, F>
where F: FnMut(&Self::Item) -> bool;
/// println!("{:?}", win);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn windows(&self, size: uint) -> Windows<Self::Item>;
/// Returns an iterator over `size` elements of the slice at a
/// println!("{:?}", win);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn chunks(&self, size: uint) -> Chunks<Self::Item>;
/// Returns the element of a slice at the given index, or `None` if the
/// index is out of bounds.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn get(&self, index: uint) -> Option<&Self::Item>;
/// Returns the first element of a slice, or `None` if it is empty.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn first(&self) -> Option<&Self::Item>;
/// Returns all but the first element of a slice.
- #[unstable = "likely to be renamed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be renamed")]
fn tail(&self) -> &[Self::Item];
/// Returns all but the last element of a slice.
- #[unstable = "likely to be renamed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be renamed")]
fn init(&self) -> &[Self::Item];
/// Returns the last element of a slice, or `None` if it is empty.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn last(&self) -> Option<&Self::Item>;
/// Returns a pointer to the element at the given index, without doing
/// bounds checking.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn get_unchecked(&self, index: uint) -> &Self::Item;
/// Returns an unsafe pointer to the slice's buffer
///
/// Modifying the slice may cause its buffer to be reallocated, which
/// would also make any pointers to it invalid.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn as_ptr(&self) -> *const Self::Item;
/// Binary search a sorted slice with a comparator function.
/// let r = s.binary_search_by(|probe| probe.cmp(&seek));
/// assert!(match r { Ok(1...4) => true, _ => false, });
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn binary_search_by<F>(&self, f: F) -> Result<uint, uint> where
F: FnMut(&Self::Item) -> Ordering;
/// let a = [1i, 2, 3];
/// assert_eq!(a.len(), 3);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len(&self) -> uint;
/// Returns true if the slice has a length of 0
/// assert!(!a.is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_empty(&self) -> bool { self.len() == 0 }
/// Returns a mutable reference to the element at the given index,
/// or `None` if the index is out of bounds
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn get_mut(&mut self, index: uint) -> Option<&mut Self::Item>;
/// Work with `self` as a mut slice.
/// Primarily intended for getting a &mut [T] from a [T; N].
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn as_mut_slice(&mut self) -> &mut [Self::Item];
/// Returns a mutable subslice spanning the interval [`start`, `end`).
/// original slice (i.e. when `end > self.len()`) or when `start > end`.
///
/// Slicing with `start` equal to `end` yields an empty slice.
- #[unstable = "will be replaced by slice syntax"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by slice syntax")]
fn slice_mut(&mut self, start: uint, end: uint) -> &mut [Self::Item];
/// Returns a mutable subslice from `start` to the end of the slice.
/// Panics when `start` is strictly greater than the length of the original slice.
///
/// Slicing from `self.len()` yields an empty slice.
- #[unstable = "will be replaced by slice syntax"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by slice syntax")]
fn slice_from_mut(&mut self, start: uint) -> &mut [Self::Item];
/// Returns a mutable subslice from the start of the slice to `end`.
/// Panics when `end` is strictly greater than the length of the original slice.
///
/// Slicing to `0` yields an empty slice.
- #[unstable = "will be replaced by slice syntax"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by slice syntax")]
fn slice_to_mut(&mut self, end: uint) -> &mut [Self::Item];
/// Returns an iterator that allows modifying each value
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn iter_mut(&mut self) -> IterMut<Self::Item>;
/// Returns a mutable pointer to the first element of a slice, or `None` if it is empty
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn first_mut(&mut self) -> Option<&mut Self::Item>;
/// Returns all but the first element of a mutable slice
- #[unstable = "likely to be renamed or removed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be renamed or removed")]
fn tail_mut(&mut self) -> &mut [Self::Item];
/// Returns all but the last element of a mutable slice
- #[unstable = "likely to be renamed or removed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be renamed or removed")]
fn init_mut(&mut self) -> &mut [Self::Item];
/// Returns a mutable pointer to the last item in the slice.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn last_mut(&mut self) -> Option<&mut Self::Item>;
/// Returns an iterator over mutable subslices separated by elements that
/// match `pred`. The matched element is not contained in the subslices.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn split_mut<F>(&mut self, pred: F) -> SplitMut<Self::Item, F>
where F: FnMut(&Self::Item) -> bool;
/// Returns an iterator over subslices separated by elements that match
/// `pred`, limited to splitting at most `n` times. The matched element is
/// not contained in the subslices.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn splitn_mut<F>(&mut self, n: uint, pred: F) -> SplitNMut<Self::Item, F>
where F: FnMut(&Self::Item) -> bool;
/// `pred` limited to splitting at most `n` times. This starts at the end of
/// the slice and works backwards. The matched element is not contained in
/// the subslices.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn rsplitn_mut<F>(&mut self, n: uint, pred: F) -> RSplitNMut<Self::Item, F>
where F: FnMut(&Self::Item) -> bool;
/// # Panics
///
/// Panics if `chunk_size` is 0.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn chunks_mut(&mut self, chunk_size: uint) -> ChunksMut<Self::Item>;
/// Swaps two elements in a slice.
/// v.swap(1, 3);
/// assert!(v == ["a", "d", "c", "b"]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn swap(&mut self, a: uint, b: uint);
/// Divides one `&mut` into two at an index.
/// assert!(right == []);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn split_at_mut(&mut self, mid: uint) -> (&mut [Self::Item], &mut [Self::Item]);
/// Reverse the order of elements in a slice, in place.
/// v.reverse();
/// assert!(v == [3i, 2, 1]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn reverse(&mut self);
/// Returns an unsafe mutable pointer to the element in index
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn get_unchecked_mut(&mut self, index: uint) -> &mut Self::Item;
/// Return an unsafe mutable pointer to the slice's buffer.
/// Modifying the slice may cause its buffer to be reallocated, which
/// would also make any pointers to it invalid.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn as_mut_ptr(&mut self) -> *mut Self::Item;
/// Copies `self` into a new `Vec`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn to_vec(&self) -> Vec<Self::Item> where Self::Item: Clone;
/// Creates an iterator that yields every possible permutation of the
/// assert_eq!(Some(vec![1i, 3, 2]), perms.next());
/// assert_eq!(Some(vec![3i, 1, 2]), perms.next());
/// ```
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn permutations(&self) -> Permutations<Self::Item> where Self::Item: Clone;
/// Copies as many elements from `src` as it can into `self` (the
/// assert!(dst.clone_from_slice(&src2) == 3);
/// assert!(dst == [3i, 4, 5]);
/// ```
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn clone_from_slice(&mut self, &[Self::Item]) -> uint where Self::Item: Clone;
/// Sorts the slice, in place.
/// v.sort();
/// assert!(v == [-5i, -3, 1, 2, 4]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn sort(&mut self) where Self::Item: Ord;
/// Binary search a sorted slice for a given element.
/// let r = s.binary_search(&1);
/// assert!(match r { Ok(1...4) => true, _ => false, });
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn binary_search(&self, x: &Self::Item) -> Result<uint, uint> where Self::Item: Ord;
/// Deprecated: use `binary_search` instead.
- #[deprecated = "use binary_search instead"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "use binary_search instead")]
fn binary_search_elem(&self, x: &Self::Item) -> Result<uint, uint> where Self::Item: Ord {
self.binary_search(x)
}
/// let b: &mut [_] = &mut [1i, 0, 2];
/// assert!(v == b);
/// ```
- #[unstable = "uncertain if this merits inclusion in std"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain if this merits inclusion in std")]
fn next_permutation(&mut self) -> bool where Self::Item: Ord;
/// Mutates the slice to the previous lexicographic permutation.
/// let b: &mut [_] = &mut [0i, 1, 2];
/// assert!(v == b);
/// ```
- #[unstable = "uncertain if this merits inclusion in std"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain if this merits inclusion in std")]
fn prev_permutation(&mut self) -> bool where Self::Item: Ord;
/// Find the first index containing a matching value.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn position_elem(&self, t: &Self::Item) -> Option<uint> where Self::Item: PartialEq;
/// Find the last index containing a matching value.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn rposition_elem(&self, t: &Self::Item) -> Option<uint> where Self::Item: PartialEq;
/// Return true if the slice contains an element with the given value.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn contains(&self, x: &Self::Item) -> bool where Self::Item: PartialEq;
/// Returns true if `needle` is a prefix of the slice.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn starts_with(&self, needle: &[Self::Item]) -> bool where Self::Item: PartialEq;
/// Returns true if `needle` is a suffix of the slice.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn ends_with(&self, needle: &[Self::Item]) -> bool where Self::Item: PartialEq;
/// Convert `self` into a vector without clones or allocation.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn into_vec(self: Box<Self>) -> Vec<Self::Item>;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> SliceExt for [T] {
type Item = T;
////////////////////////////////////////////////////////////////////////////////
// Extension traits for slices over specific kinds of data
////////////////////////////////////////////////////////////////////////////////
-#[unstable = "U should be an associated type"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "U should be an associated type")]
/// An extension trait for concatenating slices
pub trait SliceConcatExt<T: ?Sized, U> {
/// Flattens a slice of `T` into a single value `U`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn concat(&self) -> U;
/// Flattens a slice of `T` into a single value `U`, placing a
/// given separator between each.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn connect(&self, sep: &T) -> U;
}
///
/// The last generated swap is always (0, 1), and it returns the
/// sequence to its initial order.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[derive(Clone)]
pub struct ElementSwaps {
sdir: Vec<SizeDirection>,
impl ElementSwaps {
/// Creates an `ElementSwaps` iterator for a sequence of `length` elements.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn new(length: uint) -> ElementSwaps {
// Initialize `sdir` with a direction that position should move in
// (all negative at the beginning) and the `size` of the
// Standard trait implementations for slices
////////////////////////////////////////////////////////////////////////////////
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl<T> BorrowFrom<Vec<T>> for [T] {
fn borrow_from(owned: &Vec<T>) -> &[T] { &owned[] }
}
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl<T> BorrowFromMut<Vec<T>> for [T] {
fn borrow_from_mut(owned: &mut Vec<T>) -> &mut [T] { &mut owned[] }
}
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl<T: Clone> ToOwned<Vec<T>> for [T] {
fn to_owned(&self) -> Vec<T> { self.to_vec() }
}
dir: Direction,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Iterator for ElementSwaps {
type Item = (uint, uint);
/// swap applied.
///
/// Generates even and odd permutations alternately.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct Permutations<T> {
swaps: ElementSwaps,
v: Vec<T>,
}
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl<T: Clone> Iterator for Permutations<T> {
type Item = Vec<T>;
//! is the same as `&[u8]`.
#![doc(primitive = "str")]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use self::RecompositionState::*;
use self::DecompositionType::*;
/// External iterator for a string's decomposition's characters.
/// Use with the `std::iter` module.
#[derive(Clone)]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct Decompositions<'a> {
kind: DecompositionType,
iter: Chars<'a>,
sorted: bool
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Decompositions<'a> {
type Item = char;
/// External iterator for a string's recomposition's characters.
/// Use with the `std::iter` module.
#[derive(Clone)]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct Recompositions<'a> {
iter: Decompositions<'a>,
state: RecompositionState,
last_ccc: Option<u8>
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Recompositions<'a> {
type Item = char;
/// External iterator for a string's UTF16 codeunits.
/// Use with the `std::iter` module.
#[derive(Clone)]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct Utf16Units<'a> {
encoder: Utf16Encoder<Chars<'a>>
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Utf16Units<'a> {
type Item = u16;
($ch:expr, $byte:expr) => (($ch << 6) | ($byte & 63u8) as u32)
}
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl BorrowFrom<String> for str {
fn borrow_from(owned: &String) -> &str { &owned[] }
}
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl ToOwned<String> for str {
fn to_owned(&self) -> String {
unsafe {
*/
/// Any string that can be represented as a slice.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait StrExt: Index<FullRange, Output = str> {
/// Escapes each char in `s` with `char::escape_default`.
- #[unstable = "return type may change to be an iterator"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "return type may change to be an iterator")]
fn escape_default(&self) -> String {
self.chars().flat_map(|c| c.escape_default()).collect()
}
/// Escapes each char in `s` with `char::escape_unicode`.
- #[unstable = "return type may change to be an iterator"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "return type may change to be an iterator")]
fn escape_unicode(&self) -> String {
self.chars().flat_map(|c| c.escape_unicode()).collect()
}
/// // not found, so no change.
/// assert_eq!(s.replace("cookie monster", "little lamb"), s);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn replace(&self, from: &str, to: &str) -> String {
let mut result = String::new();
let mut last_end = 0;
/// Returns an iterator over the string in Unicode Normalization Form D
/// (canonical decomposition).
#[inline]
- #[unstable = "this functionality may be moved to libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may be moved to libunicode")]
fn nfd_chars<'a>(&'a self) -> Decompositions<'a> {
Decompositions {
iter: self[].chars(),
/// Returns an iterator over the string in Unicode Normalization Form KD
/// (compatibility decomposition).
#[inline]
- #[unstable = "this functionality may be moved to libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may be moved to libunicode")]
fn nfkd_chars<'a>(&'a self) -> Decompositions<'a> {
Decompositions {
iter: self[].chars(),
/// An Iterator over the string in Unicode Normalization Form C
/// (canonical decomposition followed by canonical composition).
#[inline]
- #[unstable = "this functionality may be moved to libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may be moved to libunicode")]
fn nfc_chars<'a>(&'a self) -> Recompositions<'a> {
Recompositions {
iter: self.nfd_chars(),
/// An Iterator over the string in Unicode Normalization Form KC
/// (compatibility decomposition followed by canonical composition).
#[inline]
- #[unstable = "this functionality may be moved to libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may be moved to libunicode")]
fn nfkc_chars<'a>(&'a self) -> Recompositions<'a> {
Recompositions {
iter: self.nfkd_chars(),
/// ```rust
/// assert!("bananas".contains("nana"));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn contains(&self, pat: &str) -> bool {
core_str::StrExt::contains(&self[], pat)
}
/// ```rust
/// assert!("hello".contains_char('e'));
/// ```
- #[unstable = "might get removed in favour of a more generic contains()"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might get removed in favour of a more generic contains()")]
fn contains_char<P: CharEq>(&self, pat: P) -> bool {
core_str::StrExt::contains_char(&self[], pat)
}
/// let v: Vec<char> = "abc åäö".chars().collect();
/// assert_eq!(v, vec!['a', 'b', 'c', ' ', 'å', 'ä', 'ö']);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn chars(&self) -> Chars {
core_str::StrExt::chars(&self[])
}
/// let v: Vec<u8> = "bors".bytes().collect();
/// assert_eq!(v, b"bors".to_vec());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn bytes(&self) -> Bytes {
core_str::StrExt::bytes(&self[])
}
/// An iterator over the characters of `self` and their byte offsets.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn char_indices(&self) -> CharIndices {
core_str::StrExt::char_indices(&self[])
}
/// let v: Vec<&str> = "".split('X').collect();
/// assert_eq!(v, vec![""]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn split<P: CharEq>(&self, pat: P) -> Split<P> {
core_str::StrExt::split(&self[], pat)
}
/// let v: Vec<&str> = "".splitn(1, 'X').collect();
/// assert_eq!(v, vec![""]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn splitn<P: CharEq>(&self, count: uint, pat: P) -> SplitN<P> {
core_str::StrExt::splitn(&self[], count, pat)
}
/// let v: Vec<&str> = "lionXXtigerXleopard".split('X').rev().collect();
/// assert_eq!(v, vec!["leopard", "tiger", "", "lion"]);
/// ```
- #[unstable = "might get removed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "might get removed")]
fn split_terminator<P: CharEq>(&self, pat: P) -> SplitTerminator<P> {
core_str::StrExt::split_terminator(&self[], pat)
}
/// let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(2, 'X').collect();
/// assert_eq!(v, vec!["leopard", "tiger", "lionX"]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn rsplitn<P: CharEq>(&self, count: uint, pat: P) -> RSplitN<P> {
core_str::StrExt::rsplitn(&self[], count, pat)
}
/// let v: Vec<(uint, uint)> = "ababa".match_indices("aba").collect();
/// assert_eq!(v, vec![(0, 3)]); // only the first `aba`
/// ```
- #[unstable = "might have its iterator type changed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might have its iterator type changed")]
fn match_indices<'a>(&'a self, pat: &'a str) -> MatchIndices<'a> {
core_str::StrExt::match_indices(&self[], pat)
}
/// let v: Vec<&str> = "1abcabc2".split_str("abc").collect();
/// assert_eq!(v, vec!["1", "", "2"]);
/// ```
- #[unstable = "might get removed in the future in favor of a more generic split()"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might get removed in the future in favor of a more generic split()")]
fn split_str<'a>(&'a self, pat: &'a str) -> SplitStr<'a> {
core_str::StrExt::split_str(&self[], pat)
}
/// let v: Vec<&str> = four_lines.lines().collect();
/// assert_eq!(v, vec!["foo", "bar", "", "baz"]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn lines(&self) -> Lines {
core_str::StrExt::lines(&self[])
}
/// let v: Vec<&str> = four_lines.lines_any().collect();
/// assert_eq!(v, vec!["foo", "bar", "", "baz"]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn lines_any(&self) -> LinesAny {
core_str::StrExt::lines_any(&self[])
}
/// // byte 100 is outside the string
/// // s.slice(3, 100);
/// ```
- #[unstable = "use slice notation [a..b] instead"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use slice notation [a..b] instead")]
fn slice(&self, begin: uint, end: uint) -> &str {
core_str::StrExt::slice(&self[], begin, end)
}
/// out of bounds.
///
/// See also `slice`, `slice_to` and `slice_chars`.
- #[unstable = "use slice notation [a..] instead"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use slice notation [a..] instead")]
fn slice_from(&self, begin: uint) -> &str {
core_str::StrExt::slice_from(&self[], begin)
}
/// out of bounds.
///
/// See also `slice`, `slice_from` and `slice_chars`.
- #[unstable = "use slice notation [..a] instead"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use slice notation [..a] instead")]
fn slice_to(&self, end: uint) -> &str {
core_str::StrExt::slice_to(&self[], end)
}
/// assert_eq!(s.slice_chars(0, 4), "Löwe");
/// assert_eq!(s.slice_chars(5, 7), "老虎");
/// ```
- #[unstable = "may have yet to prove its worth"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may have yet to prove its worth")]
fn slice_chars(&self, begin: uint, end: uint) -> &str {
core_str::StrExt::slice_chars(&self[], begin, end)
}
///
/// Caller must check both UTF-8 character boundaries and the boundaries of
/// the entire slice as well.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn slice_unchecked(&self, begin: uint, end: uint) -> &str {
core_str::StrExt::slice_unchecked(&self[], begin, end)
}
/// ```rust
/// assert!("banana".starts_with("ba"));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn starts_with(&self, pat: &str) -> bool {
core_str::StrExt::starts_with(&self[], pat)
}
/// ```rust
/// assert!("banana".ends_with("nana"));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn ends_with(&self, pat: &str) -> bool {
core_str::StrExt::ends_with(&self[], pat)
}
/// assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
/// assert_eq!("123foo1bar123".trim_matches(|&: c: char| c.is_numeric()), "foo1bar");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trim_matches<P: CharEq>(&self, pat: P) -> &str {
core_str::StrExt::trim_matches(&self[], pat)
}
/// assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
/// assert_eq!("123foo1bar123".trim_left_matches(|&: c: char| c.is_numeric()), "foo1bar123");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trim_left_matches<P: CharEq>(&self, pat: P) -> &str {
core_str::StrExt::trim_left_matches(&self[], pat)
}
/// assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
/// assert_eq!("123foo1bar123".trim_right_matches(|&: c: char| c.is_numeric()), "123foo1bar");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trim_right_matches<P: CharEq>(&self, pat: P) -> &str {
core_str::StrExt::trim_right_matches(&self[], pat)
}
/// // third byte of `老`
/// assert!(!s.is_char_boundary(8));
/// ```
- #[unstable = "naming is uncertain with container conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming is uncertain with container conventions")]
fn is_char_boundary(&self, index: uint) -> bool {
core_str::StrExt::is_char_boundary(&self[], index)
}
///
/// If `i` is greater than or equal to the length of the string.
/// If `i` is not the index of the beginning of a valid UTF-8 character.
- #[unstable = "naming is uncertain with container conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming is uncertain with container conventions")]
fn char_range_at(&self, start: uint) -> CharRange {
core_str::StrExt::char_range_at(&self[], start)
}
///
/// If `i` is greater than the length of the string.
/// If `i` is not an index following a valid UTF-8 character.
- #[unstable = "naming is uncertain with container conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming is uncertain with container conventions")]
fn char_range_at_reverse(&self, start: uint) -> CharRange {
core_str::StrExt::char_range_at_reverse(&self[], start)
}
///
/// If `i` is greater than or equal to the length of the string.
/// If `i` is not the index of the beginning of a valid UTF-8 character.
- #[unstable = "naming is uncertain with container conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming is uncertain with container conventions")]
fn char_at(&self, i: uint) -> char {
core_str::StrExt::char_at(&self[], i)
}
///
/// If `i` is greater than the length of the string.
/// If `i` is not an index following a valid UTF-8 character.
- #[unstable = "naming is uncertain with container conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming is uncertain with container conventions")]
fn char_at_reverse(&self, i: uint) -> char {
core_str::StrExt::char_at_reverse(&self[], i)
}
/// ```rust
/// assert_eq!("bors".as_bytes(), b"bors");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn as_bytes(&self) -> &[u8] {
core_str::StrExt::as_bytes(&self[])
}
/// let x: &[_] = &['1', '2'];
/// assert_eq!(s.find(x), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn find<P: CharEq>(&self, pat: P) -> Option<uint> {
core_str::StrExt::find(&self[], pat)
}
/// let x: &[_] = &['1', '2'];
/// assert_eq!(s.rfind(x), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn rfind<P: CharEq>(&self, pat: P) -> Option<uint> {
core_str::StrExt::rfind(&self[], pat)
}
/// assert_eq!(s.find_str("老虎 L"), Some(6));
/// assert_eq!(s.find_str("muffin man"), None);
/// ```
- #[unstable = "might get removed in favor of a more generic find in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might get removed in favor of a more generic find in the future")]
fn find_str(&self, needle: &str) -> Option<uint> {
core_str::StrExt::find_str(&self[], needle)
}
/// assert_eq!(c, 'ö');
/// assert_eq!(s2, "we 老虎 Léopard");
/// ```
- #[unstable = "awaiting conventions about shifting and slices"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "awaiting conventions about shifting and slices")]
fn slice_shift_char(&self) -> Option<(char, &str)> {
core_str::StrExt::slice_shift_char(&self[])
}
/// assert!(string.subslice_offset(lines[1]) == 2); // &"b"
/// assert!(string.subslice_offset(lines[2]) == 4); // &"c"
/// ```
- #[unstable = "awaiting convention about comparability of arbitrary slices"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "awaiting convention about comparability of arbitrary slices")]
fn subslice_offset(&self, inner: &str) -> uint {
core_str::StrExt::subslice_offset(&self[], inner)
}
/// The caller must ensure that the string outlives this pointer,
/// and that it is not reallocated (e.g. by pushing to the
/// string).
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn as_ptr(&self) -> *const u8 {
core_str::StrExt::as_ptr(&self[])
}
/// Return an iterator of `u16` over the string encoded as UTF-16.
- #[unstable = "this functionality may only be provided by libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may only be provided by libunicode")]
fn utf16_units(&self) -> Utf16Units {
Utf16Units { encoder: Utf16Encoder::new(self[].chars()) }
}
/// assert_eq!("foo".len(), 3);
/// assert_eq!("ƒoo".len(), 4);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn len(&self) -> uint {
core_str::StrExt::len(&self[])
/// assert!("".is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_empty(&self) -> bool {
core_str::StrExt::is_empty(&self[])
}
/// assert_eq!("j".parse::<u32>(), None);
/// ```
#[inline]
- #[unstable = "this method was just created"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this method was just created")]
fn parse<F: FromStr>(&self) -> Option<F> {
core_str::StrExt::parse(&self[])
}
/// let b: &[_] = &["a", "\r\n", "b", "🇷🇺🇸🇹"];
/// assert_eq!(gr2.as_slice(), b);
/// ```
- #[unstable = "this functionality may only be provided by libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may only be provided by libunicode")]
fn graphemes(&self, is_extended: bool) -> Graphemes {
UnicodeStr::graphemes(&self[], is_extended)
}
/// let b: &[_] = &[(0u, "a̐"), (3, "é"), (6, "ö̲"), (11, "\r\n")];
/// assert_eq!(gr_inds.as_slice(), b);
/// ```
- #[unstable = "this functionality may only be provided by libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may only be provided by libunicode")]
fn grapheme_indices(&self, is_extended: bool) -> GraphemeIndices {
UnicodeStr::grapheme_indices(&self[], is_extended)
}
/// let v: Vec<&str> = some_words.words().collect();
/// assert_eq!(v, vec!["Mary", "had", "a", "little", "lamb"]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn words(&self) -> Words {
UnicodeStr::words(&self[])
}
/// [Unicode Standard Annex #11](http://www.unicode.org/reports/tr11/)
/// recommends that these characters be treated as 1 column (i.e.,
/// `is_cjk` = `false`) if the locale is unknown.
- #[unstable = "this functionality may only be provided by libunicode"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this functionality may only be provided by libunicode")]
fn width(&self, is_cjk: bool) -> uint {
UnicodeStr::width(&self[], is_cjk)
}
/// Returns a string with leading and trailing whitespace removed.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trim(&self) -> &str {
UnicodeStr::trim(&self[])
}
/// Returns a string with leading whitespace removed.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trim_left(&self) -> &str {
UnicodeStr::trim_left(&self[])
}
/// Returns a string with trailing whitespace removed.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trim_right(&self) -> &str {
UnicodeStr::trim_right(&self[])
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl StrExt for str {}
#[cfg(test)]
//! An owned, growable string that enforces that its contents are valid UTF-8.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use core::prelude::*;
/// A growable string stored as a UTF-8 encoded buffer.
#[derive(Clone, PartialOrd, Eq, Ord)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct String {
vec: Vec<u8>,
}
/// A possible error value from the `String::from_utf8` function.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct FromUtf8Error {
bytes: Vec<u8>,
error: Utf8Error,
}
/// A possible error value from the `String::from_utf16` function.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[allow(missing_copy_implementations)]
pub struct FromUtf16Error(());
/// let mut s = String::new();
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> String {
String {
vec: Vec::new(),
/// let mut s = String::with_capacity(10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(capacity: uint) -> String {
String {
vec: Vec::with_capacity(capacity),
/// assert_eq!(s.as_slice(), "hello");
/// ```
#[inline]
- #[unstable = "needs investigation to see if to_string() can match perf"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "needs investigation to see if to_string() can match perf")]
pub fn from_str(string: &str) -> String {
String { vec: ::slice::SliceExt::to_vec(string.as_bytes()) }
}
/// assert_eq!(s.into_bytes(), vec![240, 144, 128]);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn from_utf8(vec: Vec<u8>) -> Result<String, FromUtf8Error> {
match str::from_utf8(vec.as_slice()) {
Ok(..) => Ok(String { vec: vec }),
/// let output = String::from_utf8_lossy(input);
/// assert_eq!(output.as_slice(), "Hello \u{FFFD}World");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn from_utf8_lossy<'a>(v: &'a [u8]) -> CowString<'a> {
let mut i = 0;
match str::from_utf8(v) {
/// v[4] = 0xD800;
/// assert!(String::from_utf16(v).is_err());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error> {
let mut s = String::with_capacity(v.len());
for c in unicode_str::utf16_items(v) {
/// "𝄞mus\u{FFFD}ic\u{FFFD}".to_string());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn from_utf16_lossy(v: &[u16]) -> String {
unicode_str::utf16_items(v).map(|c| c.to_char_lossy()).collect()
}
/// * We call `Vec::from_raw_parts` to get a `Vec<u8>`;
/// * We assume that the `Vec` contains valid UTF-8.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn from_raw_parts(buf: *mut u8, length: uint, capacity: uint) -> String {
String {
vec: Vec::from_raw_parts(buf, length, capacity),
/// it contains valid UTF-8. This is unsafe because it assumes that
/// the UTF-8-ness of the vector has already been validated.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String {
String { vec: bytes }
}
/// assert_eq!(bytes, vec![104, 101, 108, 108, 111]);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_bytes(self) -> Vec<u8> {
self.vec
}
/// assert_eq!(s.as_slice(), "foobar");
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push_str(&mut self, string: &str) {
self.vec.push_all(string.as_bytes())
}
/// assert!(s.capacity() >= 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint {
self.vec.capacity()
}
/// assert!(s.capacity() >= 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve(&mut self, additional: uint) {
self.vec.reserve(additional)
}
/// assert!(s.capacity() >= 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_exact(&mut self, additional: uint) {
self.vec.reserve_exact(additional)
}
/// assert_eq!(s.capacity(), 3);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn shrink_to_fit(&mut self) {
self.vec.shrink_to_fit()
}
/// assert_eq!(s.as_slice(), "abc123");
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push(&mut self, ch: char) {
if (ch as u32) < 0x80 {
self.vec.push(ch as u8);
/// assert_eq!(s.as_bytes(), b);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn as_bytes<'a>(&'a self) -> &'a [u8] {
self.vec.as_slice()
}
/// assert_eq!(s.as_slice(), "he");
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn truncate(&mut self, new_len: uint) {
assert!(self.is_char_boundary(new_len));
self.vec.truncate(new_len)
/// assert_eq!(s.pop(), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop(&mut self) -> Option<char> {
let len = self.len();
if len == 0 {
/// assert_eq!(s.remove(0), 'o');
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove(&mut self, idx: uint) -> char {
let len = self.len();
assert!(idx <= len);
/// If `idx` does not lie on a character boundary or is out of bounds, then
/// this function will panic.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, idx: uint, ch: char) {
let len = self.len();
assert!(idx <= len);
/// assert_eq!(s.as_slice(), "olleh");
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn as_mut_vec<'a>(&'a mut self) -> &'a mut Vec<u8> {
&mut self.vec
}
/// assert_eq!(a.len(), 3);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.vec.len() }
/// Returns true if the string contains no bytes
/// assert!(!v.is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
/// Truncates the string, returning it to 0 length.
/// assert!(s.is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) {
self.vec.clear()
}
impl FromUtf8Error {
/// Consume this error, returning the bytes that were attempted to make a
/// `String` with.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_bytes(self) -> Vec<u8> { self.bytes }
/// Access the underlying UTF8-error that was the cause of this error.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn utf8_error(&self) -> Utf8Error { self.error }
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl fmt::String for FromUtf8Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::String::fmt(&self.error, f)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl fmt::String for FromUtf16Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::String::fmt("invalid utf-16: lone surrogate found", f)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl FromIterator<char> for String {
fn from_iter<I:Iterator<Item=char>>(iterator: I) -> String {
let mut buf = String::new();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> FromIterator<&'a str> for String {
fn from_iter<I:Iterator<Item=&'a str>>(iterator: I) -> String {
let mut buf = String::new();
}
}
-#[unstable = "waiting on Extend stabilization"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting on Extend stabilization")]
impl Extend<char> for String {
fn extend<I:Iterator<Item=char>>(&mut self, mut iterator: I) {
let (lower_bound, _) = iterator.size_hint();
}
}
-#[unstable = "waiting on Extend stabilization"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting on Extend stabilization")]
impl<'a> Extend<&'a str> for String {
fn extend<I: Iterator<Item=&'a str>>(&mut self, mut iterator: I) {
// A guess that at least one byte per iterator element will be needed.
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialEq for String {
#[inline]
fn eq(&self, other: &String) -> bool { PartialEq::eq(&**self, &**other) }
macro_rules! impl_eq {
($lhs:ty, $rhs: ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> PartialEq<$rhs> for $lhs {
#[inline]
fn eq(&self, other: &$rhs) -> bool { PartialEq::eq(&**self, &**other) }
fn ne(&self, other: &$rhs) -> bool { PartialEq::ne(&**self, &**other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> PartialEq<$lhs> for $rhs {
#[inline]
fn eq(&self, other: &$lhs) -> bool { PartialEq::eq(&**self, &**other) }
impl_eq! { String, &'a str }
impl_eq! { CowString<'a>, String }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b> PartialEq<&'b str> for CowString<'a> {
#[inline]
fn eq(&self, other: &&'b str) -> bool { PartialEq::eq(&**self, &**other) }
fn ne(&self, other: &&'b str) -> bool { PartialEq::ne(&**self, &**other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b> PartialEq<CowString<'a>> for &'b str {
#[inline]
fn eq(&self, other: &CowString<'a>) -> bool { PartialEq::eq(&**self, &**other) }
fn ne(&self, other: &CowString<'a>) -> bool { PartialEq::ne(&**self, &**other) }
}
-#[unstable = "waiting on Str stabilization"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on Str stabilization")]
impl Str for String {
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn as_slice<'a>(&'a self) -> &'a str {
unsafe { mem::transmute(self.vec.as_slice()) }
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Default for String {
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> String {
String::new()
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl fmt::String for String {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
-#[unstable = "waiting on fmt stabilization"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on fmt stabilization")]
impl fmt::Show for String {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
-#[unstable = "waiting on Hash stabilization"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on Hash stabilization")]
impl<H: hash::Writer + hash::Hasher> hash::Hash<H> for String {
#[inline]
fn hash(&self, hasher: &mut H) {
}
}
-#[unstable = "recent addition, needs more experience"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recent addition, needs more experience")]
impl<'a> Add<&'a str> for String {
type Output = String;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl ops::Deref for String {
type Target = str;
}
/// Wrapper type providing a `&String` reference via `Deref`.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct DerefString<'a> {
x: DerefVec<'a, u8>
}
/// let string = as_string("foo").clone();
/// string_consumer(string);
/// ```
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn as_string<'a>(x: &'a str) -> DerefString<'a> {
DerefString { x: as_vec(x.as_bytes()) }
}
}
/// A clone-on-write string
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub type CowString<'a> = Cow<'a, String, str>;
impl<'a> Str for CowString<'a> {
//! let two = xs.pop();
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use core::prelude::*;
/// to reallocate, which can be slow. For this reason, it is recommended to use
/// `Vec::with_capacity` whenever possible to specify how big the vector is expected to get.
#[unsafe_no_drop_flag]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Vec<T> {
ptr: NonZero<*mut T>,
len: uint,
/// let mut vec: Vec<int> = Vec::new();
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> Vec<T> {
// We want ptr to never be NULL so instead we set it to some arbitrary
// non-null value which is fine since we never call deallocate on the ptr
/// vec.push(11);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(capacity: uint) -> Vec<T> {
if mem::size_of::<T>() == 0 {
Vec { ptr: unsafe { NonZero::new(EMPTY as *mut T) }, len: 0, cap: uint::MAX }
/// }
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn from_raw_parts(ptr: *mut T, length: uint,
capacity: uint) -> Vec<T> {
Vec { ptr: NonZero::new(ptr), len: length, cap: capacity }
/// owned by the returned `Vec<T>`. The elements of the buffer are copied into the vector
/// without cloning, as if `ptr::read()` were called on them.
#[inline]
- #[unstable = "may be better expressed via composition"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be better expressed via composition")]
pub unsafe fn from_raw_buf(ptr: *const T, elts: uint) -> Vec<T> {
let mut dst = Vec::with_capacity(elts);
dst.set_len(elts);
/// assert_eq!(vec.capacity(), 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint {
self.cap
}
/// vec.reserve(10);
/// assert!(vec.capacity() >= 11);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve(&mut self, additional: uint) {
if self.cap - self.len < additional {
let err_msg = "Vec::reserve: `uint` overflow";
/// vec.reserve_exact(10);
/// assert!(vec.capacity() >= 11);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_exact(&mut self, additional: uint) {
if self.cap - self.len < additional {
match self.len.checked_add(additional) {
/// vec.shrink_to_fit();
/// assert!(vec.capacity() >= 3);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn shrink_to_fit(&mut self) {
if mem::size_of::<T>() == 0 { return }
/// Note that this will drop any excess capacity. Calling this and
/// converting back to a vector with `into_vec()` is equivalent to calling
/// `shrink_to_fit()`.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn into_boxed_slice(mut self) -> Box<[T]> {
self.shrink_to_fit();
unsafe {
/// vec.truncate(2);
/// assert_eq!(vec, vec![1, 2]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn truncate(&mut self, len: uint) {
unsafe {
// drop any extra elements
/// foo(vec.as_mut_slice());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T] {
unsafe {
mem::transmute(RawSlice {
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
unsafe {
let ptr = *self.ptr;
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn set_len(&mut self, len: uint) {
self.len = len;
}
/// assert_eq!(v, vec!["baz", "qux"]);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn swap_remove(&mut self, index: uint) -> T {
let length = self.len();
self.swap(index, length - 1);
/// vec.insert(4, 5);
/// assert_eq!(vec, vec![1, 4, 2, 3, 5]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, index: uint, element: T) {
let len = self.len();
assert!(index <= len);
/// assert_eq!(v.remove(1), 2);
/// assert_eq!(v, vec![1, 3]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove(&mut self, index: uint) -> T {
let len = self.len();
assert!(index < len);
/// vec.retain(|&x| x%2 == 0);
/// assert_eq!(vec, vec![2, 4]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn retain<F>(&mut self, mut f: F) where F: FnMut(&T) -> bool {
let len = self.len();
let mut del = 0u;
/// assert_eq!(vec, vec!(1, 2, 3));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn push(&mut self, value: T) {
if mem::size_of::<T>() == 0 {
// zero-size types consume no memory, so we can't rely on the
/// assert_eq!(vec, vec![1, 2]);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn pop(&mut self) -> Option<T> {
if self.len == 0 {
None
/// assert_eq!(vec2, vec![]);
/// ```
#[inline]
- #[unstable = "new API, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "new API, waiting for dust to settle")]
pub fn append(&mut self, other: &mut Self) {
if mem::size_of::<T>() == 0 {
// zero-size types consume no memory, so we can't rely on the
/// assert!(v.is_empty());
/// ```
#[inline]
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn drain<'a>(&'a mut self) -> Drain<'a, T> {
unsafe {
let begin = *self.ptr as *const T;
/// assert!(v.is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) {
self.truncate(0)
}
/// assert_eq!(a.len(), 3);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.len }
/// Returns `true` if the vector contains no elements.
/// v.push(1i);
/// assert!(!v.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
/// Converts a `Vec<T>` to a `Vec<U>` where `T` and `U` have the same
/// let newtyped_bytes = bytes.map_in_place(|x| Newtype(x));
/// assert_eq!(newtyped_bytes.as_slice(), [Newtype(0x11), Newtype(0x22)].as_slice());
/// ```
- #[unstable = "API may change to provide stronger guarantees"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "API may change to provide stronger guarantees")]
pub fn map_in_place<U, F>(self, mut f: F) -> Vec<U> where F: FnMut(T) -> U {
// FIXME: Assert statically that the types `T` and `U` have the same
// size.
/// vec.resize(2, 0);
/// assert_eq!(vec, vec![1, 2]);
/// ```
- #[unstable = "matches collection reform specification; waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification; waiting for dust to settle")]
pub fn resize(&mut self, new_len: uint, value: T) {
let len = self.len();
/// assert_eq!(vec, vec![1, 2, 3, 4]);
/// ```
#[inline]
- #[unstable = "likely to be replaced by a more optimized extend"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by a more optimized extend")]
pub fn push_all(&mut self, other: &[T]) {
self.reserve(other.len());
///
/// assert_eq!(vec, vec![1i, 2, 3, 2]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn dedup(&mut self) {
unsafe {
// Although we have a mutable reference to `self`, we cannot make
// Common trait implementations for Vec
////////////////////////////////////////////////////////////////////////////////
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<T:Clone> Clone for Vec<T> {
fn clone(&self) -> Vec<T> { ::slice::SliceExt::to_vec(self.as_slice()) }
}
}
-#[unstable = "waiting on Index stability"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on Index stability")]
impl<T> Index<uint> for Vec<T> {
type Output = T;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> ops::Deref for Vec<T> {
type Target = [T];
fn deref<'a>(&'a self) -> &'a [T] { self.as_slice() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> ops::DerefMut for Vec<T> {
fn deref_mut<'a>(&'a mut self) -> &'a mut [T] { self.as_mut_slice() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> FromIterator<T> for Vec<T> {
#[inline]
fn from_iter<I:Iterator<Item=T>>(mut iterator: I) -> Vec<T> {
}
}
-#[unstable = "waiting on Extend stability"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on Extend stability")]
impl<T> Extend<T> for Vec<T> {
#[inline]
fn extend<I: Iterator<Item=T>>(&mut self, mut iterator: I) {
impl_eq_for_cowvec! { &'b [B] }
impl_eq_for_cowvec! { &'b mut [B] }
-#[unstable = "waiting on PartialOrd stability"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting on PartialOrd stability")]
impl<T: PartialOrd> PartialOrd for Vec<T> {
#[inline]
fn partial_cmp(&self, other: &Vec<T>) -> Option<Ordering> {
}
}
-#[unstable = "waiting on Eq stability"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on Eq stability")]
impl<T: Eq> Eq for Vec<T> {}
-#[unstable = "waiting on Ord stability"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on Ord stability")]
impl<T: Ord> Ord for Vec<T> {
#[inline]
fn cmp(&self, other: &Vec<T>) -> Ordering {
/// foo(vec.as_slice());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn as_slice<'a>(&'a self) -> &'a [T] {
unsafe {
mem::transmute(RawSlice {
}
}
-#[unstable = "recent addition, needs more experience"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recent addition, needs more experience")]
impl<'a, T: Clone> Add<&'a [T]> for Vec<T> {
type Output = Vec<T>;
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Drop for Vec<T> {
fn drop(&mut self) {
// This is (and should always remain) a no-op if the fields are
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Default for Vec<T> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Vec<T> {
Vec::new()
}
}
-#[unstable = "waiting on Show stability"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "waiting on Show stability")]
impl<T: fmt::Show> fmt::Show for Vec<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Show::fmt(self.as_slice(), f)
// Clone-on-write
////////////////////////////////////////////////////////////////////////////////
-#[unstable = "unclear how valuable this alias is"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unclear how valuable this alias is")]
/// A clone-on-write vector
pub type CowVec<'a, T> = Cow<'a, Vec<T>, [T]>;
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> FromIterator<T> for CowVec<'a, T> where T: Clone {
fn from_iter<I: Iterator<Item=T>>(it: I) -> CowVec<'a, T> {
Cow::Owned(FromIterator::from_iter(it))
////////////////////////////////////////////////////////////////////////////////
/// An iterator that moves out of a vector.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<T> {
allocation: *mut T, // the block of memory allocated for the vector
cap: uint, // the capacity of the vector
impl<T> IntoIter<T> {
#[inline]
/// Drops all items that have not yet been moved and returns the empty vector.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn into_inner(mut self) -> Vec<T> {
unsafe {
for _x in self { }
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Iterator for IntoIter<T> {
type Item = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> DoubleEndedIterator for IntoIter<T> {
#[inline]
fn next_back<'a>(&'a mut self) -> Option<T> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> ExactSizeIterator for IntoIter<T> {}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Drop for IntoIter<T> {
fn drop(&mut self) {
// destroy the remaining elements
/// An iterator that drains a vector.
#[unsafe_no_drop_flag]
-#[unstable = "recently added as part of collections reform 2"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added as part of collections reform 2")]
pub struct Drain<'a, T> {
ptr: *const T,
end: *const T,
marker: ContravariantLifetime<'a>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for Drain<'a, T> {
type Item = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for Drain<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<T> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for Drain<'a, T> {}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Drop for Drain<'a, T> {
fn drop(&mut self) {
// self.ptr == self.end == null if drop has already been called,
////////////////////////////////////////////////////////////////////////////////
/// Wrapper type providing a `&Vec<T>` reference via `Deref`.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct DerefVec<'a, T> {
x: Vec<T>,
l: ContravariantLifetime<'a>
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> Deref for DerefVec<'a, T> {
type Target = Vec<T>;
// Prevent the inner `Vec<T>` from attempting to deallocate memory.
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Drop for DerefVec<'a, T> {
fn drop(&mut self) {
self.x.len = 0;
}
/// Convert a slice to a wrapper type providing a `&Vec<T>` reference.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn as_vec<'a, T>(x: &'a [T]) -> DerefVec<'a, T> {
unsafe {
DerefVec {
v: Vec<Option<V>>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V> Default for VecMap<V> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn default() -> VecMap<V> { VecMap::new() }
}
/// use std::collections::VecMap;
/// let mut map: VecMap<&str> = VecMap::new();
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> VecMap<V> { VecMap { v: vec![] } }
/// Creates an empty `VecMap` with space for at least `capacity`
/// use std::collections::VecMap;
/// let mut map: VecMap<&str> = VecMap::with_capacity(10);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(capacity: uint) -> VecMap<V> {
VecMap { v: Vec::with_capacity(capacity) }
}
/// assert!(map.capacity() >= 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint {
self.v.capacity()
}
/// map.reserve_len(10);
/// assert!(map.capacity() >= 10);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_len(&mut self, len: uint) {
let cur_len = self.v.len();
if len >= cur_len {
/// map.reserve_len_exact(10);
/// assert!(map.capacity() >= 10);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve_len_exact(&mut self, len: uint) {
let cur_len = self.v.len();
if len >= cur_len {
/// Returns an iterator visiting all keys in ascending order of the keys.
/// The iterator's element type is `uint`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn keys<'r>(&'r self) -> Keys<'r, V> {
fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((uint, &'r V)) -> uint = first; // coerce to fn pointer
/// Returns an iterator visiting all values in ascending order of the keys.
/// The iterator's element type is `&'r V`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn values<'r>(&'r self) -> Values<'r, V> {
fn second<A, B>((_, b): (A, B)) -> B { b }
let second: fn((uint, &'r V)) -> &'r V = second; // coerce to fn pointer
/// println!("{}: {}", key, value);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter<'r>(&'r self) -> Iter<'r, V> {
Iter {
front: 0,
/// assert_eq!(value, &"x");
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter_mut<'r>(&'r mut self) -> IterMut<'r, V> {
IterMut {
front: 0,
///
/// assert_eq!(vec, vec![(1, "a"), (2, "b"), (3, "c")]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<V> {
fn filter<A>((i, v): (uint, Option<A>)) -> Option<(uint, A)> {
v.map(|v| (i, v))
///
/// assert_eq!(vec, vec![(1, "a"), (2, "b"), (3, "c")]);
/// ```
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn drain<'a>(&'a mut self) -> Drain<'a, V> {
fn filter<A>((i, v): (uint, Option<A>)) -> Option<(uint, A)> {
v.map(|v| (i, v))
/// a.insert(1, "a");
/// assert_eq!(a.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint {
self.v.iter().filter(|elt| elt.is_some()).count()
}
/// a.insert(1, "a");
/// assert!(!a.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool {
self.v.iter().all(|elt| elt.is_none())
}
/// a.clear();
/// assert!(a.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) { self.v.clear() }
/// Returns a reference to the value corresponding to the key.
/// assert_eq!(map.get(&1), Some(&"a"));
/// assert_eq!(map.get(&2), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get(&self, key: &uint) -> Option<&V> {
if *key < self.v.len() {
match self.v[*key] {
/// assert_eq!(map.contains_key(&2), false);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn contains_key(&self, key: &uint) -> bool {
self.get(key).is_some()
}
/// }
/// assert_eq!(map[1], "b");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get_mut(&mut self, key: &uint) -> Option<&mut V> {
if *key < self.v.len() {
match *(&mut self.v[*key]) {
/// assert_eq!(map.insert(37, "c"), Some("b"));
/// assert_eq!(map[37], "c");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, key: uint, value: V) -> Option<V> {
let len = self.v.len();
if len <= key {
/// assert_eq!(map.remove(&1), Some("a"));
/// assert_eq!(map.remove(&1), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove(&mut self, key: &uint) -> Option<V> {
if *key >= self.v.len() {
return None;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V: PartialEq> PartialEq for VecMap<V> {
fn eq(&self, other: &VecMap<V>) -> bool {
iter::order::eq(self.iter(), other.iter())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V: Eq> Eq for VecMap<V> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V: PartialOrd> PartialOrd for VecMap<V> {
#[inline]
fn partial_cmp(&self, other: &VecMap<V>) -> Option<Ordering> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V: Ord> Ord for VecMap<V> {
#[inline]
fn cmp(&self, other: &VecMap<V>) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V: fmt::Show> fmt::Show for VecMap<V> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "VecMap {{"));
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V> FromIterator<(uint, V)> for VecMap<V> {
fn from_iter<Iter: Iterator<Item=(uint, V)>>(iter: Iter) -> VecMap<V> {
let mut map = VecMap::new();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V> Extend<(uint, V)> for VecMap<V> {
fn extend<Iter: Iterator<Item=(uint, V)>>(&mut self, mut iter: Iter) {
for (k, v) in iter {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V> IndexMut<uint> for VecMap<V> {
type Output = V;
macro_rules! iterator {
(impl $name:ident -> $elem:ty, $($getter:ident),+) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, V> Iterator for $name<'a, V> {
type Item = $elem;
macro_rules! double_ended_iterator {
(impl $name:ident -> $elem:ty, $($getter:ident),+) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, V> DoubleEndedIterator for $name<'a, V> {
#[inline]
fn next_back(&mut self) -> Option<$elem> {
}
/// An iterator over the key-value pairs of a map.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, V:'a> {
front: uint,
back: uint,
/// An iterator over the key-value pairs of a map, with the
/// values being mutable.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, V:'a> {
front: uint,
back: uint,
double_ended_iterator! { impl IterMut -> (uint, &'a mut V), as_mut }
/// An iterator over the keys of a map.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Keys<'a, V: 'a> {
iter: Map<(uint, &'a V), uint, Iter<'a, V>, fn((uint, &'a V)) -> uint>
}
}
/// An iterator over the values of a map.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Values<'a, V: 'a> {
iter: Map<(uint, &'a V), &'a V, Iter<'a, V>, fn((uint, &'a V)) -> &'a V>
}
}
/// A consuming iterator over the key-value pairs of a map.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<V> {
iter: FilterMap<
(uint, Option<V>),
fn((uint, Option<V>)) -> Option<(uint, V)>>
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct Drain<'a, V> {
iter: FilterMap<
(uint, Option<V>),
fn((uint, Option<V>)) -> Option<(uint, V)>>
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, V> Iterator for Drain<'a, V> {
type Item = (uint, V);
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, V> DoubleEndedIterator for Drain<'a, V> {
fn next_back(&mut self) -> Option<(uint, V)> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, V> Iterator for Keys<'a, V> {
type Item = uint;
fn next(&mut self) -> Option<uint> { self.iter.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, V> DoubleEndedIterator for Keys<'a, V> {
fn next_back(&mut self) -> Option<uint> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, V> Iterator for Values<'a, V> {
type Item = &'a V;
fn next(&mut self) -> Option<(&'a V)> { self.iter.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, V> DoubleEndedIterator for Values<'a, V> {
fn next_back(&mut self) -> Option<(&'a V)> { self.iter.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V> Iterator for IntoIter<V> {
type Item = (uint, V);
fn next(&mut self) -> Option<(uint, V)> { self.iter.next() }
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<V> DoubleEndedIterator for IntoIter<V> {
fn next_back(&mut self) -> Option<(uint, V)> { self.iter.next_back() }
}
//! }
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use mem::transmute;
use option::Option::{self, Some, None};
///
/// Every type with no non-`'static` references implements `Any`, so `Any` can
/// be used as a trait object to emulate the effects dynamic typing.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Any: 'static {
/// Get the `TypeId` of `self`
- #[unstable = "this method will likely be replaced by an associated static"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this method will likely be replaced by an associated static")]
fn get_type_id(&self) -> TypeId;
}
impl Any {
/// Returns true if the boxed type is the same as `T`
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
pub fn is<T: 'static>(&self) -> bool {
// Get TypeId of the type this function is instantiated with
/// Returns some reference to the boxed value if it is of type `T`, or
/// `None` if it isn't.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
pub fn downcast_ref<T: 'static>(&self) -> Option<&T> {
if self.is::<T>() {
/// Returns some mutable reference to the boxed value if it is of type `T`, or
/// `None` if it isn't.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
pub fn downcast_mut<T: 'static>(&mut self) -> Option<&mut T> {
if self.is::<T>() {
/// but this limitation may be removed in the future.
#[cfg_attr(stage0, lang = "type_id")]
#[derive(Clone, Copy, PartialEq, Eq, Show, Hash)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct TypeId {
t: u64,
}
/// Returns the `TypeId` of the type this generic function has been
/// instantiated with
#[cfg(not(stage0))]
- #[unstable = "may grow a `Reflect` bound soon via marker traits"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may grow a `Reflect` bound soon via marker traits")]
pub fn of<T: ?Sized + 'static>() -> TypeId {
TypeId {
t: unsafe { intrinsics::type_id::<T>() },
//! up to a certain length. Eventually we should able to generalize
//! to all lengths.
-#![unstable] // not yet reviewed
+#![unstable(feature = "unnamed_feature", since = "1.0.0")] // not yet reviewed
use clone::Clone;
use cmp::{PartialEq, Eq, PartialOrd, Ord, Ordering};
macro_rules! array_impls {
($($N:expr)+) => {
$(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:Copy> Clone for [T; $N] {
fn clone(&self) -> [T; $N] {
*self
}
}
- #[unstable = "waiting for Show to stabilize"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting for Show to stabilize")]
impl<T:fmt::Show> fmt::Show for [T; $N] {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Show::fmt(&&self[], f)
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B> PartialEq<[B; $N]> for [A; $N] where A: PartialEq<B> {
#[inline]
fn eq(&self, other: &[B; $N]) -> bool {
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A, B, Rhs> PartialEq<Rhs> for [A; $N] where
A: PartialEq<B>,
Rhs: Deref<Target=[B]>,
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A, B, Lhs> PartialEq<[B; $N]> for Lhs where
A: PartialEq<B>,
Lhs: Deref<Target=[A]>
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:Eq> Eq for [T; $N] { }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:PartialOrd> PartialOrd for [T; $N] {
#[inline]
fn partial_cmp(&self, other: &[T; $N]) -> Option<Ordering> {
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:Ord> Ord for [T; $N] {
#[inline]
fn cmp(&self, other: &[T; $N]) -> Ordering {
//! println!("live tasks: {}", old_task_count + 1);
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use self::Ordering::*;
use cell::UnsafeCell;
/// A boolean type which can be safely shared between threads.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct AtomicBool {
v: UnsafeCell<usize>,
}
unsafe impl Sync for AtomicBool {}
/// A signed integer type which can be safely shared between threads.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct AtomicIsize {
v: UnsafeCell<isize>,
}
unsafe impl Sync for AtomicIsize {}
/// An unsigned integer type which can be safely shared between threads.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct AtomicUsize {
v: UnsafeCell<usize>,
}
unsafe impl Sync for AtomicUsize {}
/// A raw pointer type which can be safely shared between threads.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct AtomicPtr<T> {
p: UnsafeCell<usize>,
}
///
/// Rust's memory orderings are [the same as
/// C++'s](http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync).
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[derive(Copy)]
pub enum Ordering {
/// No ordering constraints, only atomic operations.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Relaxed,
/// When coupled with a store, all previous writes become visible
/// to another thread that performs a load with `Acquire` ordering
/// on the same value.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Release,
/// When coupled with a load, all subsequent loads will see data
/// written before a store with `Release` ordering on the same value
/// in another thread.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Acquire,
/// When coupled with a load, uses `Acquire` ordering, and with a store
/// `Release` ordering.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
AcqRel,
/// Like `AcqRel` with the additional guarantee that all threads see all
/// sequentially consistent operations in the same order.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
SeqCst,
}
/// An `AtomicBool` initialized to `false`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const ATOMIC_BOOL_INIT: AtomicBool =
AtomicBool { v: UnsafeCell { value: 0 } };
/// An `AtomicIsize` initialized to `0`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const ATOMIC_ISIZE_INIT: AtomicIsize =
AtomicIsize { v: UnsafeCell { value: 0 } };
/// An `AtomicUsize` initialized to `0`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const ATOMIC_USIZE_INIT: AtomicUsize =
AtomicUsize { v: UnsafeCell { value: 0, } };
/// let atomic_false = AtomicBool::new(false);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(v: bool) -> AtomicBool {
let val = if v { UINT_TRUE } else { 0 };
AtomicBool { v: UnsafeCell::new(val) }
/// let value = some_bool.load(Ordering::Relaxed);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn load(&self, order: Ordering) -> bool {
unsafe { atomic_load(self.v.get(), order) > 0 }
}
///
/// Panics if `order` is `Acquire` or `AcqRel`.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn store(&self, val: bool, order: Ordering) {
let val = if val { UINT_TRUE } else { 0 };
/// let value = some_bool.swap(false, Ordering::Relaxed);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn swap(&self, val: bool, order: Ordering) -> bool {
let val = if val { UINT_TRUE } else { 0 };
/// let value = some_bool.store(false, Ordering::Relaxed);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn compare_and_swap(&self, old: bool, new: bool, order: Ordering) -> bool {
let old = if old { UINT_TRUE } else { 0 };
let new = if new { UINT_TRUE } else { 0 };
/// assert_eq!(false, foo.load(Ordering::SeqCst));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn fetch_and(&self, val: bool, order: Ordering) -> bool {
let val = if val { UINT_TRUE } else { 0 };
/// assert_eq!(true, foo.load(Ordering::SeqCst));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn fetch_nand(&self, val: bool, order: Ordering) -> bool {
let val = if val { UINT_TRUE } else { 0 };
/// assert_eq!(false, foo.load(Ordering::SeqCst));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn fetch_or(&self, val: bool, order: Ordering) -> bool {
let val = if val { UINT_TRUE } else { 0 };
/// assert_eq!(false, foo.load(Ordering::SeqCst));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn fetch_xor(&self, val: bool, order: Ordering) -> bool {
let val = if val { UINT_TRUE } else { 0 };
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl AtomicIsize {
/// Creates a new `AtomicIsize`.
///
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl AtomicUsize {
/// Creates a new `AtomicUsize`.
///
/// let atomic_ptr = AtomicPtr::new(ptr);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(p: *mut T) -> AtomicPtr<T> {
AtomicPtr { p: UnsafeCell::new(p as usize) }
}
/// let value = some_ptr.load(Ordering::Relaxed);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn load(&self, order: Ordering) -> *mut T {
unsafe {
atomic_load(self.p.get(), order) as *mut T
///
/// Panics if `order` is `Acquire` or `AcqRel`.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn store(&self, ptr: *mut T, order: Ordering) {
unsafe { atomic_store(self.p.get(), ptr as usize, order); }
}
/// let value = some_ptr.swap(other_ptr, Ordering::Relaxed);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn swap(&self, ptr: *mut T, order: Ordering) -> *mut T {
unsafe { atomic_swap(self.p.get(), ptr as usize, order) as *mut T }
}
/// let value = some_ptr.compare_and_swap(other_ptr, another_ptr, Ordering::Relaxed);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn compare_and_swap(&self, old: *mut T, new: *mut T, order: Ordering) -> *mut T {
unsafe {
atomic_compare_and_swap(self.p.get(), old as usize,
}
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_load<T>(dst: *const T, order:Ordering) -> T {
match order {
Acquire => intrinsics::atomic_load_acq(dst),
}
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_swap<T>(dst: *mut T, val: T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_xchg_acq(dst, val),
/// Returns the old value (like __sync_fetch_and_add).
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_add<T>(dst: *mut T, val: T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_xadd_acq(dst, val),
/// Returns the old value (like __sync_fetch_and_sub).
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_sub<T>(dst: *mut T, val: T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_xsub_acq(dst, val),
}
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_compare_and_swap<T>(dst: *mut T, old:T, new:T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_cxchg_acq(dst, old, new),
}
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_and<T>(dst: *mut T, val: T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_and_acq(dst, val),
}
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_nand<T>(dst: *mut T, val: T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_nand_acq(dst, val),
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_or<T>(dst: *mut T, val: T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_or_acq(dst, val),
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn atomic_xor<T>(dst: *mut T, val: T, order: Ordering) -> T {
match order {
Acquire => intrinsics::atomic_xor_acq(dst, val),
///
/// Panics if `order` is `Relaxed`.
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn fence(order: Ordering) {
unsafe {
match order {
}
}
-#[deprecated="renamed to AtomicIsize"]
+#[deprecated(feature = "unnamed_feature", since = "1.0.0",
+ reason = "renamed to AtomicIsize")]
#[allow(missing_docs)]
pub struct AtomicInt {
v: UnsafeCell<int>,
unsafe impl Sync for AtomicInt {}
-#[deprecated="renamed to AtomicUsize"]
+#[deprecated(feature = "unnamed_feature", since = "1.0.0",
+ reason = "renamed to AtomicUsize")]
#[allow(missing_docs)]
pub struct AtomicUint {
v: UnsafeCell<uint>,
unsafe impl Sync for AtomicUint {}
-#[deprecated="use ATOMIC_ISIZE_INIT instead"]
+#[deprecated(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use ATOMIC_ISIZE_INIT instead")]
#[allow(missing_docs, deprecated)]
pub const ATOMIC_INT_INIT: AtomicInt =
AtomicInt { v: UnsafeCell { value: 0 } };
-#[deprecated="use ATOMIC_USIZE_INIT instead"]
+#[deprecated(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use ATOMIC_USIZE_INIT instead")]
#[allow(missing_docs, deprecated)]
pub const ATOMIC_UINT_INIT: AtomicUint =
AtomicUint { v: UnsafeCell { value: 0, } };
//! is desired, `to_mut` will obtain a mutable references to an owned
//! value, cloning if necessary.
-#![unstable = "recently added as part of collections reform"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added as part of collections reform")]
use clone::Clone;
use cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
Owned(T)
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, B: ?Sized> Clone for Cow<'a, T, B> where B: ToOwned<T> {
fn clone(&self) -> Cow<'a, T, B> {
match *self {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, B: ?Sized> Deref for Cow<'a, T, B> where B: ToOwned<T> {
type Target = B;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, B: ?Sized> Eq for Cow<'a, T, B> where B: Eq + ToOwned<T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, B: ?Sized> Ord for Cow<'a, T, B> where B: Ord + ToOwned<T> {
#[inline]
fn cmp(&self, other: &Cow<'a, T, B>) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T, U, B: ?Sized, C: ?Sized> PartialEq<Cow<'b, U, C>> for Cow<'a, T, B> where
B: PartialEq<C> + ToOwned<T>,
C: ToOwned<U>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, B: ?Sized> PartialOrd for Cow<'a, T, B> where B: PartialOrd + ToOwned<T> {
#[inline]
fn partial_cmp(&self, other: &Cow<'a, T, B>) -> Option<Ordering> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, B: ?Sized> fmt::String for Cow<'a, T, B> where
B: fmt::String + ToOwned<T>,
T: fmt::String,
// FIXME: Can't be shared between threads. Dynamic borrows
// FIXME: Relationship to Atomic types and RWLock
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use clone::Clone;
use cmp::PartialEq;
use option::Option::{None, Some};
/// A mutable memory location that admits only `Copy` data.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Cell<T> {
value: UnsafeCell<T>,
}
impl<T:Copy> Cell<T> {
/// Creates a new `Cell` containing the given value.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(value: T) -> Cell<T> {
Cell {
value: UnsafeCell::new(value),
/// Returns a copy of the contained value.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get(&self) -> T {
unsafe{ *self.value.get() }
}
/// Sets the contained value.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn set(&self, value: T) {
unsafe {
*self.value.get() = value;
///
/// This function is `unsafe` because `UnsafeCell`'s field is public.
#[inline]
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub unsafe fn as_unsafe_cell<'a>(&'a self) -> &'a UnsafeCell<T> {
&self.value
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe impl<T> Send for Cell<T> where T: Send {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:Copy> Clone for Cell<T> {
fn clone(&self) -> Cell<T> {
Cell::new(self.get())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:Default + Copy> Default for Cell<T> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Cell<T> {
Cell::new(Default::default())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:PartialEq + Copy> PartialEq for Cell<T> {
fn eq(&self, other: &Cell<T>) -> bool {
self.get() == other.get()
}
/// A mutable memory location with dynamically checked borrow rules
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RefCell<T> {
value: UnsafeCell<T>,
borrow: Cell<BorrowFlag>,
impl<T> RefCell<T> {
/// Create a new `RefCell` containing `value`
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(value: T) -> RefCell<T> {
RefCell {
value: UnsafeCell::new(value),
}
/// Consumes the `RefCell`, returning the wrapped value.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_inner(self) -> T {
// Since this function takes `self` (the `RefCell`) by value, the
// compiler statically verifies that it is not currently borrowed.
/// immutable borrows can be taken out at the same time.
///
/// Returns `None` if the value is currently mutably borrowed.
- #[unstable = "may be renamed or removed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be renamed or removed")]
pub fn try_borrow<'a>(&'a self) -> Option<Ref<'a, T>> {
match BorrowRef::new(&self.borrow) {
Some(b) => Some(Ref { _value: unsafe { &*self.value.get() }, _borrow: b }),
/// # Panics
///
/// Panics if the value is currently mutably borrowed.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn borrow<'a>(&'a self) -> Ref<'a, T> {
match self.try_borrow() {
Some(ptr) => ptr,
/// cannot be borrowed while this borrow is active.
///
/// Returns `None` if the value is currently borrowed.
- #[unstable = "may be renamed or removed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be renamed or removed")]
pub fn try_borrow_mut<'a>(&'a self) -> Option<RefMut<'a, T>> {
match BorrowRefMut::new(&self.borrow) {
Some(b) => Some(RefMut { _value: unsafe { &mut *self.value.get() }, _borrow: b }),
/// # Panics
///
/// Panics if the value is currently borrowed.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn borrow_mut<'a>(&'a self) -> RefMut<'a, T> {
match self.try_borrow_mut() {
Some(ptr) => ptr,
///
/// This function is `unsafe` because `UnsafeCell`'s field is public.
#[inline]
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub unsafe fn as_unsafe_cell<'a>(&'a self) -> &'a UnsafeCell<T> {
&self.value
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe impl<T> Send for RefCell<T> where T: Send {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Clone> Clone for RefCell<T> {
fn clone(&self) -> RefCell<T> {
RefCell::new(self.borrow().clone())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T:Default> Default for RefCell<T> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> RefCell<T> {
RefCell::new(Default::default())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: PartialEq> PartialEq for RefCell<T> {
fn eq(&self, other: &RefCell<T>) -> bool {
*self.borrow() == *other.borrow()
}
/// Wraps a borrowed reference to a value in a `RefCell` box.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Ref<'b, T:'b> {
// FIXME #12808: strange name to try to avoid interfering with
// field accesses of the contained type via Deref
_borrow: BorrowRef<'b>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'b, T> Deref for Ref<'b, T> {
type Target = T;
///
/// A `Clone` implementation would interfere with the widespread
/// use of `r.borrow().clone()` to clone the contents of a `RefCell`.
-#[unstable = "likely to be moved to a method, pending language changes"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be moved to a method, pending language changes")]
pub fn clone_ref<'b, T:Clone>(orig: &Ref<'b, T>) -> Ref<'b, T> {
Ref {
_value: orig._value,
}
/// Wraps a mutable borrowed reference to a value in a `RefCell` box.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RefMut<'b, T:'b> {
// FIXME #12808: strange name to try to avoid interfering with
// field accesses of the contained type via Deref
_borrow: BorrowRefMut<'b>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'b, T> Deref for RefMut<'b, T> {
type Target = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'b, T> DerefMut for RefMut<'b, T> {
#[inline]
fn deref_mut<'a>(&'a mut self) -> &'a mut T {
/// is not recommended to access its fields directly, `get` should be used
/// instead.
#[lang="unsafe"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct UnsafeCell<T> {
/// Wrapped value
///
/// This field should not be accessed directly, it is made public for static
/// initializers.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub value: T,
}
///
/// All access to the inner value through methods is `unsafe`, and it is
/// highly discouraged to access the fields directly.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(value: T) -> UnsafeCell<T> {
UnsafeCell { value: value }
}
/// Gets a mutable pointer to the wrapped value.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get(&self) -> *mut T { &self.value as *const T as *mut T }
/// Unwraps the value
/// This function is unsafe because there is no guarantee that this or other
/// tasks are currently inspecting the inner value.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn into_inner(self) -> T { self.value }
}
*/
/// The highest valid code point
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MAX: char = '\u{10ffff}';
/// Converts from `u32` to a `char`
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn from_u32(i: u32) -> Option<char> {
// catch out-of-bounds and surrogates
if (i > MAX as u32) || (i >= 0xD800 && i <= 0xDFFF) {
/// Panics if given an `radix` > 36.
///
#[inline]
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub fn from_digit(num: uint, radix: uint) -> Option<char> {
if radix > 36 {
panic!("from_digit: radix is too high (maximum 36)");
}
/// Basic `char` manipulations.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait CharExt {
/// Checks if a `char` parses as a numeric digit in the given radix.
///
/// # Panics
///
/// Panics if given a radix > 36.
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn is_digit(self, radix: uint) -> bool;
/// Converts a character to the corresponding digit.
/// # Panics
///
/// Panics if given a radix outside the range [0..36].
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn to_digit(self, radix: uint) -> Option<uint>;
/// Returns an iterator that yields the hexadecimal Unicode escape
/// All characters are escaped with Rust syntax of the form `\\u{NNNN}`
/// where `NNNN` is the shortest hexadecimal representation of the code
/// point.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_unicode(self) -> EscapeUnicode;
/// Returns an iterator that yields the 'default' ASCII and
/// escaped.
/// * Any other chars in the range [0x20,0x7e] are not escaped.
/// * Any other chars are given hex Unicode escapes; see `escape_unicode`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_default(self) -> EscapeDefault;
/// Returns the amount of bytes this character would need if encoded in
/// UTF-8.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf8(self) -> uint;
/// Returns the amount of bytes this character would need if encoded in
/// UTF-16.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf16(self) -> uint;
/// Encodes this character as UTF-8 into the provided byte buffer,
///
/// If the buffer is not large enough, nothing will be written into it
/// and a `None` will be returned.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint>;
/// Encodes this character as UTF-16 into the provided `u16` buffer,
///
/// If the buffer is not large enough, nothing will be written into it
/// and a `None` will be returned.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint>;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl CharExt for char {
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn is_digit(self, radix: uint) -> bool {
self.to_digit(radix).is_some()
}
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn to_digit(self, radix: uint) -> Option<uint> {
if radix > 36 {
panic!("to_digit: radix is too high (maximum 36)");
else { None }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_unicode(self) -> EscapeUnicode {
EscapeUnicode { c: self, state: EscapeUnicodeState::Backslash }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_default(self) -> EscapeDefault {
let init_state = match self {
'\t' => EscapeDefaultState::Backslash('t'),
}
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf8(self) -> uint {
let code = self as u32;
match () {
}
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf16(self) -> uint {
let ch = self as u32;
if (ch & 0xFFFF_u32) == ch { 1 } else { 2 }
}
#[inline]
- #[unstable = "pending decision about Iterator/Writer/Reader"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending decision about Iterator/Writer/Reader")]
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint> {
// Marked #[inline] to allow llvm optimizing it away
let code = self as u32;
}
#[inline]
- #[unstable = "pending decision about Iterator/Writer/Reader"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending decision about Iterator/Writer/Reader")]
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint> {
// Marked #[inline] to allow llvm optimizing it away
let mut ch = self as u32;
/// An iterator over the characters that represent a `char`, as escaped by
/// Rust's unicode escaping rules.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct EscapeUnicode {
c: char,
state: EscapeUnicodeState
}
#[derive(Clone)]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
enum EscapeUnicodeState {
Backslash,
Type,
Done,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Iterator for EscapeUnicode {
type Item = char;
/// An iterator over the characters that represent a `char`, escaped
/// for maximum portability.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct EscapeDefault {
state: EscapeDefaultState
}
#[derive(Clone)]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
enum EscapeDefaultState {
Backslash(char),
Char(char),
Unicode(EscapeUnicode),
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Iterator for EscapeDefault {
type Item = char;
//! explicitly, by convention implementing the `Clone` trait and calling
//! the `clone` method.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use marker::Sized;
/// A common trait for cloning an object.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Clone : Sized {
/// Returns a copy of the value.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn clone(&self) -> Self;
/// Perform copy-assignment from `source`.
/// but can be overridden to reuse the resources of `a` to avoid unnecessary
/// allocations.
#[inline(always)]
- #[unstable = "this function is rarely used"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this function is rarely used")]
fn clone_from(&mut self, source: &Self) {
*self = source.clone()
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: ?Sized> Clone for &'a T {
/// Return a shallow copy of the reference.
#[inline]
macro_rules! clone_impl {
($t:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Clone for $t {
/// Return a deep copy of the value.
#[inline]
macro_rules! extern_fn_clone {
($($A:ident),*) => (
- #[unstable = "this may not be sufficient for fns with region parameters"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this may not be sufficient for fns with region parameters")]
impl<$($A,)* ReturnType> Clone for extern "Rust" fn($($A),*) -> ReturnType {
/// Return a copy of a function pointer
#[inline]
//! assert!(SketchyNum {num: 25} != SketchyNum {num: 57});
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use self::Ordering::*;
/// the rule that `eq` is a strict inverse of `ne`; that is, `!(a == b)` if and
/// only if `a != b`.
#[lang="eq"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[old_orphan_check]
pub trait PartialEq<Rhs: ?Sized = Self> {
/// This method tests for `self` and `other` values to be equal, and is used by `==`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn eq(&self, other: &Rhs) -> bool;
/// This method tests for `!=`.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn ne(&self, other: &Rhs) -> bool { !self.eq(other) }
}
/// - reflexive: `a == a`;
/// - symmetric: `a == b` implies `b == a`; and
/// - transitive: `a == b` and `b == c` implies `a == c`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Eq: PartialEq<Self> {
// FIXME #13101: this method is used solely by #[deriving] to
// assert that every component of a type implements #[deriving]
/// An ordering is, e.g, a result of a comparison between two values.
#[derive(Clone, Copy, PartialEq, Show)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub enum Ordering {
/// An ordering where a compared value is less [than another].
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Less = -1i,
/// An ordering where a compared value is equal [to another].
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Equal = 0i,
/// An ordering where a compared value is greater [than another].
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Greater = 1i,
}
/// assert!(data == b);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reverse(self) -> Ordering {
unsafe {
// this compiles really nicely (to a single instruction);
/// true; and
/// - transitive, `a < b` and `b < c` implies `a < c`. The same must hold for
/// both `==` and `>`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Ord: Eq + PartialOrd<Self> {
/// This method returns an ordering between `self` and `other` values.
///
/// assert_eq!(10u.cmp(&5), Greater); // because 10 > 5
/// assert_eq!( 5u.cmp(&5), Equal); // because 5 == 5
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn cmp(&self, other: &Self) -> Ordering;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Eq for Ordering {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Ord for Ordering {
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn cmp(&self, other: &Ordering) -> Ordering {
(*self as int).cmp(&(*other as int))
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialOrd for Ordering {
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn partial_cmp(&self, other: &Ordering) -> Option<Ordering> {
(*self as int).partial_cmp(&(*other as int))
}
/// `NaN < 0 == false` and `NaN >= 0 == false` (cf. IEEE 754-2008 section
/// 5.11).
#[lang="ord"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
/// This method returns an ordering between `self` and `other` values
/// if one exists.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>;
/// This method tests less than (for `self` and `other`) and is used by the `<` operator.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn lt(&self, other: &Rhs) -> bool {
match self.partial_cmp(other) {
Some(Less) => true,
/// This method tests less than or equal to (`<=`).
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn le(&self, other: &Rhs) -> bool {
match self.partial_cmp(other) {
Some(Less) | Some(Equal) => true,
/// This method tests greater than (`>`).
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn gt(&self, other: &Rhs) -> bool {
match self.partial_cmp(other) {
Some(Greater) => true,
/// This method tests greater than or equal to (`>=`).
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn ge(&self, other: &Rhs) -> bool {
match self.partial_cmp(other) {
Some(Greater) | Some(Equal) => true,
/// Compare and return the minimum of two values.
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn min<T: Ord>(v1: T, v2: T) -> T {
if v1 < v2 { v1 } else { v2 }
}
/// Compare and return the maximum of two values.
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn max<T: Ord>(v1: T, v2: T) -> T {
if v1 > v2 { v1 } else { v2 }
}
///
/// Returns the first argument if the comparison determines them to be equal.
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn partial_min<T: PartialOrd>(v1: T, v2: T) -> Option<T> {
match v1.partial_cmp(&v2) {
Some(Less) | Some(Equal) => Some(v1),
///
/// Returns the first argument if the comparison determines them to be equal.
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn partial_max<T: PartialOrd>(v1: T, v2: T) -> Option<T> {
match v1.partial_cmp(&v2) {
Some(Less) => Some(v2),
macro_rules! partial_eq_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialEq for $t {
#[inline]
fn eq(&self, other: &$t) -> bool { (*self) == (*other) }
)*)
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialEq for () {
#[inline]
fn eq(&self, _other: &()) -> bool { true }
macro_rules! eq_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Eq for $t {}
)*)
}
macro_rules! partial_ord_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialOrd for $t {
#[inline]
fn partial_cmp(&self, other: &$t) -> Option<Ordering> {
)*)
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialOrd for () {
#[inline]
fn partial_cmp(&self, _: &()) -> Option<Ordering> {
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialOrd for bool {
#[inline]
fn partial_cmp(&self, other: &bool) -> Option<Ordering> {
macro_rules! ord_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Ord for $t {
#[inline]
fn cmp(&self, other: &$t) -> Ordering {
)*)
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Ord for () {
#[inline]
fn cmp(&self, _other: &()) -> Ordering { Equal }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Ord for bool {
#[inline]
fn cmp(&self, other: &bool) -> Ordering {
// & pointers
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, A: ?Sized, B: ?Sized> PartialEq<&'b B> for &'a A where A: PartialEq<B> {
#[inline]
fn eq(&self, other: & &'b B) -> bool { PartialEq::eq(*self, *other) }
#[inline]
fn ne(&self, other: & &'b B) -> bool { PartialEq::ne(*self, *other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, A: ?Sized, B: ?Sized> PartialOrd<&'b B> for &'a A where A: PartialOrd<B> {
#[inline]
fn partial_cmp(&self, other: &&'b B) -> Option<Ordering> {
#[inline]
fn gt(&self, other: & &'b B) -> bool { PartialOrd::gt(*self, *other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A: ?Sized> Ord for &'a A where A: Ord {
#[inline]
fn cmp(&self, other: & &'a A) -> Ordering { Ord::cmp(*self, *other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A: ?Sized> Eq for &'a A where A: Eq {}
// &mut pointers
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, A: ?Sized, B: ?Sized> PartialEq<&'b mut B> for &'a mut A where A: PartialEq<B> {
#[inline]
fn eq(&self, other: &&'b mut B) -> bool { PartialEq::eq(*self, *other) }
#[inline]
fn ne(&self, other: &&'b mut B) -> bool { PartialEq::ne(*self, *other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, A: ?Sized, B: ?Sized> PartialOrd<&'b mut B> for &'a mut A where A: PartialOrd<B> {
#[inline]
fn partial_cmp(&self, other: &&'b mut B) -> Option<Ordering> {
#[inline]
fn gt(&self, other: &&'b mut B) -> bool { PartialOrd::gt(*self, *other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A: ?Sized> Ord for &'a mut A where A: Ord {
#[inline]
fn cmp(&self, other: &&'a mut A) -> Ordering { Ord::cmp(*self, *other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A: ?Sized> Eq for &'a mut A where A: Eq {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, A: ?Sized, B: ?Sized> PartialEq<&'b mut B> for &'a A where A: PartialEq<B> {
#[inline]
fn eq(&self, other: &&'b mut B) -> bool { PartialEq::eq(*self, *other) }
fn ne(&self, other: &&'b mut B) -> bool { PartialEq::ne(*self, *other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, A: ?Sized, B: ?Sized> PartialEq<&'b B> for &'a mut A where A: PartialEq<B> {
#[inline]
fn eq(&self, other: &&'b B) -> bool { PartialEq::eq(*self, *other) }
//! }
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
/// A trait that types which have a useful default value should implement.
///
/// bar: f32,
/// }
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Default {
/// Returns the "default value" for a type.
///
/// fn default() -> Kind { Kind::A }
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Self;
}
macro_rules! default_impl {
($t:ty, $v:expr) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Default for $t {
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> $t { $v }
}
}
//! })
//! ```
-#![deprecated = "It is unclear if this module is more robust than implementing \
- Drop on a custom type, and this module is being removed with no \
- replacement. Use a custom Drop implementation to regain existing \
- functionality."]
+#![deprecated(feature = "unnamed_feature", since = "1.0.0",
+ reason = "It is unclear if this module is more robust than implementing \
+ Drop on a custom type, and this module is being removed with no \
+ replacement. Use a custom Drop implementation to regain existing \
+ functionality.")]
#![allow(deprecated)]
use ops::{Drop, FnMut, FnOnce};
//! Utilities for formatting and printing strings
#![allow(unused_variables)]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use any;
use cell::{Cell, RefCell, Ref, RefMut};
mod float;
pub mod rt;
-#[unstable = "core and I/O reconciliation may alter this definition"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "core and I/O reconciliation may alter this definition")]
/// The type returned by formatter methods.
pub type Result = result::Result<(), Error>;
/// This type does not support transmission of an error other than that an error
/// occurred. Any extra information must be arranged to be transmitted through
/// some other means.
-#[unstable = "core and I/O reconciliation may alter this definition"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "core and I/O reconciliation may alter this definition")]
#[derive(Copy)]
pub struct Error;
/// This trait should generally not be implemented by consumers of the standard
/// library. The `write!` macro accepts an instance of `io::Writer`, and the
/// `io::Writer` trait is favored over implementing this trait.
-#[unstable = "waiting for core and I/O reconciliation"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting for core and I/O reconciliation")]
pub trait Writer {
/// Writes a slice of bytes into this writer, returning whether the write
/// succeeded.
/// 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
/// traits.
-#[unstable = "name may change and implemented traits are also unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "name may change and implemented traits are also unstable")]
pub struct Formatter<'a> {
flags: uint,
fill: char,
/// family of functions. It contains a function to format the given value. At
/// 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.
-#[unstable = "implementation detail of the `format_args!` macro"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "implementation detail of the `format_args!` macro")]
#[derive(Copy)]
pub struct Argument<'a> {
value: &'a Void,
/// When using the format_args!() macro, this function is used to generate the
/// Arguments structure.
#[doc(hidden)] #[inline]
- #[unstable = "implementation detail of the `format_args!` macro"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "implementation detail of the `format_args!` macro")]
pub fn new(pieces: &'a [&'a str],
args: &'a [Argument<'a>]) -> Arguments<'a> {
Arguments {
/// created with `argumentuint`. However, failing to do so doesn't cause
/// unsafety, but will ignore invalid .
#[doc(hidden)] #[inline]
- #[unstable = "implementation detail of the `format_args!` macro"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "implementation detail of the `format_args!` macro")]
pub fn with_placeholders(pieces: &'a [&'a str],
fmt: &'a [rt::Argument],
args: &'a [Argument<'a>]) -> Arguments<'a> {
/// and pass it to a function or closure, passed as the first argument. The
/// macro validates the format string at compile-time so usage of the `write`
/// and `format` functions can be safely performed.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[derive(Copy)]
pub struct Arguments<'a> {
// Format string pieces to print.
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> String for Arguments<'a> {
fn fmt(&self, fmt: &mut Formatter) -> Result {
write(fmt.buf, *self)
/// Format trait for the `:?` format. Useful for debugging, most all types
/// should implement this.
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait Show {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
/// When a value can be semantically expressed as a String, this trait may be
/// used. It corresponds to the default format, `{}`.
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait String {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
/// Format trait for the `o` character
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait Octal {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
/// Format trait for the `b` character
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait Binary {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
/// Format trait for the `x` character
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait LowerHex {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
/// Format trait for the `X` character
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait UpperHex {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
/// Format trait for the `p` character
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait Pointer {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
/// Format trait for the `e` character
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait LowerExp {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
/// Format trait for the `E` character
-#[unstable = "I/O and core have yet to be reconciled"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "I/O and core have yet to be reconciled")]
pub trait UpperExp {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
///
/// * output - the buffer to write output to
/// * args - the precompiled arguments generated by `format_args!`
-#[unstable = "libcore and I/O have yet to be reconciled, and this is an \
- implementation detail which should not otherwise be exported"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "libcore and I/O have yet to be reconciled, and this is an \
+ implementation detail which should not otherwise be exported")]
pub fn write(output: &mut Writer, args: Arguments) -> Result {
let mut formatter = Formatter {
flags: 0,
///
/// This function will correctly account for the flags provided as well as
/// the minimum width. It will not take precision into account.
- #[unstable = "definition may change slightly over time"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "definition may change slightly over time")]
pub fn pad_integral(&mut self,
is_positive: bool,
prefix: &str,
/// is longer than this length
///
/// Notably this function ignored the `flag` parameters
- #[unstable = "definition may change slightly over time"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "definition may change slightly over time")]
pub fn pad(&mut self, s: &str) -> Result {
// Make sure there's a fast path up front
if self.width.is_none() && self.precision.is_none() {
/// Writes some data to the underlying buffer contained within this
/// formatter.
- #[unstable = "reconciling core and I/O may alter this definition"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "reconciling core and I/O may alter this definition")]
pub fn write_str(&mut self, data: &str) -> Result {
self.buf.write_str(data)
}
/// Writes some formatted information into this instance
- #[unstable = "reconciling core and I/O may alter this definition"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "reconciling core and I/O may alter this definition")]
pub fn write_fmt(&mut self, fmt: Arguments) -> Result {
write(self.buf, fmt)
}
/// Flags for formatting (packed version of rt::Flag)
- #[unstable = "return type may change and method was just created"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "return type may change and method was just created")]
pub fn flags(&self) -> uint { self.flags }
/// Character used as 'fill' whenever there is alignment
- #[unstable = "method was just created"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "method was just created")]
pub fn fill(&self) -> char { self.fill }
/// Flag indicating what form of alignment was requested
- #[unstable = "method was just created"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "method was just created")]
pub fn align(&self) -> rt::Alignment { self.align }
/// Optionally specified integer width that the output should be
- #[unstable = "method was just created"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "method was just created")]
pub fn width(&self) -> Option<uint> { self.width }
/// Optionally specified precision for numeric types
- #[unstable = "method was just created"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "method was just created")]
pub fn precision(&self) -> Option<uint> { self.precision }
}
/// This is a function which calls are emitted to by the compiler itself to
/// create the Argument structures that are passed into the `format` function.
#[doc(hidden)] #[inline]
-#[unstable = "implementation detail of the `format_args!` macro"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "implementation detail of the `format_args!` macro")]
pub fn argument<'a, T>(f: fn(&T, &mut Formatter) -> Result,
t: &'a T) -> Argument<'a> {
Argument::new(t, f)
/// When the compiler determines that the type of an argument *must* be a uint
/// (such as for width and precision), then it invokes this method.
#[doc(hidden)] #[inline]
-#[unstable = "implementation detail of the `format_args!` macro"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "implementation detail of the `format_args!` macro")]
pub fn argumentuint<'a>(s: &'a uint) -> Argument<'a> {
Argument::from_uint(s)
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl String for bool {
fn fmt(&self, f: &mut Formatter) -> Result {
String::fmt(if *self { "true" } else { "false" }, f)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl String for str {
fn fmt(&self, f: &mut Formatter) -> Result {
f.pad(self)
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl String for char {
fn fmt(&self, f: &mut Formatter) -> Result {
let mut utf8 = [0u8; 4];
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl String for $ty {
fn fmt(&self, fmt: &mut Formatter) -> Result {
use num::Float;
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<T: Show> Show for RefCell<T> {
fn fmt(&self, f: &mut Formatter) -> Result {
match self.try_borrow() {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl String for Utf8Error {
fn fmt(&self, f: &mut Formatter) -> Result {
match *self {
/// A radix with in the range of `2..36`.
#[derive(Clone, Copy, PartialEq)]
-#[unstable = "may be renamed or move to a different module"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be renamed or move to a different module")]
pub struct Radix {
base: u8,
}
}
/// A helper type for formatting radixes.
-#[unstable = "may be renamed or move to a different module"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be renamed or move to a different module")]
#[derive(Copy)]
pub struct RadixFmt<T, R>(T, R);
/// use std::fmt::radix;
/// assert_eq!(format!("{}", radix(55i, 36)), "1j".to_string());
/// ```
-#[unstable = "may be renamed or move to a different module"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be renamed or move to a different module")]
pub fn radix<T>(x: T, base: u8) -> RadixFmt<T, Radix> {
RadixFmt(x, Radix::new(base))
}
//! These definitions are similar to their `ct` equivalents, but differ in that
//! these can be statically allocated and are slightly optimized for the runtime
-#![unstable = "implementation detail of the `format_args!` macro"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "implementation detail of the `format_args!` macro")]
pub use self::Alignment::*;
pub use self::Count::*;
//! assert_eq!(hash::<_, SipHasher>(&person1), hash::<_, SipHasher>(&person2));
//! ```
-#![unstable = "module was recently redesigned"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "module was recently redesigned")]
use prelude::*;
}
/// Returns the computed hash.
- #[deprecated = "renamed to finish"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "renamed to finish")]
pub fn result(&self) -> u64 { self.finish() }
}
//! guaranteed to happen in order. This is the standard mode for working
//! with atomic types and is equivalent to Java's `volatile`.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![allow(missing_docs)]
use marker::Sized;
///
/// `forget` is unsafe because the caller is responsible for
/// ensuring the argument is deallocated already.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn forget<T>(_: T) -> ();
/// Unsafely transforms a value of one type into a value of another type.
/// let v: &[u8] = unsafe { mem::transmute("L") };
/// assert!(v == [76u8]);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn transmute<T,U>(e: T) -> U;
/// Gives the address for the return value of the enclosing function.
/// }
/// }
/// ```
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: uint);
/// Copies `count * size_of<T>` bytes from `src` to `dst`. The source
/// }
/// ```
///
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn copy_memory<T>(dst: *mut T, src: *const T, count: uint);
/// Invokes memset on the specified pointer, setting `count * size_of::<T>()`
/// bytes of memory starting at `dst` to `c`.
- #[unstable = "uncertain about naming and semantics"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain about naming and semantics")]
pub fn set_memory<T>(dst: *mut T, val: u8, count: uint);
/// Equivalent to the appropriate `llvm.memcpy.p0i8.0i8.*` intrinsic, with
//!
//! This `for` loop syntax can be applied to any iterator over any type.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use self::MinMaxResult::*;
/// it wishes, either by returning `None` infinitely, or by doing something
/// else.
#[lang="iterator"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Iterator {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Item;
/// Advance the iterator and return the next value. Return `None` when the end is reached.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn next(&mut self) -> Option<Self::Item>;
/// Returns a lower and upper bound on the remaining length of the iterator.
/// An upper bound of `None` means either there is no known upper bound, or the upper bound
/// does not fit within a `uint`.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn size_hint(&self) -> (uint, Option<uint>) { (0, None) }
}
/// Conversion from an `Iterator`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[rustc_on_unimplemented="a collection of type `{Self}` cannot be \
built from an iterator over elements of type `{A}`"]
pub trait FromIterator<A> {
}
/// A type growable from an `Iterator` implementation
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Extend<A> {
/// Extend a container with the elements yielded by an arbitrary iterator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn extend<T: Iterator<Item=A>>(&mut self, iterator: T);
}
/// An extension trait providing numerous methods applicable to all iterators.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait IteratorExt: Iterator + Sized {
/// Counts the number of elements in this iterator.
///
/// assert!(it.count() == 5);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn count(self) -> uint {
self.fold(0, |cnt, _x| cnt + 1)
}
/// assert!(a.iter().last().unwrap() == &5);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn last(mut self) -> Option<Self::Item> {
let mut last = None;
for x in self { last = Some(x); }
/// assert!(it.nth(2) == None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn nth(&mut self, mut n: uint) -> Option<Self::Item> {
for x in *self {
if n == 0 { return Some(x) }
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn chain<U>(self, other: U) -> Chain<Self, U> where
U: Iterator<Item=Self::Item>,
{
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn zip<B, U>(self, other: U) -> Zip<Self, U> where
U: Iterator<Item=B>,
{
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn map<B, F>(self, f: F) -> Map<Self::Item, B, Self, F> where
F: FnMut(Self::Item) -> B,
{
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn filter<P>(self, predicate: P) -> Filter<Self::Item, Self, P> where
P: FnMut(&Self::Item) -> bool,
{
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn filter_map<B, F>(self, f: F) -> FilterMap<Self::Item, B, Self, F> where
F: FnMut(Self::Item) -> Option<B>,
{
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn enumerate(self) -> Enumerate<Self> {
Enumerate{iter: self, count: 0}
}
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn peekable(self) -> Peekable<Self::Item, Self> {
Peekable{iter: self, peeked: None}
}
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self::Item, Self, P> where
P: FnMut(&Self::Item) -> bool,
{
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn take_while<P>(self, predicate: P) -> TakeWhile<Self::Item, Self, P> where
P: FnMut(&Self::Item) -> bool,
{
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn skip(self, n: uint) -> Skip<Self> {
Skip{iter: self, n: n}
}
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn take(self, n: uint) -> Take<Self> {
Take{iter: self, n: n}
}
/// assert!(it.next().is_none());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn scan<St, B, F>(
self,
initial_state: St,
/// }
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn flat_map<B, U, F>(self, f: F) -> FlatMap<Self::Item, B, Self, U, F> where
U: Iterator<Item=B>,
F: FnMut(Self::Item) -> U,
/// assert_eq!(process(x.into_iter()), 1006);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn fuse(self) -> Fuse<Self> {
Fuse{iter: self, done: false}
}
/// println!("{}", sum);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn inspect<F>(self, f: F) -> Inspect<Self::Item, Self, F> where
F: FnMut(&Self::Item),
{
/// // xs.next() is now `5`
/// assert!(xs.next() == Some(5));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn by_ref<'r>(&'r mut self) -> ByRef<'r, Self> {
ByRef{iter: self}
}
/// assert!(a.as_slice() == b.as_slice());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn collect<B: FromIterator<Self::Item>>(self) -> B {
FromIterator::from_iter(self)
}
/// assert_eq!(even, vec![2, 4]);
/// assert_eq!(odd, vec![1, 3]);
/// ```
- #[unstable = "recently added as part of collections reform"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added as part of collections reform")]
fn partition<B, F>(mut self, mut f: F) -> (B, B) where
B: Default + Extend<Self::Item>,
F: FnMut(&Self::Item) -> bool
/// assert!(a.iter().fold(0, |a, &b| a + b) == 15);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn fold<B, F>(mut self, init: B, mut f: F) -> B where
F: FnMut(B, Self::Item) -> B,
{
/// assert!(!a.iter().all(|x| *x > 2));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn all<F>(mut self, mut f: F) -> bool where F: FnMut(Self::Item) -> bool {
for x in self { if !f(x) { return false; } }
true
/// assert!(!it.any(|x| *x == 3));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn any<F>(&mut self, mut f: F) -> bool where F: FnMut(Self::Item) -> bool {
for x in *self { if f(x) { return true; } }
false
///
/// Does not consume the iterator past the first found element.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn find<P>(&mut self, mut predicate: P) -> Option<Self::Item> where
P: FnMut(&Self::Item) -> bool,
{
/// Return the index of the first element satisfying the specified predicate
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn position<P>(&mut self, mut predicate: P) -> Option<uint> where
P: FnMut(Self::Item) -> bool,
{
///
/// If no element matches, None is returned.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn rposition<P>(&mut self, mut predicate: P) -> Option<uint> where
P: FnMut(Self::Item) -> bool,
Self: ExactSizeIterator + DoubleEndedIterator
/// assert!(a.iter().max().unwrap() == &5);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn max(self) -> Option<Self::Item> where Self::Item: Ord
{
self.fold(None, |max, x| {
/// assert!(a.iter().min().unwrap() == &1);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn min(self) -> Option<Self::Item> where Self::Item: Ord
{
self.fold(None, |min, x| {
/// let v = [1i, 1, 1, 1];
/// assert!(v.iter().min_max() == MinMax(&1, &1));
/// ```
- #[unstable = "return type may change"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "return type may change")]
fn min_max(mut self) -> MinMaxResult<Self::Item> where Self::Item: Ord
{
let (mut min, mut max) = match self.next() {
/// assert_eq!(*xs.iter().max_by(|x| x.abs()).unwrap(), -10);
/// ```
#[inline]
- #[unstable = "may want to produce an Ordering directly; see #15311"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may want to produce an Ordering directly; see #15311")]
fn max_by<B: Ord, F>(self, mut f: F) -> Option<Self::Item> where
F: FnMut(&Self::Item) -> B,
{
/// assert_eq!(*xs.iter().min_by(|x| x.abs()).unwrap(), 0);
/// ```
#[inline]
- #[unstable = "may want to produce an Ordering directly; see #15311"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may want to produce an Ordering directly; see #15311")]
fn min_by<B: Ord, F>(self, mut f: F) -> Option<Self::Item> where
F: FnMut(&Self::Item) -> B,
{
/// Note: Random access with flipped indices still only applies to the first
/// `uint::MAX` elements of the original iterator.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn rev(self) -> Rev<Self> {
Rev{iter: self}
}
///
/// Loops through the entire iterator, collecting the first component of
/// each item into one new container, and the second component into another.
- #[unstable = "recent addition"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recent addition")]
fn unzip<A, B, FromA, FromB>(mut self) -> (FromA, FromB) where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
/// Creates an iterator that clones the elements it yields. Useful for converting an
/// Iterator<&T> to an Iterator<T>.
- #[unstable = "recent addition"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recent addition")]
fn cloned<T, D>(self) -> Cloned<Self> where
Self: Iterator<Item=D>,
D: Deref<Target=T>,
/// assert_eq!(cy.next(), Some(1));
/// assert_eq!(cy.next(), Some(1));
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn cycle(self) -> Cycle<Self> where Self: Clone {
Cycle{orig: self.clone(), iter: self}
}
/// Use an iterator to reverse a container in place.
- #[unstable = "uncertain about placement or widespread use"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain about placement or widespread use")]
fn reverse_in_place<'a, T: 'a>(&mut self) where
Self: Iterator<Item=&'a mut T> + DoubleEndedIterator
{
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> IteratorExt for I where I: Iterator {}
/// A range iterator able to yield elements from both ends
///
/// A `DoubleEndedIterator` can be thought of as a deque in that `next()` and `next_back()` exhaust
/// elements from the *same* range, and do not work independently of each other.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait DoubleEndedIterator: Iterator {
/// Yield an element from the end of the range, returning `None` if the range is empty.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn next_back(&mut self) -> Option<Self::Item>;
}
/// Calling `next()` or `next_back()` on a `RandomAccessIterator`
/// reduces the indexable range accordingly. That is, `it.idx(1)` will become `it.idx(0)`
/// after `it.next()` is called.
-#[unstable = "not widely used, may be better decomposed into Index and ExactSizeIterator"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "not widely used, may be better decomposed into Index and ExactSizeIterator")]
pub trait RandomAccessIterator: Iterator {
/// Return the number of indexable elements. At most `std::uint::MAX`
/// elements are indexable, even if the iterator represents a longer range.
///
/// `Iterator::size_hint` *must* return the exact size of the iterator.
/// Note that the size must fit in `uint`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait ExactSizeIterator: Iterator {
#[inline]
/// Return the exact length of the iterator.
// All adaptors that preserve the size of the wrapped iterator are fine
// Adaptors that may overflow in `size_hint` are not, i.e. `Chain`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> ExactSizeIterator for Enumerate<I> where I: ExactSizeIterator {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, F> ExactSizeIterator for Inspect<A, I, F> where
I: ExactSizeIterator<Item=A>,
F: FnMut(&A),
{}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> ExactSizeIterator for Rev<I> where I: ExactSizeIterator + DoubleEndedIterator {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, F> ExactSizeIterator for Map<A, B, I, F> where
I: ExactSizeIterator<Item=A>,
F: FnMut(A) -> B,
{}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B> ExactSizeIterator for Zip<A, B> where A: ExactSizeIterator, B: ExactSizeIterator {}
/// An double-ended iterator with the direction inverted
#[derive(Clone)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Rev<T> {
iter: T
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> Iterator for Rev<I> where I: DoubleEndedIterator {
type Item = <I as Iterator>::Item;
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> DoubleEndedIterator for Rev<I> where I: DoubleEndedIterator {
#[inline]
fn next_back(&mut self) -> Option<<I as Iterator>::Item> { self.iter.next() }
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<I> RandomAccessIterator for Rev<I> where I: DoubleEndedIterator + RandomAccessIterator {
#[inline]
fn indexable(&self) -> uint { self.iter.indexable() }
/// A mutable reference to an iterator
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct ByRef<'a, I:'a> {
iter: &'a mut I,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, I> Iterator for ByRef<'a, I> where I: 'a + Iterator {
type Item = <I as Iterator>::Item;
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, I> DoubleEndedIterator for ByRef<'a, I> where I: 'a + DoubleEndedIterator {
#[inline]
fn next_back(&mut self) -> Option<<I as Iterator>::Item> { self.iter.next_back() }
}
/// A trait for iterators over elements which can be added together
-#[unstable = "needs to be re-evaluated as part of numerics reform"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "needs to be re-evaluated as part of numerics reform")]
pub trait AdditiveIterator<A> {
/// Iterates over the entire iterator, summing up all the elements
///
macro_rules! impl_additive {
($A:ty, $init:expr) => {
- #[unstable = "trait is experimental"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<T: Iterator<Item=$A>> AdditiveIterator<$A> for T {
#[inline]
fn sum(self) -> $A {
impl_additive! { f64, 0.0 }
/// A trait for iterators over elements which can be multiplied together.
-#[unstable = "needs to be re-evaluated as part of numerics reform"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "needs to be re-evaluated as part of numerics reform")]
pub trait MultiplicativeIterator<A> {
/// Iterates over the entire iterator, multiplying all the elements
///
macro_rules! impl_multiplicative {
($A:ty, $init:expr) => {
- #[unstable = "trait is experimental"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<T: Iterator<Item=$A>> MultiplicativeIterator<$A> for T {
#[inline]
fn product(self) -> $A {
/// `MinMaxResult` is an enum returned by `min_max`. See `IteratorOrdExt::min_max` for more detail.
#[derive(Clone, PartialEq, Show)]
-#[unstable = "unclear whether such a fine-grained result is widely useful"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unclear whether such a fine-grained result is widely useful")]
pub enum MinMaxResult<T> {
/// Empty iterator
NoElements,
/// let r = MinMax(1i,2i);
/// assert_eq!(r.into_option(), Some((1,2)));
/// ```
- #[unstable = "type is unstable"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "type is unstable")]
pub fn into_option(self) -> Option<(T,T)> {
match self {
NoElements => None,
}
/// An iterator that clones the elements of an underlying iterator
-#[unstable = "recent addition"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recent addition")]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[derive(Clone)]
pub struct Cloned<I> {
it: I,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, D, I> Iterator for Cloned<I> where
T: Clone,
D: Deref<Target=T>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, D, I> DoubleEndedIterator for Cloned<I> where
T: Clone,
D: Deref<Target=T>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, D, I> ExactSizeIterator for Cloned<I> where
T: Clone,
D: Deref<Target=T>,
/// An iterator that repeats endlessly
#[derive(Clone, Copy)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Cycle<I> {
orig: I,
iter: I,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> Iterator for Cycle<I> where I: Clone + Iterator {
type Item = <I as Iterator>::Item;
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<I> RandomAccessIterator for Cycle<I> where
I: Clone + RandomAccessIterator,
{
/// An iterator that strings two iterators together
#[derive(Clone)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Chain<A, B> {
a: A,
b: B,
flag: bool,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, A, B> Iterator for Chain<A, B> where A: Iterator<Item=T>, B: Iterator<Item=T> {
type Item = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, A, B> DoubleEndedIterator for Chain<A, B> where
A: DoubleEndedIterator<Item=T>,
B: DoubleEndedIterator<Item=T>,
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<T, A, B> RandomAccessIterator for Chain<A, B> where
A: RandomAccessIterator<Item=T>,
B: RandomAccessIterator<Item=T>,
/// An iterator that iterates two other iterators simultaneously
#[derive(Clone)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Zip<A, B> {
a: A,
b: B
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, U, A, B> Iterator for Zip<A, B> where
A: Iterator<Item = T>,
B: Iterator<Item = U>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, U, A, B> DoubleEndedIterator for Zip<A, B> where
A: DoubleEndedIterator + ExactSizeIterator<Item=T>,
B: DoubleEndedIterator + ExactSizeIterator<Item=U>,
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<T, U, A, B> RandomAccessIterator for Zip<A, B> where
A: RandomAccessIterator<Item=T>,
B: RandomAccessIterator<Item=U>,
/// An iterator that maps the values of `iter` with `f`
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Map<A, B, I: Iterator<Item=A>, F: FnMut(A) -> B> {
iter: I,
f: F,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, F> Clone for Map<A, B, I, F> where
I: Clone + Iterator<Item=A>,
F: Clone + FnMut(A) -> B,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, F> Iterator for Map<A, B, I, F> where I: Iterator<Item=A>, F: FnMut(A) -> B {
type Item = B;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, F> DoubleEndedIterator for Map<A, B, I, F> where
I: DoubleEndedIterator<Item=A>,
F: FnMut(A) -> B,
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<A, B, I, F> RandomAccessIterator for Map<A, B, I, F> where
I: RandomAccessIterator<Item=A>,
F: FnMut(A) -> B,
/// An iterator that filters the elements of `iter` with `predicate`
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Filter<A, I, P> where I: Iterator<Item=A>, P: FnMut(&A) -> bool {
iter: I,
predicate: P,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, P> Clone for Filter<A, I, P> where
I: Clone + Iterator<Item=A>,
P: Clone + FnMut(&A) -> bool,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, P> Iterator for Filter<A, I, P> where I: Iterator<Item=A>, P: FnMut(&A) -> bool {
type Item = A;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, P> DoubleEndedIterator for Filter<A, I, P> where
I: DoubleEndedIterator<Item=A>,
P: FnMut(&A) -> bool,
/// An iterator that uses `f` to both filter and map elements from `iter`
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct FilterMap<A, B, I, F> where I: Iterator<Item=A>, F: FnMut(A) -> Option<B> {
iter: I,
f: F,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, F> Clone for FilterMap<A, B, I, F> where
I: Clone + Iterator<Item=A>,
F: Clone + FnMut(A) -> Option<B>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, F> Iterator for FilterMap<A, B, I, F> where
I: Iterator<Item=A>,
F: FnMut(A) -> Option<B>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, F> DoubleEndedIterator for FilterMap<A, B, I, F> where
I: DoubleEndedIterator<Item=A>,
F: FnMut(A) -> Option<B>,
/// An iterator that yields the current count and the element during iteration
#[derive(Clone)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Enumerate<I> {
iter: I,
count: uint
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> Iterator for Enumerate<I> where I: Iterator {
type Item = (uint, <I as Iterator>::Item);
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> DoubleEndedIterator for Enumerate<I> where
I: ExactSizeIterator + DoubleEndedIterator
{
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<I> RandomAccessIterator for Enumerate<I> where I: RandomAccessIterator {
#[inline]
fn indexable(&self) -> uint {
/// An iterator with a `peek()` that returns an optional reference to the next element.
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[derive(Copy)]
pub struct Peekable<T, I> where I: Iterator<Item=T> {
iter: I,
peeked: Option<T>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, I> Iterator for Peekable<T, I> where I: Iterator<Item=T> {
type Item = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, I> Peekable<T, I> where I: Iterator<Item=T> {
/// Return a reference to the next element of the iterator with out advancing it,
/// or None if the iterator is exhausted.
/// An iterator that rejects elements while `predicate` is true
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SkipWhile<A, I, P> where I: Iterator<Item=A>, P: FnMut(&A) -> bool {
iter: I,
flag: bool,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, P> Clone for SkipWhile<A, I, P> where
I: Clone + Iterator<Item=A>,
P: Clone + FnMut(&A) -> bool,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, P> Iterator for SkipWhile<A, I, P> where I: Iterator<Item=A>, P: FnMut(&A) -> bool {
type Item = A;
/// An iterator that only accepts elements while `predicate` is true
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct TakeWhile<A, I, P> where I: Iterator<Item=A>, P: FnMut(&A) -> bool {
iter: I,
flag: bool,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, P> Clone for TakeWhile<A, I, P> where
I: Clone + Iterator<Item=A>,
P: Clone + FnMut(&A) -> bool,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, P> Iterator for TakeWhile<A, I, P> where I: Iterator<Item=A>, P: FnMut(&A) -> bool {
type Item = A;
/// An iterator that skips over `n` elements of `iter`.
#[derive(Clone)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Skip<I> {
iter: I,
n: uint
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> Iterator for Skip<I> where I: Iterator {
type Item = <I as Iterator>::Item;
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<I> RandomAccessIterator for Skip<I> where I: RandomAccessIterator{
#[inline]
fn indexable(&self) -> uint {
/// An iterator that only iterates over the first `n` iterations of `iter`.
#[derive(Clone)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Take<I> {
iter: I,
n: uint
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> Iterator for Take<I> where I: Iterator{
type Item = <I as Iterator>::Item;
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<I> RandomAccessIterator for Take<I> where I: RandomAccessIterator{
#[inline]
fn indexable(&self) -> uint {
/// An iterator to maintain state while iterating another iterator
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Scan<A, B, I, St, F> where I: Iterator, F: FnMut(&mut St, A) -> Option<B> {
iter: I,
f: F,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, St, F> Clone for Scan<A, B, I, St, F> where
I: Clone + Iterator<Item=A>,
St: Clone,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, St, F> Iterator for Scan<A, B, I, St, F> where
I: Iterator<Item=A>,
F: FnMut(&mut St, A) -> Option<B>,
/// and yields the elements of the produced iterators
///
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct FlatMap<A, B, I, U, F> where
I: Iterator<Item=A>,
U: Iterator<Item=B>,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, U, F> Clone for FlatMap<A, B, I, U, F> where
I: Clone + Iterator<Item=A>,
U: Clone + Iterator<Item=B>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, U, F> Iterator for FlatMap<A, B, I, U, F> where
I: Iterator<Item=A>,
U: Iterator<Item=B>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B, I, U, F> DoubleEndedIterator for FlatMap<A, B, I, U, F> where
I: DoubleEndedIterator<Item=A>,
U: DoubleEndedIterator<Item=B>,
/// yields `None` once.
#[derive(Clone)]
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Fuse<I> {
iter: I,
done: bool
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> Iterator for Fuse<I> where I: Iterator {
type Item = <I as Iterator>::Item;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<I> DoubleEndedIterator for Fuse<I> where I: DoubleEndedIterator {
#[inline]
fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
}
// Allow RandomAccessIterators to be fused without affecting random-access behavior
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<I> RandomAccessIterator for Fuse<I> where I: RandomAccessIterator {
#[inline]
fn indexable(&self) -> uint {
/// Resets the fuse such that the next call to .next() or .next_back() will
/// call the underlying iterator again even if it previously returned None.
#[inline]
- #[unstable = "seems marginal"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "seems marginal")]
pub fn reset_fuse(&mut self) {
self.done = false
}
/// An iterator that calls a function with a reference to each
/// element before yielding it.
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Inspect<A, I, F> where I: Iterator<Item=A>, F: FnMut(&A) {
iter: I,
f: F,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, F> Clone for Inspect<A, I, F> where
I: Clone + Iterator<Item=A>,
F: Clone + FnMut(&A),
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, F> Iterator for Inspect<A, I, F> where I: Iterator<Item=A>, F: FnMut(&A) {
type Item = A;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, I, F> DoubleEndedIterator for Inspect<A, I, F> where
I: DoubleEndedIterator<Item=A>,
F: FnMut(&A),
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<A, I, F> RandomAccessIterator for Inspect<A, I, F> where
I: RandomAccessIterator<Item=A>,
F: FnMut(&A),
/// println!("{}", i);
/// }
/// ```
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct Unfold<A, St, F> where F: FnMut(&mut St) -> Option<A> {
f: F,
/// Internal state that will be passed to the closure on the next iteration
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, St, F> Clone for Unfold<A, St, F> where
F: Clone + FnMut(&mut St) -> Option<A>,
St: Clone,
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<A, St, F> Unfold<A, St, F> where F: FnMut(&mut St) -> Option<A> {
/// Creates a new iterator with the specified closure as the "iterator
/// function" and an initial state to eventually pass to the closure
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, St, F> Iterator for Unfold<A, St, F> where F: FnMut(&mut St) -> Option<A> {
type Item = A;
/// An infinite iterator starting at `start` and advancing by `step` with each
/// iteration
#[derive(Clone, Copy)]
-#[unstable = "may be renamed or replaced by range notation adapaters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be renamed or replaced by range notation adapaters")]
pub struct Counter<A> {
/// The current state the counter is at (next value to be yielded)
state: A,
/// Creates a new counter with the specified start/step
#[inline]
-#[unstable = "may be renamed or replaced by range notation adapaters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be renamed or replaced by range notation adapaters")]
pub fn count<A>(start: A, step: A) -> Counter<A> {
Counter{state: start, step: step}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Add<Output=A> + Clone> Iterator for Counter<A> {
type Item = A;
/// An iterator over the range [start, stop)
#[derive(Clone, Copy)]
-#[unstable = "will be replaced by range notation"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by range notation")]
pub struct Range<A> {
state: A,
stop: A,
/// }
/// ```
#[inline]
-#[unstable = "will be replaced by range notation"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by range notation")]
pub fn range<A: Int>(start: A, stop: A) -> Range<A> {
Range {
state: start,
}
// FIXME: #10414: Unfortunate type bound
-#[unstable = "will be replaced by range notation"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by range notation")]
impl<A: Int + ToPrimitive> Iterator for Range<A> {
type Item = A;
/// `Int` is required to ensure the range will be the same regardless of
/// the direction it is consumed.
-#[unstable = "will be replaced by range notation"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by range notation")]
impl<A: Int + ToPrimitive> DoubleEndedIterator for Range<A> {
#[inline]
fn next_back(&mut self) -> Option<A> {
/// An iterator over the range [start, stop]
#[derive(Clone)]
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
pub struct RangeInclusive<A> {
range: Range<A>,
done: bool,
/// Return an iterator over the range [start, stop]
#[inline]
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
pub fn range_inclusive<A: Int>(start: A, stop: A) -> RangeInclusive<A> {
RangeInclusive {
range: range(start, stop),
}
}
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
impl<A: Int + ToPrimitive> Iterator for RangeInclusive<A> {
type Item = A;
}
}
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
impl<A: Int + ToPrimitive> DoubleEndedIterator for RangeInclusive<A> {
#[inline]
fn next_back(&mut self) -> Option<A> {
/// An iterator over the range [start, stop) by `step`. It handles overflow by stopping.
#[derive(Clone)]
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
pub struct RangeStep<A> {
state: A,
stop: A,
/// Return an iterator over the range [start, stop) by `step`. It handles overflow by stopping.
#[inline]
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
pub fn range_step<A: Int>(start: A, stop: A, step: A) -> RangeStep<A> {
let rev = step < Int::zero();
RangeStep{state: start, stop: stop, step: step, rev: rev}
}
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
impl<A: Int> Iterator for RangeStep<A> {
type Item = A;
/// An iterator over the range [start, stop] by `step`. It handles overflow by stopping.
#[derive(Clone)]
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
pub struct RangeStepInclusive<A> {
state: A,
stop: A,
/// Return an iterator over the range [start, stop] by `step`. It handles overflow by stopping.
#[inline]
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
pub fn range_step_inclusive<A: Int>(start: A, stop: A, step: A) -> RangeStepInclusive<A> {
let rev = step < Int::zero();
RangeStepInclusive {
}
}
-#[unstable = "likely to be replaced by range notation and adapters"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to be replaced by range notation and adapters")]
impl<A: Int> Iterator for RangeStepInclusive<A> {
type Item = A;
/// directions. The `steps_between` function provides a way to
/// compare two Step objects (it could be provided using `step()` and `Ord`,
/// but the implementation would be so inefficient as to be useless).
-#[unstable = "design of range notation/iteration is in flux"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "design of range notation/iteration is in flux")]
pub trait Step: Ord {
/// Change self to the next object.
fn step(&mut self);
macro_rules! step_impl {
($($t:ty)*) => ($(
- #[unstable = "Trait is unstable."]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "Trait is unstable.")]
impl Step for $t {
#[inline]
fn step(&mut self) { *self += 1; }
macro_rules! step_impl_no_between {
($($t:ty)*) => ($(
- #[unstable = "Trait is unstable."]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "Trait is unstable.")]
impl Step for $t {
#[inline]
fn step(&mut self) { *self += 1; }
/// An iterator that repeats an element endlessly
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Repeat<A> {
element: A
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Clone> Iterator for Repeat<A> {
type Item = A;
fn size_hint(&self) -> (uint, Option<uint>) { (uint::MAX, None) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A: Clone> DoubleEndedIterator for Repeat<A> {
#[inline]
fn next_back(&mut self) -> Option<A> { self.idx(0) }
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<A: Clone> RandomAccessIterator for Repeat<A> {
#[inline]
fn indexable(&self) -> uint { uint::MAX }
/// An iterator that repeatedly applies a given function, starting
/// from a given seed value.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub type Iterate<T, F> = Unfold<T, IterateState<T, F>, fn(&mut IterateState<T, F>) -> Option<T>>;
/// Create a new iterator that produces an infinite sequence of
/// repeated applications of the given function `f`.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn iterate<T, F>(seed: T, f: F) -> Iterate<T, F> where
T: Clone,
F: FnMut(T) -> T,
/// Create a new iterator that endlessly repeats the element `elt`.
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn repeat<T: Clone>(elt: T) -> Repeat<T> {
Repeat{element: elt}
}
///
/// If two sequences are equal up until the point where one ends,
/// the shorter sequence compares less.
-#[unstable = "needs review and revision"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "needs review and revision")]
pub mod order {
use cmp;
use cmp::{Eq, Ord, PartialOrd, PartialEq};
// separate crate, libcoretest, to avoid bizarre issues.
#![crate_name = "core"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
/// assert!(a + b == 30, "a = {}, b = {}", a, b);
/// ```
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! assert {
($cond:expr) => (
if !$cond {
/// assert_eq!(a, b);
/// ```
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! assert_eq {
($left:expr , $right:expr) => ({
match (&($left), &($right)) {
/// debug_assert!(a + b == 30, "a = {}, b = {}", a, b);
/// ```
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! debug_assert {
($($arg:tt)*) => (if cfg!(not(ndebug)) { assert!($($arg)*); })
}
/// Equivalent to the `write!` macro, except that a newline is appended after
/// the message is written.
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! writeln {
($dst:expr, $fmt:expr) => (
write!($dst, concat!($fmt, "\n"))
/// }
/// ```
#[macro_export]
-#[unstable = "relationship with panic is unclear"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "relationship with panic is unclear")]
macro_rules! unreachable {
() => ({
panic!("internal error: entered unreachable code")
/// A standardised placeholder for marking unfinished code. It panics with the
/// message `"not yet implemented"` when executed.
#[macro_export]
-#[unstable = "relationship with panic is unclear"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "relationship with panic is unclear")]
macro_rules! unimplemented {
() => (panic!("not yet implemented"))
}
//! implemented using unsafe code. In that case, you may want to embed
//! some of the marker types below into your type.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use clone::Clone;
/// Types able to be transferred across task boundaries.
-#[unstable = "will be overhauled with new lifetime rules; see RFC 458"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be overhauled with new lifetime rules; see RFC 458")]
#[lang="send"]
pub unsafe trait Send: 'static {
// empty.
}
/// Types with a constant size known at compile-time.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[lang="sized"]
pub trait Sized {
// Empty.
/// to consider though: if you think your type may _not_ be able to implement `Copy` in the future,
/// then it might be prudent to not implement `Copy`. This is because removing `Copy` is a breaking
/// change: that second example would fail to compile if we made `Foo` non-`Copy`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[lang="copy"]
pub trait Copy {
// Empty.
/// around the value(s) which can be mutated when behind a `&`
/// reference; not doing this is undefined behaviour (for example,
/// `transmute`-ing from `&T` to `&mut T` is illegal).
-#[unstable = "will be overhauled with new lifetime rules; see RFC 458"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be overhauled with new lifetime rules; see RFC 458")]
#[lang="sync"]
pub unsafe trait Sync {
// Empty
/// `S<T>` is a subtype of `S<U>` if `T` is a subtype of `U`
/// (for example, `S<&'static int>` is a subtype of `S<&'a int>`
/// for some lifetime `'a`, but not the other way around).
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="covariant_type"]
#[derive(PartialEq, Eq, PartialOrd, Ord)]
pub struct CovariantType<T: ?Sized>;
/// subtype of `S<U>` if `U` is a subtype of `T`; given that the
/// function requires arguments of type `T`, it must also accept
/// arguments of type `U`, hence such a conversion is safe.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="contravariant_type"]
#[derive(PartialEq, Eq, PartialOrd, Ord)]
pub struct ContravariantType<T: ?Sized>;
/// The type system would infer that `value` is only read here and
/// never written, but in fact `Cell` uses unsafe code to achieve
/// interior mutability.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="invariant_type"]
#[derive(PartialEq, Eq, PartialOrd, Ord)]
pub struct InvariantType<T: ?Sized>;
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
impl<T: ?Sized> Copy for InvariantType<T> {}
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
impl<T: ?Sized> Clone for InvariantType<T> {
fn clone(&self) -> InvariantType<T> { *self }
}
///
/// For more information about variance, refer to this Wikipedia
/// article <http://en.wikipedia.org/wiki/Variance_%28computer_science%29>.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="covariant_lifetime"]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct CovariantLifetime<'a>;
///
/// For more information about variance, refer to this Wikipedia
/// article <http://en.wikipedia.org/wiki/Variance_%28computer_science%29>.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="contravariant_lifetime"]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct ContravariantLifetime<'a>;
/// pointer that is actually a pointer into memory with lifetime `'a`,
/// and this pointer is itself stored in an inherently mutable
/// location (such as a `Cell`).
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="invariant_lifetime"]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct InvariantLifetime<'a>;
/// be safely sent between tasks, even if it is owned. This is
/// typically embedded in other types, such as `Gc`, to ensure that
/// their instances remain thread-local.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="no_send_bound"]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[cfg(stage0)] // NOTE remove impl after next snapshot
/// A type which is considered "not POD", meaning that it is not
/// implicitly copyable. This is typically embedded in other types to
/// ensure that they are never copied, even if they lack a destructor.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="no_copy_bound"]
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
#[allow(missing_copy_implementations)]
/// A type which is considered "not sync", meaning that
/// its contents are not threadsafe, hence they cannot be
/// shared between tasks.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="no_sync_bound"]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[cfg(stage0)] // NOTE remove impl after next snapshot
/// A type which is considered managed by the GC. This is typically
/// embedded in other types.
-#[unstable = "likely to change with new variance strategy"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "likely to change with new variance strategy")]
#[lang="managed_bound"]
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
#[allow(missing_copy_implementations)]
//! This module contains functions for querying the size and alignment of
//! types, initializing and manipulating memory.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use marker::Sized;
use intrinsics;
use ptr;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub use intrinsics::transmute;
/// Moves a thing into the void.
///
/// This function is the unsafe version of the `drop` function because it does
/// not run any destructors.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub use intrinsics::forget;
/// Returns the size of a type in bytes.
/// assert_eq!(4, mem::size_of::<i32>());
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn size_of<T>() -> uint {
unsafe { intrinsics::size_of::<T>() }
}
/// assert_eq!(4, mem::size_of_val(&5i32));
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn size_of_val<T>(_val: &T) -> uint {
size_of::<T>()
}
/// assert_eq!(4, mem::min_align_of::<i32>());
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn min_align_of<T>() -> uint {
unsafe { intrinsics::min_align_of::<T>() }
}
/// assert_eq!(4, mem::min_align_of_val(&5i32));
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn min_align_of_val<T>(_val: &T) -> uint {
min_align_of::<T>()
}
/// assert_eq!(4, mem::align_of::<i32>());
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn align_of<T>() -> uint {
// We use the preferred alignment as the default alignment for a type. This
// appears to be what clang migrated towards as well:
/// assert_eq!(4, mem::align_of_val(&5i32));
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn align_of_val<T>(_val: &T) -> uint {
align_of::<T>()
}
/// let x: int = unsafe { mem::zeroed() };
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn zeroed<T>() -> T {
intrinsics::init()
}
/// let x: int = unsafe { mem::uninitialized() };
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn uninitialized<T>() -> T {
intrinsics::uninit()
}
/// assert_eq!(5i, *y);
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn swap<T>(x: &mut T, y: &mut T) {
unsafe {
// Give ourselves some scratch space to work with
/// }
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn replace<T>(dest: &mut T, mut src: T) -> T {
swap(dest, &mut src);
src
/// println!("{}", *borrow);
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn drop<T>(_x: T) { }
/// Interprets `src` as `&U`, and then reads `src` without moving the contained value.
/// assert_eq!(1u, one);
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn transmute_copy<T, U>(src: &T) -> U {
ptr::read(src as *const T as *const U)
}
/// Transforms lifetime of the second pointer to match the first.
#[inline]
-#[unstable = "this function may be removed in the future due to its \
- questionable utility"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this function may be removed in the future due to its \
+ questionable utility")]
pub unsafe fn copy_lifetime<'a, S: ?Sized, T: ?Sized + 'a>(_ptr: &'a S,
ptr: &T) -> &'a T {
transmute(ptr)
/// Transforms lifetime of the second mutable pointer to match the first.
#[inline]
-#[unstable = "this function may be removed in the future due to its \
- questionable utility"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this function may be removed in the future due to its \
+ questionable utility")]
pub unsafe fn copy_mut_lifetime<'a, S: ?Sized, T: ?Sized + 'a>(_ptr: &'a mut S,
ptr: &mut T)
-> &'a mut T {
/// NULL or 0 that might allow certain optimizations.
#[lang="non_zero"]
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Show)]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct NonZero<T: Zeroable>(T);
impl<T: Zeroable> NonZero<T> {
// FIXME: MIN_VALUE and MAX_VALUE literals are parsed as -inf and inf #14353
#![allow(overflowing_literals)]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use intrinsics;
use mem;
use num::FpCategory as Fp;
use option::Option;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const RADIX: uint = 2u;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MANTISSA_DIGITS: uint = 24u;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const DIGITS: uint = 6u;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const EPSILON: f32 = 1.19209290e-07_f32;
/// Smallest finite f32 value
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MIN_VALUE: f32 = -3.40282347e+38_f32;
/// Smallest positive, normalized f32 value
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MIN_POS_VALUE: f32 = 1.17549435e-38_f32;
/// Largest finite f32 value
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MAX_VALUE: f32 = 3.40282347e+38_f32;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MIN_EXP: int = -125;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MAX_EXP: int = 128;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MIN_10_EXP: int = -37;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MAX_10_EXP: int = 38;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const NAN: f32 = 0.0_f32/0.0_f32;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const INFINITY: f32 = 1.0_f32/0.0_f32;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const NEG_INFINITY: f32 = -1.0_f32/0.0_f32;
/// Various useful constants.
-#[unstable = "naming scheme needs to be revisited"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming scheme needs to be revisited")]
pub mod consts {
// FIXME: replace with mathematical constants from cmath.
pub const LN_10: f32 = 2.30258509299404568401799145468436421_f32;
}
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl Float for f32 {
#[inline]
fn nan() -> f32 { NAN }
}
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn mantissa_digits(_: Option<f32>) -> uint { MANTISSA_DIGITS }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn digits(_: Option<f32>) -> uint { DIGITS }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn epsilon() -> f32 { EPSILON }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_exp(_: Option<f32>) -> int { MIN_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn max_exp(_: Option<f32>) -> int { MAX_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_10_exp(_: Option<f32>) -> int { MIN_10_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn max_10_exp(_: Option<f32>) -> int { MAX_10_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_value() -> f32 { MIN_VALUE }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_pos_value(_: Option<f32>) -> f32 { MIN_POS_VALUE }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn max_value() -> f32 { MAX_VALUE }
/// Returns the mantissa, exponent and sign as integers.
// FIXME: MIN_VALUE and MAX_VALUE literals are parsed as -inf and inf #14353
#![allow(overflowing_literals)]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use intrinsics;
use mem;
// constants are implemented in favour of referencing the respective
// members of `Bounded` and `Float`.
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const RADIX: uint = 2u;
pub const MANTISSA_DIGITS: uint = 53u;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const DIGITS: uint = 15u;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const EPSILON: f64 = 2.2204460492503131e-16_f64;
/// Smallest finite f64 value
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MIN_VALUE: f64 = -1.7976931348623157e+308_f64;
/// Smallest positive, normalized f64 value
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MIN_POS_VALUE: f64 = 2.2250738585072014e-308_f64;
/// Largest finite f64 value
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MAX_VALUE: f64 = 1.7976931348623157e+308_f64;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MIN_EXP: int = -1021;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MAX_EXP: int = 1024;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MIN_10_EXP: int = -307;
-#[unstable = "pending integer conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "pending integer conventions")]
pub const MAX_10_EXP: int = 308;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const NAN: f64 = 0.0_f64/0.0_f64;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const INFINITY: f64 = 1.0_f64/0.0_f64;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const NEG_INFINITY: f64 = -1.0_f64/0.0_f64;
/// Various useful constants.
-#[unstable = "naming scheme needs to be revisited"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming scheme needs to be revisited")]
pub mod consts {
// FIXME: replace with mathematical constants from cmath.
pub const LN_10: f64 = 2.30258509299404568401799145468436421_f64;
}
-#[unstable = "trait is unstable"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is unstable")]
impl Float for f64 {
#[inline]
fn nan() -> f64 { NAN }
}
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn mantissa_digits(_: Option<f64>) -> uint { MANTISSA_DIGITS }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn digits(_: Option<f64>) -> uint { DIGITS }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn epsilon() -> f64 { EPSILON }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_exp(_: Option<f64>) -> int { MIN_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn max_exp(_: Option<f64>) -> int { MAX_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_10_exp(_: Option<f64>) -> int { MIN_10_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn max_10_exp(_: Option<f64>) -> int { MAX_10_EXP }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_value() -> f64 { MIN_VALUE }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn min_pos_value(_: Option<f64>) -> f64 { MIN_POS_VALUE }
#[inline]
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn max_value() -> f64 { MAX_VALUE }
/// Returns the mantissa, exponent and sign as integers.
//! Operations and constants for signed 16-bits integers (`i16` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i16")]
int_module! { i16, 16 }
//! Operations and constants for signed 32-bits integers (`i32` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i32")]
int_module! { i32, 32 }
//! Operations and constants for signed 64-bits integers (`i64` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i64")]
int_module! { i64, 64 }
//! Operations and constants for signed 8-bits integers (`i8` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i8")]
int_module! { i8, 8 }
//! alpha cycle along with the development of clearer conventions
//! around integer types.
-#![deprecated = "replaced by isize"]
+#![deprecated(feature = "oldstuff", since = "1.0.0", reason = "replaced by isize")]
#[cfg(target_pointer_width = "32")] int_module! { int, 32 }
#[cfg(target_pointer_width = "64")] int_module! { int, 64 }
// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of
// calling the `mem::size_of` function.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub const BITS : uint = $bits;
// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of
// calling the `mem::size_of` function.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub const BYTES : uint = ($bits / 8);
// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of
// calling the `Bounded::min_value` function.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MIN: $T = (-1 as $T) << (BITS - 1);
// FIXME(#9837): Compute MIN like this so the high bits that shouldn't exist are 0.
// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of
// calling the `Bounded::max_value` function.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MAX: $T = !MIN;
) }
//! new type will gradually take place over the alpha cycle along with
//! the development of clearer conventions around integer types.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "isize")]
#[cfg(target_pointer_width = "32")]
//! Numeric traits and functions for the built-in numeric types.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![allow(missing_docs)]
use char::CharExt;
use str::{FromStr, StrExt};
/// A built-in signed or unsigned integer.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Int
: Copy + Clone
+ NumCast
{
/// Returns the `0` value of this integer type.
// FIXME (#5527): Should be an associated constant
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn zero() -> Self;
/// Returns the `1` value of this integer type.
// FIXME (#5527): Should be an associated constant
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn one() -> Self;
/// Returns the smallest value that can be represented by this integer type.
// FIXME (#5527): Should be and associated constant
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn min_value() -> Self;
/// Returns the largest value that can be represented by this integer type.
// FIXME (#5527): Should be and associated constant
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn max_value() -> Self;
/// Returns the number of ones in the binary representation of `self`.
///
/// assert_eq!(n.count_ones(), 3);
/// ```
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn count_ones(self) -> uint;
/// Returns the number of zeros in the binary representation of `self`.
///
/// assert_eq!(n.count_zeros(), 5);
/// ```
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
#[inline]
fn count_zeros(self) -> uint {
(!self).count_ones()
///
/// assert_eq!(n.leading_zeros(), 10);
/// ```
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn leading_zeros(self) -> uint;
/// Returns the number of trailing zeros in the binary representation
///
/// assert_eq!(n.trailing_zeros(), 3);
/// ```
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn trailing_zeros(self) -> uint;
/// Shifts the bits to the left by a specified amount amount, `n`, wrapping
///
/// assert_eq!(n.rotate_left(12), m);
/// ```
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn rotate_left(self, n: uint) -> Self;
/// Shifts the bits to the right by a specified amount amount, `n`, wrapping
///
/// assert_eq!(n.rotate_right(12), m);
/// ```
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn rotate_right(self, n: uint) -> Self;
/// Reverses the byte order of the integer.
///
/// assert_eq!(n.swap_bytes(), m);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn swap_bytes(self) -> Self;
/// Convert an integer from big endian to the target's endianness.
/// assert_eq!(Int::from_be(n), n.swap_bytes())
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn from_be(x: Self) -> Self {
if cfg!(target_endian = "big") { x } else { x.swap_bytes() }
/// assert_eq!(Int::from_le(n), n.swap_bytes())
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn from_le(x: Self) -> Self {
if cfg!(target_endian = "little") { x } else { x.swap_bytes() }
/// assert_eq!(n.to_be(), n.swap_bytes())
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn to_be(self) -> Self { // or not to be?
if cfg!(target_endian = "big") { self } else { self.swap_bytes() }
/// assert_eq!(n.to_le(), n.swap_bytes())
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn to_le(self) -> Self {
if cfg!(target_endian = "little") { self } else { self.swap_bytes() }
/// assert_eq!(5u16.checked_add(65530), Some(65535));
/// assert_eq!(6u16.checked_add(65530), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn checked_add(self, other: Self) -> Option<Self>;
/// Checked integer subtraction. Computes `self - other`, returning `None`
/// assert_eq!((-127i8).checked_sub(1), Some(-128));
/// assert_eq!((-128i8).checked_sub(1), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn checked_sub(self, other: Self) -> Option<Self>;
/// Checked integer multiplication. Computes `self * other`, returning
/// assert_eq!(5u8.checked_mul(51), Some(255));
/// assert_eq!(5u8.checked_mul(52), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn checked_mul(self, other: Self) -> Option<Self>;
/// Checked integer division. Computes `self / other`, returning `None` if
/// assert_eq!((-128i8).checked_div(-1), None);
/// assert_eq!((1i8).checked_div(0), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn checked_div(self, other: Self) -> Option<Self>;
/// Saturating integer addition. Computes `self + other`, saturating at
/// the numeric bounds instead of overflowing.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn saturating_add(self, other: Self) -> Self {
match self.checked_add(other) {
/// Saturating integer subtraction. Computes `self - other`, saturating at
/// the numeric bounds instead of overflowing.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn saturating_sub(self, other: Self) -> Self {
match self.checked_sub(other) {
///
/// assert_eq!(2i.pow(4), 16);
/// ```
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
#[inline]
fn pow(self, mut exp: uint) -> Self {
let mut base = self;
$add_with_overflow:path,
$sub_with_overflow:path,
$mul_with_overflow:path) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Int for $T {
#[inline]
fn zero() -> $T { 0 }
$add_with_overflow:path,
$sub_with_overflow:path,
$mul_with_overflow:path) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Int for $T {
#[inline]
fn zero() -> $T { 0 }
intrinsics::i64_mul_with_overflow }
/// A built-in two's complement integer.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait SignedInt
: Int
+ Neg<Output=Self>
{
/// Computes the absolute value of `self`. `Int::min_value()` will be
/// returned if the number is `Int::min_value()`.
- #[unstable = "overflow in debug builds?"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "overflow in debug builds?")]
fn abs(self) -> Self;
/// Returns a number representing sign of `self`.
/// - `0` if the number is zero
/// - `1` if the number is positive
/// - `-1` if the number is negative
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn signum(self) -> Self;
/// Returns `true` if `self` is positive and `false` if the number
/// is zero or negative.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_positive(self) -> bool;
/// Returns `true` if `self` is negative and `false` if the number
/// is zero or positive.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_negative(self) -> bool;
}
macro_rules! signed_int_impl {
($T:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl SignedInt for $T {
#[inline]
fn abs(self) -> $T {
signed_int_impl! { int }
/// A built-in unsigned integer.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait UnsignedInt: Int {
/// Returns `true` iff `self == 2^k` for some `k`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn is_power_of_two(self) -> bool {
(self - Int::one()) & self == Int::zero() && !(self == Int::zero())
/// Returns the smallest power of two greater than or equal to `self`.
/// Unspecified behavior on overflow.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn next_power_of_two(self) -> Self {
let bits = size_of::<Self>() * 8;
/// Returns the smallest power of two greater than or equal to `n`. If the
/// next power of two is greater than the type's maximum value, `None` is
/// returned, otherwise the power of two is wrapped in `Some`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn checked_next_power_of_two(self) -> Option<Self> {
let npot = self.next_power_of_two();
if npot >= self {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl UnsignedInt for uint {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl UnsignedInt for u8 {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl UnsignedInt for u16 {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl UnsignedInt for u32 {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl UnsignedInt for u64 {}
/// A generic trait for converting a value to a number.
-#[unstable = "trait is likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is likely to be removed")]
pub trait ToPrimitive {
/// Converts the value of `self` to an `int`.
#[inline]
impl_to_primitive_float! { f64 }
/// A generic trait for converting a number to a value.
-#[unstable = "trait is likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is likely to be removed")]
pub trait FromPrimitive : ::marker::Sized {
/// Convert an `int` to return an optional value of this type. If the
/// value cannot be represented by this value, the `None` is returned.
}
/// A utility function that just calls `FromPrimitive::from_int`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_int<A: FromPrimitive>(n: int) -> Option<A> {
FromPrimitive::from_int(n)
}
/// A utility function that just calls `FromPrimitive::from_i8`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_i8<A: FromPrimitive>(n: i8) -> Option<A> {
FromPrimitive::from_i8(n)
}
/// A utility function that just calls `FromPrimitive::from_i16`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_i16<A: FromPrimitive>(n: i16) -> Option<A> {
FromPrimitive::from_i16(n)
}
/// A utility function that just calls `FromPrimitive::from_i32`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_i32<A: FromPrimitive>(n: i32) -> Option<A> {
FromPrimitive::from_i32(n)
}
/// A utility function that just calls `FromPrimitive::from_i64`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_i64<A: FromPrimitive>(n: i64) -> Option<A> {
FromPrimitive::from_i64(n)
}
/// A utility function that just calls `FromPrimitive::from_uint`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_uint<A: FromPrimitive>(n: uint) -> Option<A> {
FromPrimitive::from_uint(n)
}
/// A utility function that just calls `FromPrimitive::from_u8`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_u8<A: FromPrimitive>(n: u8) -> Option<A> {
FromPrimitive::from_u8(n)
}
/// A utility function that just calls `FromPrimitive::from_u16`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_u16<A: FromPrimitive>(n: u16) -> Option<A> {
FromPrimitive::from_u16(n)
}
/// A utility function that just calls `FromPrimitive::from_u32`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_u32<A: FromPrimitive>(n: u32) -> Option<A> {
FromPrimitive::from_u32(n)
}
/// A utility function that just calls `FromPrimitive::from_u64`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_u64<A: FromPrimitive>(n: u64) -> Option<A> {
FromPrimitive::from_u64(n)
}
/// A utility function that just calls `FromPrimitive::from_f32`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_f32<A: FromPrimitive>(n: f32) -> Option<A> {
FromPrimitive::from_f32(n)
}
/// A utility function that just calls `FromPrimitive::from_f64`.
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn from_f64<A: FromPrimitive>(n: f64) -> Option<A> {
FromPrimitive::from_f64(n)
}
/// ```
///
#[inline]
-#[unstable = "likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "likely to be removed")]
pub fn cast<T: NumCast,U: NumCast>(n: T) -> Option<U> {
NumCast::from(n)
}
/// An interface for casting between machine scalars.
-#[unstable = "trait is likely to be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is likely to be removed")]
pub trait NumCast: ToPrimitive {
/// Creates a number from another value that can be converted into a primitive via the
/// `ToPrimitive` trait.
/// Used for representing the classification of floating point numbers
#[derive(Copy, PartialEq, Show)]
-#[unstable = "may be renamed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be renamed")]
pub enum FpCategory {
/// "Not a Number", often obtained by dividing by zero
Nan,
//
// FIXME(#8888): Several of these functions have a parameter named
// `unused_self`. Removing it requires #8888 to be fixed.
-#[unstable = "distribution of methods between core/std is unclear"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "distribution of methods between core/std is unclear")]
pub trait Float
: Copy + Clone
+ NumCast
// FIXME (#5527): These should be associated constants
/// Returns the number of binary digits of mantissa that this type supports.
- #[deprecated = "use `std::f32::MANTISSA_DIGITS` or `std::f64::MANTISSA_DIGITS` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MANTISSA_DIGITS` or \
+ `std::f64::MANTISSA_DIGITS` as appropriate")]
fn mantissa_digits(unused_self: Option<Self>) -> uint;
/// Returns the number of base-10 digits of precision that this type supports.
- #[deprecated = "use `std::f32::DIGITS` or `std::f64::DIGITS` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::DIGITS` or `std::f64::DIGITS` as appropriate")]
fn digits(unused_self: Option<Self>) -> uint;
/// Returns the difference between 1.0 and the smallest representable number larger than 1.0.
- #[deprecated = "use `std::f32::EPSILON` or `std::f64::EPSILON` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::EPSILON` or `std::f64::EPSILON` as appropriate")]
fn epsilon() -> Self;
/// Returns the minimum binary exponent that this type can represent.
- #[deprecated = "use `std::f32::MIN_EXP` or `std::f64::MIN_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MIN_EXP` or `std::f64::MIN_EXP` as appropriate")]
fn min_exp(unused_self: Option<Self>) -> int;
/// Returns the maximum binary exponent that this type can represent.
- #[deprecated = "use `std::f32::MAX_EXP` or `std::f64::MAX_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MAX_EXP` or `std::f64::MAX_EXP` as appropriate")]
fn max_exp(unused_self: Option<Self>) -> int;
/// Returns the minimum base-10 exponent that this type can represent.
- #[deprecated = "use `std::f32::MIN_10_EXP` or `std::f64::MIN_10_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MIN_10_EXP` or `std::f64::MIN_10_EXP` as appropriate")]
fn min_10_exp(unused_self: Option<Self>) -> int;
/// Returns the maximum base-10 exponent that this type can represent.
- #[deprecated = "use `std::f32::MAX_10_EXP` or `std::f64::MAX_10_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MAX_10_EXP` or `std::f64::MAX_10_EXP` as appropriate")]
fn max_10_exp(unused_self: Option<Self>) -> int;
/// Returns the smallest finite value that this type can represent.
- #[deprecated = "use `std::f32::MIN_VALUE` or `std::f64::MIN_VALUE` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MIN_VALUE` or `std::f64::MIN_VALUE` as appropriate")]
fn min_value() -> Self;
/// Returns the smallest normalized positive number that this type can represent.
- #[deprecated = "use `std::f32::MIN_POS_VALUE` or `std::f64::MIN_POS_VALUE` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MIN_POS_VALUE` or \
+ `std::f64::MIN_POS_VALUE` as appropriate")]
fn min_pos_value(unused_self: Option<Self>) -> Self;
/// Returns the largest finite value that this type can represent.
- #[deprecated = "use `std::f32::MAX_VALUE` or `std::f64::MAX_VALUE` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MAX_VALUE` or `std::f64::MAX_VALUE` as appropriate")]
fn max_value() -> Self;
/// Returns true if this value is NaN and false otherwise.
}
/// A generic trait for converting a string with a radix (base) to a value
-#[unstable = "might need to return Result"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "might need to return Result")]
pub trait FromStrRadix {
fn from_str_radix(str: &str, radix: uint) -> Option<Self>;
}
/// A utility function that just calls FromStrRadix::from_str_radix.
-#[unstable = "might need to return Result"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "might need to return Result")]
pub fn from_str_radix<T: FromStrRadix>(str: &str, radix: uint) -> Option<T> {
FromStrRadix::from_str_radix(str, radix)
}
macro_rules! from_str_radix_float_impl {
($T:ty) => {
- #[unstable = "might need to return Result"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might need to return Result")]
impl FromStr for $T {
/// Convert a string in base 10 to a float.
/// Accepts an optional decimal exponent.
}
}
- #[unstable = "might need to return Result"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might need to return Result")]
impl FromStrRadix for $T {
/// Convert a string in a given base to a float.
///
macro_rules! from_str_radix_int_impl {
($T:ty) => {
- #[unstable = "might need to return Result"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might need to return Result")]
impl FromStr for $T {
#[inline]
fn from_str(src: &str) -> Option<$T> {
}
}
- #[unstable = "might need to return Result"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might need to return Result")]
impl FromStrRadix for $T {
fn from_str_radix(src: &str, radix: uint) -> Option<$T> {
assert!(radix >= 2 && radix <= 36,
//! Operations and constants for unsigned 16-bits integers (`u16` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u16")]
uint_module! { u16, i16, 16 }
//! Operations and constants for unsigned 32-bits integers (`u32` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u32")]
uint_module! { u32, i32, 32 }
//! Operations and constants for unsigned 64-bits integer (`u64` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u64")]
uint_module! { u64, i64, 64 }
//! Operations and constants for unsigned 8-bits integers (`u8` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u8")]
uint_module! { u8, i8, 8 }
//! alpha cycle along with the development of clearer conventions
//! around integer types.
-#![deprecated = "replaced by usize"]
+#![deprecated(feature = "oldstuff", since = "1.0.0", reason = "replaced by usize")]
uint_module! { uint, int, ::int::BITS }
macro_rules! uint_module { ($T:ty, $T_SIGNED:ty, $bits:expr) => (
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub const BITS : uint = $bits;
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub const BYTES : uint = ($bits / 8);
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MIN: $T = 0 as $T;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const MAX: $T = 0 as $T - 1 as $T;
) }
//! new type will gradually take place over the alpha cycle along with
//! the development of clearer conventions around integer types.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "usize")]
uint_module! { usize, isize, ::isize::BITS }
//! See the documentation for each trait for a minimum implementation that prints
//! something to the screen.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use clone::Clone;
use iter::{Step, Iterator,DoubleEndedIterator,ExactSizeIterator};
/// }
/// ```
#[lang="drop"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Drop {
/// The `drop` method, called when the value goes out of scope.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn drop(&mut self);
}
// based on "op T" where T is expected to be `Copy`able
macro_rules! forward_ref_unop {
(impl $imp:ident, $method:ident for $t:ty) => {
- #[unstable = "recently added, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added, waiting for dust to settle")]
impl<'a> $imp for &'a $t {
type Output = <$t as $imp>::Output;
// based on "T op U" where T and U are expected to be `Copy`able
macro_rules! forward_ref_binop {
(impl $imp:ident, $method:ident for $t:ty, $u:ty) => {
- #[unstable = "recently added, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added, waiting for dust to settle")]
impl<'a> $imp<$u> for &'a $t {
type Output = <$t as $imp<$u>>::Output;
}
}
- #[unstable = "recently added, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added, waiting for dust to settle")]
impl<'a> $imp<&'a $u> for $t {
type Output = <$t as $imp<$u>>::Output;
}
}
- #[unstable = "recently added, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added, waiting for dust to settle")]
impl<'a, 'b> $imp<&'a $u> for &'b $t {
type Output = <$t as $imp<$u>>::Output;
/// }
/// ```
#[lang="add"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Add<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `+` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn add(self, rhs: RHS) -> Self::Output;
}
macro_rules! add_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Add for $t {
type Output = $t;
/// }
/// ```
#[lang="sub"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Sub<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `-` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn sub(self, rhs: RHS) -> Self::Output;
}
macro_rules! sub_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Sub for $t {
type Output = $t;
/// }
/// ```
#[lang="mul"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Mul<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `*` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn mul(self, rhs: RHS) -> Self::Output;
}
macro_rules! mul_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Mul for $t {
type Output = $t;
/// }
/// ```
#[lang="div"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Div<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `/` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn div(self, rhs: RHS) -> Self::Output;
}
macro_rules! div_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Div for $t {
type Output = $t;
/// }
/// ```
#[lang="rem"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Rem<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output = Self;
/// The method for the `%` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn rem(self, rhs: RHS) -> Self::Output;
}
macro_rules! rem_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Rem for $t {
type Output = $t;
macro_rules! rem_float_impl {
($t:ty, $fmod:ident) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Rem for $t {
type Output = $t;
/// }
/// ```
#[lang="neg"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Neg {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the unary `-` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn neg(self) -> Self::Output;
}
macro_rules! neg_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Neg for $t {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output = $t;
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn neg(self) -> $t { -self }
}
macro_rules! neg_uint_impl {
($t:ty, $t_signed:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Neg for $t {
type Output = $t;
/// }
/// ```
#[lang="not"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Not {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the unary `!` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn not(self) -> Self::Output;
}
macro_rules! not_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Not for $t {
type Output = $t;
/// }
/// ```
#[lang="bitand"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait BitAnd<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `&` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn bitand(self, rhs: RHS) -> Self::Output;
}
macro_rules! bitand_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl BitAnd for $t {
type Output = $t;
/// }
/// ```
#[lang="bitor"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait BitOr<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `|` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn bitor(self, rhs: RHS) -> Self::Output;
}
macro_rules! bitor_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl BitOr for $t {
type Output = $t;
/// }
/// ```
#[lang="bitxor"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait BitXor<RHS=Self> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `^` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn bitxor(self, rhs: RHS) -> Self::Output;
}
macro_rules! bitxor_impl {
($($t:ty)*) => ($(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl BitXor for $t {
type Output = $t;
/// }
/// ```
#[lang="shl"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Shl<RHS> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `<<` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn shl(self, rhs: RHS) -> Self::Output;
}
macro_rules! shl_impl {
($t:ty, $f:ty) => (
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Shl<$f> for $t {
type Output = $t;
/// }
/// ```
#[lang="shr"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Shr<RHS> {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Output;
/// The method for the `>>` operator
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn shr(self, rhs: RHS) -> Self::Output;
}
/// An unbounded range.
#[derive(Copy, Clone, PartialEq, Eq)]
#[lang="full_range"]
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
pub struct FullRange;
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl fmt::Show for FullRange {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt::Show::fmt("..", fmt)
/// A (half-open) range which is bounded at both ends.
#[derive(Copy, Clone, PartialEq, Eq)]
#[lang="range"]
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
pub struct Range<Idx> {
/// The lower bound of the range (inclusive).
pub start: Idx,
pub end: Idx,
}
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl<Idx: Clone + Step> Iterator for Range<Idx> {
type Item = Idx;
}
}
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl<Idx: Clone + Step> DoubleEndedIterator for Range<Idx> {
#[inline]
fn next_back(&mut self) -> Option<Idx> {
}
}
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl<Idx: Clone + Step> ExactSizeIterator for Range<Idx> {}
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl<Idx: fmt::Show> fmt::Show for Range<Idx> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}..{:?}", self.start, self.end)
/// A range which is only bounded below.
#[derive(Copy, Clone, PartialEq, Eq)]
#[lang="range_from"]
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
pub struct RangeFrom<Idx> {
/// The lower bound of the range (inclusive).
pub start: Idx,
}
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl<Idx: Clone + Step> Iterator for RangeFrom<Idx> {
type Item = Idx;
}
}
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl<Idx: fmt::Show> fmt::Show for RangeFrom<Idx> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}..", self.start)
/// A range which is only bounded above.
#[derive(Copy, Clone, PartialEq, Eq)]
#[lang="range_to"]
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
pub struct RangeTo<Idx> {
/// The upper bound of the range (exclusive).
pub end: Idx,
}
-#[unstable = "API still in development"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "API still in development")]
impl<Idx: fmt::Show> fmt::Show for RangeTo<Idx> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "..{:?}", self.end)
/// }
/// ```
#[lang="deref"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Deref {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
type Target: ?Sized;
/// The method called to dereference a value
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn deref<'a>(&'a self) -> &'a Self::Target;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: ?Sized> Deref for &'a T {
type Target = T;
fn deref(&self) -> &T { *self }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: ?Sized> Deref for &'a mut T {
type Target = T;
/// }
/// ```
#[lang="deref_mut"]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait DerefMut: Deref {
/// The method called to mutably dereference a value
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn deref_mut<'a>(&'a mut self) -> &'a mut Self::Target;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: ?Sized> DerefMut for &'a mut T {
fn deref_mut(&mut self) -> &mut T { *self }
}
/// A version of the call operator that takes an immutable receiver.
#[lang="fn"]
-#[unstable = "uncertain about variadic generics, input versus associated types"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain about variadic generics, input versus associated types")]
pub trait Fn<Args,Result> {
/// This is called when the call operator is used.
extern "rust-call" fn call(&self, args: Args) -> Result;
/// A version of the call operator that takes a mutable receiver.
#[lang="fn_mut"]
-#[unstable = "uncertain about variadic generics, input versus associated types"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain about variadic generics, input versus associated types")]
pub trait FnMut<Args,Result> {
/// This is called when the call operator is used.
extern "rust-call" fn call_mut(&mut self, args: Args) -> Result;
/// A version of the call operator that takes a by-value receiver.
#[lang="fn_once"]
-#[unstable = "uncertain about variadic generics, input versus associated types"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain about variadic generics, input versus associated types")]
pub trait FnOnce<Args,Result> {
/// This is called when the call operator is used.
extern "rust-call" fn call_once(self, args: Args) -> Result;
//! }
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use self::Option::*;
/// The `Option` type.
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Show, Hash)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub enum Option<T> {
/// No value
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
None,
/// Some value `T`
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Some(T)
}
/// assert_eq!(x.is_some(), false);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_some(&self) -> bool {
match *self {
Some(_) => true,
/// assert_eq!(x.is_none(), true);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_none(&self) -> bool {
!self.is_some()
}
/// println!("still can print num_as_str: {:?}", num_as_str);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn as_ref<'r>(&'r self) -> Option<&'r T> {
match *self {
Some(ref x) => Some(x),
/// assert_eq!(x, Some(42u));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn as_mut<'r>(&'r mut self) -> Option<&'r mut T> {
match *self {
Some(ref mut x) => Some(x),
/// assert_eq!(x, Some("Dirt"));
/// ```
#[inline]
- #[unstable = "waiting for mut conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting for mut conventions")]
pub fn as_mut_slice<'r>(&'r mut self) -> &'r mut [T] {
match *self {
Some(ref mut x) => {
/// x.expect("the world is ending"); // panics with `world is ending`
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn expect(self, msg: &str) -> T {
match self {
Some(val) => val,
/// assert_eq!(x.unwrap(), "air"); // fails
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap(self) -> T {
match self {
Some(val) => val,
/// assert_eq!(None.unwrap_or("bike"), "bike");
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap_or(self, def: T) -> T {
match self {
Some(x) => x,
/// assert_eq!(None.unwrap_or_else(|| 2 * k), 20u);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap_or_else<F: FnOnce() -> T>(self, f: F) -> T {
match self {
Some(x) => x,
/// let num_as_int: Option<uint> = num_as_str.map(|n| n.len());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Option<U> {
match self {
Some(x) => Some(f(x)),
/// assert_eq!(x.map_or(42u, |v| v.len()), 42u);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn map_or<U, F: FnOnce(T) -> U>(self, def: U, f: F) -> U {
match self {
Some(t) => f(t),
/// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42u);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn map_or_else<U, D: FnOnce() -> U, F: FnOnce(T) -> U>(self, def: D, f: F) -> U {
match self {
Some(t) => f(t),
/// assert_eq!(x.ok_or(0i), Err(0i));
/// ```
#[inline]
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn ok_or<E>(self, err: E) -> Result<T, E> {
match self {
Some(v) => Ok(v),
/// assert_eq!(x.ok_or_else(|| 0i), Err(0i));
/// ```
#[inline]
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn ok_or_else<E, F: FnOnce() -> E>(self, err: F) -> Result<T, E> {
match self {
Some(v) => Ok(v),
/// assert_eq!(x.iter().next(), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter { inner: Item { opt: self.as_ref() } }
}
/// assert_eq!(x.iter_mut().next(), None);
/// ```
#[inline]
- #[unstable = "waiting for iterator conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting for iterator conventions")]
pub fn iter_mut(&mut self) -> IterMut<T> {
IterMut { inner: Item { opt: self.as_mut() } }
}
/// assert!(v.is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
IntoIter { inner: Item { opt: self } }
}
/// assert_eq!(x.and(y), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn and<U>(self, optb: Option<U>) -> Option<U> {
match self {
Some(_) => optb,
/// assert_eq!(None.and_then(sq).and_then(sq), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn and_then<U, F: FnOnce(T) -> Option<U>>(self, f: F) -> Option<U> {
match self {
Some(x) => f(x),
/// assert_eq!(x.or(y), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn or(self, optb: Option<T>) -> Option<T> {
match self {
Some(_) => self,
/// assert_eq!(None.or_else(nobody), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn or_else<F: FnOnce() -> Option<T>>(self, f: F) -> Option<T> {
match self {
Some(_) => self,
/// assert_eq!(x, None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn take(&mut self) -> Option<T> {
mem::replace(self, None)
}
impl<'a, T: Clone, D: Deref<Target=T>> Option<D> {
/// Maps an Option<D> to an Option<T> by dereffing and cloning the contents of the Option.
/// Useful for converting an Option<&T> to an Option<T>.
- #[unstable = "recently added as part of collections reform"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added as part of collections reform")]
pub fn cloned(self) -> Option<T> {
self.map(|t| t.deref().clone())
}
/// assert_eq!(0i, bad_year);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap_or_default(self) -> T {
match self {
Some(x) => x,
// Trait implementations
/////////////////////////////////////////////////////////////////////////////
-#[unstable = "waiting on the stability of the trait itself"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting on the stability of the trait itself")]
impl<T> AsSlice<T> for Option<T> {
/// Convert from `Option<T>` to `&[T]` (without copying)
#[inline]
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Default for Option<T> {
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> Option<T> { None }
}
impl<A> ExactSizeIterator for Item<A> {}
/// An iterator over a reference of the contained item in an Option.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, A: 'a> { inner: Item<&'a A> }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> Iterator for Iter<'a, A> {
type Item = &'a A;
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> DoubleEndedIterator for Iter<'a, A> {
#[inline]
fn next_back(&mut self) -> Option<&'a A> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> ExactSizeIterator for Iter<'a, A> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> Clone for Iter<'a, A> {
fn clone(&self) -> Iter<'a, A> {
Iter { inner: self.inner.clone() }
}
/// An iterator over a mutable reference of the contained item in an Option.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, A: 'a> { inner: Item<&'a mut A> }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> Iterator for IterMut<'a, A> {
type Item = &'a mut A;
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> DoubleEndedIterator for IterMut<'a, A> {
#[inline]
fn next_back(&mut self) -> Option<&'a mut A> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, A> ExactSizeIterator for IterMut<'a, A> {}
/// An iterator over the item contained inside an Option.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<A> { inner: Item<A> }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> Iterator for IntoIter<A> {
type Item = A;
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> DoubleEndedIterator for IntoIter<A> {
#[inline]
fn next_back(&mut self) -> Option<A> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A> ExactSizeIterator for IntoIter<A> {}
/////////////////////////////////////////////////////////////////////////////
// FromIterator
/////////////////////////////////////////////////////////////////////////////
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
/// Takes each element in the `Iterator`: if it is `None`, no further
/// elements are taken, and the `None` is returned. Should no `None` occur, a
/// assert!(res == Some(vec!(2u, 3u)));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn from_iter<I: Iterator<Item=Option<A>>>(iter: I) -> Option<V> {
// FIXME(#11084): This could be replaced with Iterator::scan when this
// performance bug is closed.
//! but C APIs hand out a lot of pointers generally, so are a common source
//! of unsafe pointers in Rust.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use mem;
use clone::Clone;
// FIXME #19649: intrinsic docs don't render, so these have no docs :(
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub use intrinsics::copy_nonoverlapping_memory;
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub use intrinsics::copy_memory;
-#[unstable = "uncertain about naming and semantics"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "uncertain about naming and semantics")]
pub use intrinsics::set_memory;
/// assert!(p.is_null());
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn null<T>() -> *const T { 0 as *const T }
/// Creates a null mutable raw pointer.
/// assert!(p.is_null());
/// ```
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn null_mut<T>() -> *mut T { 0 as *mut T }
/// Zeroes out `count * size_of::<T>` bytes of memory at `dst`. `count` may be
/// Beyond accepting a raw pointer, this is unsafe because it will not drop the
/// contents of `dst`, and may be used to create invalid instances of `T`.
#[inline]
-#[unstable = "may play a larger role in std::ptr future extensions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may play a larger role in std::ptr future extensions")]
pub unsafe fn zero_memory<T>(dst: *mut T, count: uint) {
set_memory(dst, 0, count);
}
///
/// This is only unsafe because it accepts a raw pointer.
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn swap<T>(x: *mut T, y: *mut T) {
// Give ourselves some scratch space to work with
let mut tmp: T = mem::uninitialized();
/// This is only unsafe because it accepts a raw pointer.
/// Otherwise, this operation is identical to `mem::replace`.
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn replace<T>(dest: *mut T, mut src: T) -> T {
mem::swap(mem::transmute(dest), &mut src); // cannot overlap
src
/// `zero_memory`, or `copy_memory`). Note that `*src = foo` counts as a use
/// because it will attempt to drop the value previously at `*src`.
#[inline(always)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn read<T>(src: *const T) -> T {
let mut tmp: T = mem::uninitialized();
copy_nonoverlapping_memory(&mut tmp, src, 1);
///
/// This is unsafe for the same reasons that `read` is unsafe.
#[inline(always)]
-#[unstable = "may play a larger role in std::ptr future extensions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may play a larger role in std::ptr future extensions")]
pub unsafe fn read_and_zero<T>(dest: *mut T) -> T {
// Copy the data out from `dest`:
let tmp = read(&*dest);
/// This is appropriate for initializing uninitialized memory, or overwriting
/// memory that has previously been `read` from.
#[inline]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn write<T>(dst: *mut T, src: T) {
intrinsics::move_val_init(&mut *dst, src)
}
/// Methods on raw pointers
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait PtrExt: Sized {
type Target;
/// Returns true if the pointer is null.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_null(self) -> bool;
/// Returns `None` if the pointer is null, or else returns a reference to
/// null-safety, it is important to note that this is still an unsafe
/// operation because the returned value could be pointing to invalid
/// memory.
- #[unstable = "Option is not clearly the right return type, and we may want \
- to tie the return lifetime to a borrow of the raw pointer"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Option is not clearly the right return type, and we may want \
+ to tie the return lifetime to a borrow of the raw pointer")]
unsafe fn as_ref<'a>(&self) -> Option<&'a Self::Target>;
/// Calculates the offset from a pointer. `count` is in units of T; e.g. a
/// The offset must be in-bounds of the object, or one-byte-past-the-end.
/// Otherwise `offset` invokes Undefined Behaviour, regardless of whether
/// the pointer is used.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn offset(self, count: int) -> Self;
}
/// Methods on mutable raw pointers
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait MutPtrExt {
type Target;
///
/// As with `as_ref`, this is unsafe because it cannot verify the validity
/// of the returned pointer.
- #[unstable = "Option is not clearly the right return type, and we may want \
- to tie the return lifetime to a borrow of the raw pointer"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Option is not clearly the right return type, and we may want \
+ to tie the return lifetime to a borrow of the raw pointer")]
unsafe fn as_mut<'a>(&self) -> Option<&'a mut Self::Target>;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> PtrExt for *const T {
type Target = T;
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_null(self) -> bool { self as uint == 0 }
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn offset(self, count: int) -> *const T {
intrinsics::offset(self, count)
}
#[inline]
- #[unstable = "return value does not necessarily convey all possible \
- information"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "return value does not necessarily convey all possible \
+ information")]
unsafe fn as_ref<'a>(&self) -> Option<&'a T> {
if self.is_null() {
None
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> PtrExt for *mut T {
type Target = T;
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_null(self) -> bool { self as uint == 0 }
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
unsafe fn offset(self, count: int) -> *mut T {
intrinsics::offset(self, count) as *mut T
}
#[inline]
- #[unstable = "return value does not necessarily convey all possible \
- information"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "return value does not necessarily convey all possible \
+ information")]
unsafe fn as_ref<'a>(&self) -> Option<&'a T> {
if self.is_null() {
None
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> MutPtrExt for *mut T {
type Target = T;
#[inline]
- #[unstable = "return value does not necessarily convey all possible \
- information"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "return value does not necessarily convey all possible \
+ information")]
unsafe fn as_mut<'a>(&self) -> Option<&'a mut T> {
if self.is_null() {
None
}
// Equality for pointers
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> PartialEq for *const T {
#[inline]
fn eq(&self, other: &*const T) -> bool {
fn ne(&self, other: &*const T) -> bool { !self.eq(other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Eq for *const T {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> PartialEq for *mut T {
#[inline]
fn eq(&self, other: &*mut T) -> bool {
fn ne(&self, other: &*mut T) -> bool { !self.eq(other) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Eq for *mut T {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Clone for *const T {
#[inline]
fn clone(&self) -> *const T {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Clone for *mut T {
#[inline]
fn clone(&self) -> *mut T {
use mem;
use cmp::PartialEq;
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<_R> PartialEq for extern "C" fn() -> _R {
#[inline]
fn eq(&self, other: &extern "C" fn() -> _R) -> bool {
}
macro_rules! fnptreq {
($($p:ident),*) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<_R,$($p),*> PartialEq for extern "C" fn($($p),*) -> _R {
#[inline]
fn eq(&self, other: &extern "C" fn($($p),*) -> _R) -> bool {
}
// Comparison for pointers
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Ord for *const T {
#[inline]
fn cmp(&self, other: &*const T) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> PartialOrd for *const T {
#[inline]
fn partial_cmp(&self, other: &*const T) -> Option<Ordering> {
fn ge(&self, other: &*const T) -> bool { *self >= *other }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Ord for *mut T {
#[inline]
fn cmp(&self, other: &*mut T) -> Ordering {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> PartialOrd for *mut T {
#[inline]
fn partial_cmp(&self, other: &*mut T) -> Option<Ordering> {
/// raw `*mut T` (which conveys no particular ownership semantics).
/// Useful for building abstractions like `Vec<T>` or `Box<T>`, which
/// internally use raw pointers to manage the memory that they own.
-#[unstable = "recently added to this module"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recently added to this module")]
pub struct Unique<T>(pub *mut T);
/// `Unique` pointers are `Send` if `T` is `Send` because the data they
/// reference is unaliased. Note that this aliasing invariant is
/// unenforced by the type system; the abstraction using the
/// `Unique` must enforce it.
-#[unstable = "recently added to this module"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recently added to this module")]
unsafe impl<T:Send> Send for Unique<T> { }
/// `Unique` pointers are `Sync` if `T` is `Sync` because the data they
/// reference is unaliased. Note that this aliasing invariant is
/// unenforced by the type system; the abstraction using the
/// `Unique` must enforce it.
-#[unstable = "recently added to this module"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recently added to this module")]
unsafe impl<T:Sync> Sync for Unique<T> { }
impl<T> Unique<T> {
/// Returns a null Unique.
- #[unstable = "recently added to this module"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added to this module")]
pub fn null() -> Unique<T> {
Unique(null_mut())
}
/// Return an (unsafe) pointer into the memory owned by `self`.
- #[unstable = "recently added to this module"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "recently added to this module")]
pub unsafe fn offset(self, offset: int) -> *mut T {
self.0.offset(offset)
}
// except according to those terms.
#![allow(missing_docs)]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
//! Contains struct definitions for the layout of compiler built-in types.
//!
//!
//! `try!` is imported by the prelude, and is available everywhere.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use self::Result::{Ok, Err};
/// See the [`std::result`](index.html) module documentation for details.
#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Show, Hash)]
#[must_use]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub enum Result<T, E> {
/// Contains the success value
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Ok(T),
/// Contains the error value
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Err(E)
}
// Type implementation
/////////////////////////////////////////////////////////////////////////////
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, E> Result<T, E> {
/////////////////////////////////////////////////////////////////////////
// Querying the contained values
/// assert_eq!(x.is_ok(), false);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_ok(&self) -> bool {
match *self {
Ok(_) => true,
/// assert_eq!(x.is_err(), true);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_err(&self) -> bool {
!self.is_ok()
}
/// assert_eq!(x.ok(), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn ok(self) -> Option<T> {
match self {
Ok(x) => Some(x),
/// assert_eq!(x.err(), Some("Nothing here"));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn err(self) -> Option<E> {
match self {
Ok(_) => None,
/// assert_eq!(x.as_ref(), Err(&"Error"));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn as_ref(&self) -> Result<&T, &E> {
match *self {
Ok(ref x) => Ok(x),
/// assert_eq!(x.unwrap_err(), 0);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn as_mut(&mut self) -> Result<&mut T, &mut E> {
match *self {
Ok(ref mut x) => Ok(x),
/// assert!(x.as_mut_slice().is_empty());
/// ```
#[inline]
- #[unstable = "waiting for mut conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "waiting for mut conventions")]
pub fn as_mut_slice(&mut self) -> &mut [T] {
match *self {
Ok(ref mut x) => slice::mut_ref_slice(x),
/// assert!(sum == 10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn map<U, F: FnOnce(T) -> U>(self, op: F) -> Result<U,E> {
match self {
Ok(t) => Ok(op(t)),
/// assert_eq!(x.map_err(stringify), Err("error code: 13".to_string()));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn map_err<F, O: FnOnce(E) -> F>(self, op: O) -> Result<T,F> {
match self {
Ok(t) => Ok(t),
/// assert_eq!(x.iter().next(), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter { inner: self.as_ref().ok() }
}
/// assert_eq!(x.iter_mut().next(), None);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter_mut(&mut self) -> IterMut<T> {
IterMut { inner: self.as_mut().ok() }
}
/// assert_eq!(v, vec![]);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
IntoIter { inner: self.ok() }
}
/// assert_eq!(x.and(y), Ok("different result type"));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn and<U>(self, res: Result<U, E>) -> Result<U, E> {
match self {
Ok(_) => res,
/// assert_eq!(Err(3).and_then(sq).and_then(sq), Err(3));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn and_then<U, F: FnOnce(T) -> Result<U, E>>(self, op: F) -> Result<U, E> {
match self {
Ok(t) => op(t),
/// assert_eq!(x.or(y), Ok(2));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn or(self, res: Result<T, E>) -> Result<T, E> {
match self {
Ok(_) => self,
/// assert_eq!(Err(3).or_else(err).or_else(err), Err(3));
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn or_else<F, O: FnOnce(E) -> Result<T, F>>(self, op: O) -> Result<T, F> {
match self {
Ok(t) => Ok(t),
/// assert_eq!(x.unwrap_or(optb), optb);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap_or(self, optb: T) -> T {
match self {
Ok(t) => t,
/// assert_eq!(Err("foo").unwrap_or_else(count), 3u);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap_or_else<F: FnOnce(E) -> T>(self, op: F) -> T {
match self {
Ok(t) => t,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, E: Show> Result<T, E> {
/// Unwraps a result, yielding the content of an `Ok`.
///
/// x.unwrap(); // panics with `emergency failure`
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap(self) -> T {
match self {
Ok(t) => t,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Show, E> Result<T, E> {
/// Unwraps a result, yielding the content of an `Err`.
///
/// assert_eq!(x.unwrap_err(), "emergency failure");
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn unwrap_err(self) -> E {
match self {
Ok(t) =>
impl<T, E> AsSlice<T> for Result<T, E> {
/// Convert from `Result<T, E>` to `&[T]` (without copying)
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn as_slice<'a>(&'a self) -> &'a [T] {
match *self {
Ok(ref x) => slice::ref_slice(x),
/////////////////////////////////////////////////////////////////////////////
/// An iterator over a reference to the `Ok` variant of a `Result`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, T: 'a> { inner: Option<&'a T> }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<&'a T> { self.inner.take() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
impl<'a, T> Clone for Iter<'a, T> {
}
/// An iterator over a mutable reference to the `Ok` variant of a `Result`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, T: 'a> { inner: Option<&'a mut T> }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<&'a mut T> { self.inner.take() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
/// An iterator over the value in a `Ok` variant of a `Result`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<T> { inner: Option<T> }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Iterator for IntoIter<T> {
type Item = T;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> DoubleEndedIterator for IntoIter<T> {
#[inline]
fn next_back(&mut self) -> Option<T> { self.inner.take() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> ExactSizeIterator for IntoIter<T> {}
/////////////////////////////////////////////////////////////////////////////
// FromIterator
/////////////////////////////////////////////////////////////////////////////
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
/// Takes each element in the `Iterator`: if it is an `Err`, no further
/// elements are taken, and the `Err` is returned. Should no `Err` occur, a
/// If an `Err` is encountered, it is immediately returned.
/// Otherwise, the folded value is returned.
#[inline]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn fold<T,
V,
E,
#![allow(non_camel_case_types)]
#![allow(missing_docs)]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub i8, pub i8, pub i8, pub i8,
pub i8, pub i8, pub i8, pub i8);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub struct i16x8(pub i16, pub i16, pub i16, pub i16,
pub i16, pub i16, pub i16, pub i16);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub struct i32x4(pub i32, pub i32, pub i32, pub i32);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub struct i64x2(pub i64, pub i64);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub u8, pub u8, pub u8, pub u8,
pub u8, pub u8, pub u8, pub u8);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub struct u16x8(pub u16, pub u16, pub u16, pub u16,
pub u16, pub u16, pub u16, pub u16);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub struct u32x4(pub u32, pub u32, pub u32, pub u32);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub struct u64x2(pub u64, pub u64);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
pub struct f32x4(pub f32, pub f32, pub f32, pub f32);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[simd]
#[derive(Copy, Show)]
#[repr(C)]
//!
//! For more details `std::slice`.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "slice")]
// How this module is organized.
fn clone_from_slice(&mut self, &[Self::Item]) -> uint where Self::Item: Clone;
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<T> SliceExt for [T] {
type Item = T;
self.repr().data
}
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn binary_search_by<F>(&self, mut f: F) -> Result<uint, uint> where
F: FnMut(&T) -> Ordering
{
m >= n && needle == &self[(m-n)..]
}
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn binary_search(&self, x: &T) -> Result<uint, uint> where T: Ord {
self.binary_search_by(|p| p.cmp(x))
}
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn next_permutation(&mut self) -> bool where T: Ord {
// These cases only have 1 permutation each, so we can't do anything.
if self.len() < 2 { return false; }
true
}
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn prev_permutation(&mut self) -> bool where T: Ord {
// These cases only have 1 permutation each, so we can't do anything.
if self.len() < 2 { return false; }
////////////////////////////////////////////////////////////////////////////////
/// Data that is viewable as a slice.
-#[unstable = "will be replaced by slice syntax"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will be replaced by slice syntax")]
pub trait AsSlice<T> {
/// Work with `self` as a slice.
fn as_slice<'a>(&'a self) -> &'a [T];
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<T> AsSlice<T> for [T] {
#[inline(always)]
fn as_slice<'a>(&'a self) -> &'a [T] { self }
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<'a, T, U: ?Sized + AsSlice<T>> AsSlice<T> for &'a U {
#[inline(always)]
fn as_slice(&self) -> &[T] { AsSlice::as_slice(*self) }
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<'a, T, U: ?Sized + AsSlice<T>> AsSlice<T> for &'a mut U {
#[inline(always)]
fn as_slice(&self) -> &[T] { AsSlice::as_slice(*self) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Default for &'a [T] {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> &'a [T] { &[] }
}
// The shared definition of the `Iter` and `IterMut` iterators
macro_rules! iterator {
(struct $name:ident -> $ptr:ty, $elem:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for $name<'a, T> {
type Item = $elem;
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for $name<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<$elem> {
}
/// Immutable slice iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, T: 'a> {
ptr: *const T,
end: *const T,
marker: marker::ContravariantLifetime<'a>
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::Range<uint>> for Iter<'a, T> {
type Output = [T];
#[inline]
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::RangeTo<uint>> for Iter<'a, T> {
type Output = [T];
#[inline]
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::RangeFrom<uint>> for Iter<'a, T> {
type Output = [T];
#[inline]
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::FullRange> for Iter<'a, T> {
type Output = [T];
#[inline]
///
/// This has the same lifetime as the original slice, and so the
/// iterator can continue to be used while this exists.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn as_slice(&self) -> &'a [T] {
make_slice!(T => &'a [T]: self.ptr, self.end)
}
iterator!{struct Iter -> *const T, &'a T}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Clone for Iter<'a, T> {
fn clone(&self) -> Iter<'a, T> { *self }
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<'a, T> RandomAccessIterator for Iter<'a, T> {
#[inline]
fn indexable(&self) -> uint {
}
/// Mutable slice iterator.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, T: 'a> {
ptr: *mut T,
end: *mut T,
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::Range<uint>> for IterMut<'a, T> {
type Output = [T];
#[inline]
self.index(&ops::FullRange).index(index)
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::RangeTo<uint>> for IterMut<'a, T> {
type Output = [T];
#[inline]
self.index(&ops::FullRange).index(index)
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::RangeFrom<uint>> for IterMut<'a, T> {
type Output = [T];
#[inline]
self.index(&ops::FullRange).index(index)
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::Index<ops::FullRange> for IterMut<'a, T> {
type Output = [T];
#[inline]
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::IndexMut<ops::Range<uint>> for IterMut<'a, T> {
type Output = [T];
#[inline]
self.index_mut(&ops::FullRange).index_mut(index)
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::IndexMut<ops::RangeTo<uint>> for IterMut<'a, T> {
type Output = [T];
#[inline]
self.index_mut(&ops::FullRange).index_mut(index)
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::IndexMut<ops::RangeFrom<uint>> for IterMut<'a, T> {
type Output = [T];
#[inline]
self.index_mut(&ops::FullRange).index_mut(index)
}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl<'a, T> ops::IndexMut<ops::FullRange> for IterMut<'a, T> {
type Output = [T];
#[inline]
/// to consume the iterator. Consider using the `Slice` and
/// `SliceMut` implementations for obtaining slices with more
/// restricted lifetimes that do not consume the iterator.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn into_slice(self) -> &'a mut [T] {
make_slice!(T => &'a mut [T]: self.ptr, self.end)
}
iterator!{struct IterMut -> *mut T, &'a mut T}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
/// An internal abstraction over the splitting iterators, so that
/// An iterator over subslices separated by elements that match a predicate
/// function.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Split<'a, T:'a, P> where P: FnMut(&T) -> bool {
v: &'a [T],
pred: P,
}
// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, P> Clone for Split<'a, T, P> where P: Clone + FnMut(&T) -> bool {
fn clone(&self) -> Split<'a, T, P> {
Split {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, P> Iterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
type Item = &'a [T];
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, P> DoubleEndedIterator for Split<'a, T, P> where P: FnMut(&T) -> bool {
#[inline]
fn next_back(&mut self) -> Option<&'a [T]> {
/// An iterator over the subslices of the vector which are separated
/// by elements that match `pred`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool {
v: &'a mut [T],
pred: P,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, P> Iterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
type Item = &'a mut [T];
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> where
P: FnMut(&T) -> bool,
{
/// An iterator over subslices separated by elements that match a predicate
/// function, limited to a given number of splits.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<Split<'a, T, P>>
}
/// An iterator over subslices separated by elements that match a
/// predicate function, limited to a given number of splits, starting
/// from the end of the slice.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RSplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<Split<'a, T, P>>
}
/// An iterator over subslices separated by elements that match a predicate
/// function, limited to a given number of splits.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<SplitMut<'a, T, P>>
}
/// An iterator over subslices separated by elements that match a
/// predicate function, limited to a given number of splits, starting
/// from the end of the slice.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RSplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
inner: GenericSplitN<SplitMut<'a, T, P>>
}
macro_rules! forward_iterator {
($name:ident: $elem:ident, $iter_of:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, $elem, P> Iterator for $name<'a, $elem, P> where
P: FnMut(&T) -> bool
{
/// An iterator over overlapping subslices of length `size`.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Windows<'a, T:'a> {
v: &'a [T],
size: uint
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for Windows<'a, T> {
type Item = &'a [T];
/// When the slice len is not evenly divided by the chunk size, the last slice
/// of the iteration will be the remainder.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Chunks<'a, T:'a> {
v: &'a [T],
size: uint
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for Chunks<'a, T> {
type Item = &'a [T];
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for Chunks<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<&'a [T]> {
}
}
-#[unstable = "trait is experimental"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "trait is experimental")]
impl<'a, T> RandomAccessIterator for Chunks<'a, T> {
#[inline]
fn indexable(&self) -> uint {
/// 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
/// size, the last slice of the iteration will be the remainder.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct ChunksMut<'a, T:'a> {
v: &'a mut [T],
chunk_size: uint
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Iterator for ChunksMut<'a, T> {
type Item = &'a mut [T];
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> DoubleEndedIterator for ChunksMut<'a, T> {
#[inline]
fn next_back(&mut self) -> Option<&'a mut [T]> {
//
/// Converts a pointer to A into a slice of length 1 (without copying).
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn ref_slice<'a, A>(s: &'a A) -> &'a [A] {
unsafe {
transmute(RawSlice { data: s, len: 1 })
}
/// Converts a pointer to A into a slice of length 1 (without copying).
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn mut_ref_slice<'a, A>(s: &'a mut A) -> &'a mut [A] {
unsafe {
let ptr: *const A = transmute(s);
/// }
/// ```
#[inline]
-#[unstable = "should be renamed to from_raw_parts"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "should be renamed to from_raw_parts")]
pub unsafe fn from_raw_buf<'a, T>(p: &'a *const T, len: uint) -> &'a [T] {
transmute(RawSlice { data: *p, len: len })
}
/// not being able to provide a non-aliasing guarantee of the returned mutable
/// slice.
#[inline]
-#[unstable = "should be renamed to from_raw_parts_mut"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "should be renamed to from_raw_parts_mut")]
pub unsafe fn from_raw_mut_buf<'a, T>(p: &'a *mut T, len: uint) -> &'a mut [T] {
transmute(RawSlice { data: *p, len: len })
}
//
/// Operations on `[u8]`.
-#[unstable = "needs review"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "needs review")]
pub mod bytes {
use ptr;
use slice::SliceExt;
// Boilerplate traits
//
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<A, B> PartialEq<[B]> for [A] where A: PartialEq<B> {
fn eq(&self, other: &[B]) -> bool {
self.len() == other.len() &&
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Eq> Eq for [T] {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Ord> Ord for [T] {
fn cmp(&self, other: &[T]) -> Ordering {
order::cmp(self.iter(), other.iter())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: PartialOrd> PartialOrd for [T] {
#[inline]
fn partial_cmp(&self, other: &[T]) -> Option<Ordering> {
}
/// Extension methods for slices containing integers.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub trait IntSliceExt<U, S> {
/// Converts the slice to an immutable slice of unsigned integers with the same width.
fn as_unsigned<'a>(&'a self) -> &'a [U];
macro_rules! impl_int_slice {
($u:ty, $s:ty, $t:ty) => {
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
impl IntSliceExt<$u, $s> for [$t] {
#[inline]
fn as_unsigned(&self) -> &[$u] { unsafe { transmute(self) } }
}
};
($te:ty : $ti:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for $ti {
type Item = $te;
self.0.size_hint()
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> DoubleEndedIterator for $ti {
#[inline]
fn next_back(&mut self) -> Option<$te> {
}
};
(pattern $te:ty : $ti:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, P: CharEq> Iterator for $ti {
type Item = $te;
self.0.size_hint()
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, P: CharEq> DoubleEndedIterator for $ti {
#[inline]
fn next_back(&mut self) -> Option<$te> {
}
};
(pattern forward $te:ty : $ti:ty) => {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, P: CharEq> Iterator for $ti {
type Item = $te;
/// A trait to abstract the idea of creating a new instance of a type from a
/// string.
// FIXME(#17307): there should be an `E` associated type for a `Result` return
-#[unstable = "will return a Result once associated types are working"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "will return a Result once associated types are working")]
pub trait FromStr {
/// Parses a string `s` to return an optional value of this type. If the
/// string is ill-formatted, the None is returned.
/// Errors which can occur when attempting to interpret a byte slice as a `str`.
#[derive(Copy, Eq, PartialEq, Clone, Show)]
-#[unstable = "error enumeration recently added and definitions may be refined"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "error enumeration recently added and definitions may be refined")]
pub enum Utf8Error {
/// An invalid byte was detected at the byte offset given.
///
///
/// Returns `Err` if the slice is not utf-8 with a description as to why the
/// provided slice is not utf-8.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> {
try!(run_utf8_validation_iterator(&mut v.iter()));
Ok(unsafe { from_utf8_unchecked(v) })
/// Converts a slice of bytes to a string slice without checking
/// that the string contains valid UTF-8.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub unsafe fn from_utf8_unchecked<'a>(v: &'a [u8]) -> &'a str {
mem::transmute(v)
}
/// # Panics
///
/// This function will panic if the string pointed to by `s` is not valid UTF-8.
-#[deprecated = "use std::ffi::c_str_to_bytes + str::from_utf8"]
+#[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use std::ffi::c_str_to_bytes + str::from_utf8")]
pub unsafe fn from_c_str(s: *const i8) -> &'static str {
let s = s as *const u8;
let mut len = 0u;
}
/// Something that can be used to compare against a character
-#[unstable = "definition may change as pattern-related methods are stabilized"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "definition may change as pattern-related methods are stabilized")]
pub trait CharEq {
/// Determine if the splitter should split at the given character
fn matches(&mut self, char) -> bool;
///
/// Created with the method `.chars()`.
#[derive(Clone, Copy)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Chars<'a> {
iter: slice::Iter<'a, u8>
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Chars<'a> {
type Item = char;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> DoubleEndedIterator for Chars<'a> {
#[inline]
fn next_back(&mut self) -> Option<char> {
/// External iterator for a string's characters and their byte offsets.
/// Use with the `std::iter` module.
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct CharIndices<'a> {
front_offset: uint,
iter: Chars<'a>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for CharIndices<'a> {
type Item = (uint, char);
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> DoubleEndedIterator for CharIndices<'a> {
#[inline]
fn next_back(&mut self) -> Option<(uint, char)> {
/// Use with the `std::iter` module.
///
/// Created with `StrExt::bytes`
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[derive(Clone)]
pub struct Bytes<'a>(Map<&'a u8, u8, slice::Iter<'a, u8>, BytesDeref>);
delegate_iter!{exact u8 : Bytes<'a>}
}
/// An iterator over the lines of a string, separated by `\n`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Lines<'a> {
inner: CharSplits<'a, char>,
}
/// An iterator over the lines of a string, separated by either `\n` or (`\r\n`).
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct LinesAny<'a> {
inner: Map<&'a str, &'a str, Lines<'a>, fn(&str) -> &str>,
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, Sep: CharEq> Iterator for CharSplits<'a, Sep> {
type Item = &'a str;
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, Sep: CharEq> DoubleEndedIterator for CharSplits<'a, Sep> {
#[inline]
fn next_back(&mut self) -> Option<&'a str> {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, Sep: CharEq> Iterator for CharSplitsN<'a, Sep> {
type Item = &'a str;
/// An iterator over the start and end indices of the matches of a
/// substring within a larger string
#[derive(Clone)]
-#[unstable = "type may be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "type may be removed")]
pub struct MatchIndices<'a> {
// constants
haystack: &'a str,
/// An iterator over the substrings of a string separated by a given
/// search string
#[derive(Clone)]
-#[unstable = "type may be removed"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "type may be removed")]
pub struct SplitStr<'a> {
it: MatchIndices<'a>,
last_end: uint,
finished: bool
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for MatchIndices<'a> {
type Item = (uint, uint);
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for SplitStr<'a> {
type Item = &'a str;
/// the next `char` in a string. This can be used as a data structure
/// for iterating over the UTF-8 bytes of a string.
#[derive(Copy)]
-#[unstable = "naming is uncertain with container conventions"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "naming is uncertain with container conventions")]
pub struct CharRange {
/// Current `char`
pub ch: char,
use ops;
use str::{StrExt, eq_slice};
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Ord for str {
#[inline]
fn cmp(&self, other: &str) -> Ordering {
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialEq for str {
#[inline]
fn eq(&self, other: &str) -> bool {
fn ne(&self, other: &str) -> bool { !(*self).eq(other) }
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl Eq for str {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl PartialOrd for str {
#[inline]
fn partial_cmp(&self, other: &str) -> Option<Ordering> {
}
/// Any string that can be represented as a slice
-#[unstable = "Instead of taking this bound generically, this trait will be \
- replaced with one of slicing syntax, deref coercions, or \
- a more generic conversion trait"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Instead of taking this bound generically, this trait will be \
+ replaced with one of slicing syntax, deref coercions, or \
+ a more generic conversion trait")]
pub trait Str {
/// Work with `self` as a slice.
fn as_slice<'a>(&'a self) -> &'a str;
/// Return type of `StrExt::split`
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Split<'a, P>(CharSplits<'a, P>);
delegate_iter!{pattern &'a str : Split<'a, P>}
/// Return type of `StrExt::split_terminator`
#[derive(Clone)]
-#[unstable = "might get removed in favour of a constructor method on Split"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "might get removed in favour of a constructor method on Split")]
pub struct SplitTerminator<'a, P>(CharSplits<'a, P>);
delegate_iter!{pattern &'a str : SplitTerminator<'a, P>}
/// Return type of `StrExt::splitn`
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SplitN<'a, P>(CharSplitsN<'a, P>);
delegate_iter!{pattern forward &'a str : SplitN<'a, P>}
/// Return type of `StrExt::rsplitn`
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RSplitN<'a, P>(CharSplitsN<'a, P>);
delegate_iter!{pattern forward &'a str : RSplitN<'a, P>}
fn parse<T: FromStr>(&self) -> Option<T> { FromStr::from_str(self) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Default for &'a str {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> &'a str { "" }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for Lines<'a> {
type Item = &'a str;
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> DoubleEndedIterator for Lines<'a> {
#[inline]
fn next_back(&mut self) -> Option<&'a str> { self.inner.next_back() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Iterator for LinesAny<'a> {
type Item = &'a str;
fn size_hint(&self) -> (uint, Option<uint>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> DoubleEndedIterator for LinesAny<'a> {
#[inline]
fn next_back(&mut self) -> Option<&'a str> { self.inner.next_back() }
//! * `Ord`
//! * `Default`
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use clone::Clone;
use cmp::*;
}
)+) => {
$(
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<$($T:Clone),+> Clone for ($($T,)+) {
fn clone(&self) -> ($($T,)+) {
($(e!(self.$idx.clone()),)+)
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<$($T:PartialEq),+> PartialEq for ($($T,)+) {
#[inline]
fn eq(&self, other: &($($T,)+)) -> bool {
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<$($T:Eq),+> Eq for ($($T,)+) {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<$($T:PartialOrd + PartialEq),+> PartialOrd for ($($T,)+) {
#[inline]
fn partial_cmp(&self, other: &($($T,)+)) -> Option<Ordering> {
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<$($T:Ord),+> Ord for ($($T,)+) {
#[inline]
fn cmp(&self, other: &($($T,)+)) -> Ordering {
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
impl<$($T:Default),+> Default for ($($T,)+) {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn default() -> ($($T,)+) {
($({ let x: $T = Default::default(); x},)+)
//! [mz]: https://code.google.com/p/miniz/
#![crate_name = "flate"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![allow(unknown_features)] #![feature(int_uint)]
#![allow(unstable)]
//! generated instead.
#![crate_name = "fmt_macros"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
//! ```
#![crate_name = "getopts"]
-#![unstable = "use the crates.io `getopts` library instead"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use the crates.io `getopts` library instead")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
impl Fail {
/// Convert a `Fail` enum into an error string.
- #[deprecated="use `fmt::String` (`{}` format specifier)"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `fmt::String` (`{}` format specifier)")]
pub fn to_err_msg(self) -> String {
self.to_string()
}
//! * [DOT language](http://www.graphviz.org/doc/info/lang.html)
#![crate_name = "graphviz"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![deprecated = "use std::vec::CowVec"]
+#![deprecated(feature = "oldstuff", since = "1.0.0", reason = "use std::vec::CowVec")]
pub use self::MaybeOwnedVector::*;
#![crate_name = "libc"]
#![crate_type = "rlib"]
-#![cfg_attr(not(feature = "cargo-build"), unstable)]
+#![cfg_attr(not(feature = "cargo-build"),
+ unstable(feature = "unnamed_feature", since = "1.0.0"))]
#![cfg_attr(not(feature = "cargo-build"), staged_api)]
#![allow(unknown_features)] #![feature(int_uint)]
#![allow(unstable)]
//! if logging is disabled, none of the components of the log will be executed.
#![crate_name = "log"]
-#![unstable = "use the crates.io `log` library instead"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use the crates.io `log` library instead")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
//! internally. The `IndependentSample` trait is for generating values
//! that do not need to record state.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use core::prelude::*;
use core::num::{Float, Int};
#![allow(unknown_features)] #![feature(int_uint)]
#![allow(unstable)]
#![no_std]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#[macro_use]
*rng = Default::default();
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Default for ReseedWithDefault {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> ReseedWithDefault { ReseedWithDefault }
}
//! http://www.matroska.org/technical/specs/rfc/index.html
#![crate_name = "rbml"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
#![crate_name = "regex"]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
-#![unstable = "use the crates.io `regex` library instead"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use the crates.io `regex` library instead")]
#![staged_api]
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
}
#[doc(hidden)]
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn names_iter<'a>(&'a self) -> NamesIter<'a> {
match *self {
Native(ref n) => NamesIterNative(n.names.iter()),
//! This API is completely unstable and subject to change.
#![crate_name = "rustc"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
/// Checks for use of items with `#[deprecated]`, `#[unstable]` and
/// `#[unstable]` attributes, or no stability attribute.
#[derive(Copy)]
-pub struct Stability { this_crate_staged: bool }
+pub struct Stability;
impl Stability {
- pub fn new() -> Stability { Stability { this_crate_staged: false } }
-
fn lint(&self, cx: &Context, id: ast::DefId, span: Span) {
+ if !stability::is_staged_api(cx.tcx, id) { return }
+
let ref stability = stability::lookup(cx.tcx, id);
let cross_crate = !ast_util::is_local(id);
- let staged = (!cross_crate && self.this_crate_staged)
- || (cross_crate && stability::is_staged_api(cx.tcx, id));
-
- if !staged { return }
// stability attributes are promises made across crates; only
// check DEPRECATED for crate-local usage.
fn output(cx: &Context, span: Span, stability: &Option<attr::Stability>,
lint: &'static Lint, label: &'static str) {
let msg = match *stability {
- Some(attr::Stability { text: Some(ref s), .. }) => {
+ Some(attr::Stability { reason: Some(ref s), .. }) => {
format!("use of {} item: {}", label, *s)
}
_ => format!("use of {} item", label)
lint_array!(DEPRECATED, UNSTABLE)
}
- fn check_crate(&mut self, _: &Context, c: &ast::Crate) {
- // Just mark the #[staged_api] attribute used, though nothing else is done
- // with it during this pass over the source.
- for attr in c.attrs.iter() {
- if attr.name().get() == "staged_api" {
- match attr.node.value.node {
- ast::MetaWord(_) => {
- attr::mark_used(attr);
- self.this_crate_staged = true;
- }
- _ => (/*pass*/)
- }
- }
- }
- }
-
fn check_view_item(&mut self, cx: &Context, item: &ast::ViewItem) {
// compiler-generated `extern crate` statements have a dummy span.
if item.span == DUMMY_SP { return }
UnusedAllocation,
MissingCopyImplementations,
UnstableFeatures,
+ Stability,
);
add_builtin_with_new!(sess,
TypeLimits,
RawPointerDerive,
MissingDoc,
- Stability,
);
add_lint_group!(sess, "bad_style",
//! A pass that annotates every item and method with its stability level,
//! propagating default levels lexically from parent to children ast nodes.
+use session::Session;
use middle::ty;
use metadata::csearch;
use syntax::codemap::Span;
use syntax::ast::{Item, RequiredMethod, ProvidedMethod, TraitItem};
use syntax::ast::{TypeMethod, Method, Generics, StructField, TypeTraitItem};
use syntax::ast_util::is_local;
-use syntax::attr::Stability;
+use syntax::attr::{Stability, AttrMetaMethods};
use syntax::visit::{FnKind, FkMethod, Visitor};
use util::nodemap::{NodeMap, DefIdMap};
use util::ppaux::Repr;
/// A stability index, giving the stability level for items and methods.
pub struct Index {
+ // Indicates whether this crate has #![staged_api]
+ staged_api: bool,
// stability for crate-local items; unmarked stability == no entry
local: NodeMap<Stability>,
// cache for extern-crate items; unmarked stability == entry with None
}
// A private tree-walker for producing an Index.
-struct Annotator {
+struct Annotator<'a> {
+ sess: &'a Session,
index: Index,
parent: Option<Stability>
}
-impl Annotator {
+impl<'a> Annotator<'a> {
// Determine the stability for a node based on its attributes and inherited
// stability. The stability is recorded in the index and used as the parent.
fn annotate<F>(&mut self, id: NodeId, use_parent: bool,
attrs: &Vec<Attribute>, f: F) where
F: FnOnce(&mut Annotator),
{
- match attr::find_stability(attrs.as_slice()) {
+ match attr::find_stability(self.sess.diagnostic(), attrs.as_slice()) {
Some(stab) => {
self.index.local.insert(id, stab.clone());
- // Don't inherit #[stable]
+ // Don't inherit #[stable(feature = "grandfathered", since = "1.0.0")]
if stab.level != attr::Stable {
let parent = replace(&mut self.parent, Some(stab));
f(self);
}
}
-impl<'v> Visitor<'v> for Annotator {
+impl<'a, 'v> Visitor<'v> for Annotator<'a> {
fn visit_item(&mut self, i: &Item) {
// FIXME (#18969): the following is a hack around the fact
// that we cannot currently annotate the stability of
impl Index {
/// Construct the stability index for a crate being compiled.
- pub fn build(krate: &Crate) -> Index {
+ pub fn build(sess: &Session, krate: &Crate) -> Index {
+ let mut staged_api = false;
+ for attr in krate.attrs.iter() {
+ if attr.name().get() == "staged_api" {
+ match attr.node.value.node {
+ ast::MetaWord(_) => {
+ attr::mark_used(attr);
+ staged_api = true;
+ }
+ _ => (/*pass*/)
+ }
+ }
+ }
+ let index = Index {
+ staged_api: staged_api,
+ local: NodeMap(),
+ extern_cache: DefIdMap()
+ };
+ if !staged_api {
+ return index;
+ }
let mut annotator = Annotator {
- index: Index {
- local: NodeMap(),
- extern_cache: DefIdMap()
- },
+ sess: sess,
+ index: index,
parent: None
};
annotator.annotate(ast::CRATE_NODE_ID, true, &krate.attrs,
is_staged_api(tcx, trait_method_id)
}
_ if is_local(id) => {
- // Unused case
- unreachable!()
+ tcx.stability.borrow().staged_api
}
_ => {
csearch::is_staged_api(&tcx.sess.cstore, id)
//! build speedups.
#![crate_name = "rustc_back"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
// except according to those terms.
#![crate_name = "rustc_bitflags"]
-#![unstable]
#![staged_api]
#![crate_type = "rlib"]
#![no_std]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
//! A typesafe bitmask flag generator.
// except according to those terms.
#![crate_name = "rustc_borrowck"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
middle::check_loop::check_crate(&sess, krate));
let stability_index = time(time_passes, "stability index", (), |_|
- stability::Index::build(krate));
+ stability::Index::build(&sess, krate));
time(time_passes, "static item recursion checking", (), |_|
middle::check_static_recursion::check_crate(&sess, krate, &def_map, &ast_map));
//! This API is completely unstable and subject to change.
#![crate_name = "rustc_driver"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
resolve::resolve_crate(&sess, &ast_map, &lang_items, krate, resolve::MakeGlobMap::No);
let named_region_map = resolve_lifetime::krate(&sess, krate, &def_map);
let region_map = region::resolve_crate(&sess, krate);
- let stability_index = stability::Index::build(krate);
+ let stability_index = stability::Index::build(&sess, krate);
let arenas = ty::CtxtArenas::new();
let tcx = ty::mk_ctxt(sess,
&arenas,
#![allow(dead_code)]
#![crate_name = "rustc_llvm"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
// except according to those terms.
#![crate_name = "rustc_privacy"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
// except according to those terms.
#![crate_name = "rustc_resolve"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
//! This API is completely unstable and subject to change.
#![crate_name = "rustc_trans"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
*/
#![crate_name = "rustc_typeck"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
use syntax::ast_util::PostExpansionMethod;
use syntax::attr;
use syntax::attr::{AttributeMethods, AttrMetaMethods};
+use syntax::codemap;
use syntax::codemap::{DUMMY_SP, Pos, Spanned};
use syntax::parse::token::{self, InternedString, special_idents};
use syntax::ptr::P;
}
}
fn meta_item_list<'a>(&'a self) -> Option<&'a [P<ast::MetaItem>]> { None }
+ fn span(&self) -> codemap::Span { unimplemented!() }
}
impl<'a> attr::AttrMetaMethods for &'a Attribute {
fn name(&self) -> InternedString { (**self).name() }
fn value_str(&self) -> Option<InternedString> { (**self).value_str() }
fn meta_item_list(&self) -> Option<&[P<ast::MetaItem>]> { None }
+ fn span(&self) -> codemap::Span { unimplemented!() }
}
#[derive(Clone, RustcEncodable, RustcDecodable, PartialEq, Show)]
#[derive(Clone, RustcEncodable, RustcDecodable)]
pub struct Stability {
pub level: attr::StabilityLevel,
- pub text: String
+ pub feature: String,
+ pub since: String,
+ pub reason: String
}
impl Clean<Stability> for attr::Stability {
fn clean(&self, _: &DocContext) -> Stability {
Stability {
level: self.level,
- text: self.text.as_ref().map_or("".to_string(),
- |interned| interned.get().to_string()),
+ feature: self.feature.get().to_string(),
+ since: self.since.get().to_string(),
+ reason: self.reason.as_ref().map_or("".to_string(),
+ |interned| interned.get().to_string()),
}
}
}
Some(ref stability) => {
write!(f, "<a class='stability {lvl}' title='{reason}'>{lvl}</a>",
lvl = stability.level,
- reason = stability.text)
+ reason = stability.reason)
}
None => Ok(())
}
Some(ref stability) => {
write!(f, "<a class='stability {lvl}' title='{lvl}{colon}{reason}'></a>",
lvl = stability.level,
- colon = if stability.text.len() > 0 { ": " } else { "" },
- reason = stability.text)
+ colon = if stability.reason.len() > 0 { ": " } else { "" },
+ reason = stability.reason)
}
None => {
write!(f, "<a class='stability Unmarked' title='No stability level'></a>")
// except according to those terms.
#![crate_name = "rustdoc"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
*/
#![crate_name = "serialize"]
-#![unstable = "deprecated in favor of rustc-serialize on crates.io"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "deprecated in favor of rustc-serialize on crates.io")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
//! Operations on ASCII strings and characters
-#![unstable = "unsure about placement and naming"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about placement and naming")]
use iter::IteratorExt;
use ops::FnMut;
use vec::Vec;
/// Extension methods for ASCII-subset only operations on owned strings
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
pub trait OwnedAsciiExt {
/// Convert the string to ASCII upper case:
/// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
}
/// Extension methods for ASCII-subset only operations on string slices
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
pub trait AsciiExt<T = Self> {
/// Check if within the ASCII range.
fn is_ascii(&self) -> bool;
fn eq_ignore_ascii_case(&self, other: &Self) -> bool;
}
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
impl AsciiExt<String> for str {
#[inline]
fn is_ascii(&self) -> bool {
}
}
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
impl OwnedAsciiExt for String {
#[inline]
fn into_ascii_uppercase(self) -> String {
}
}
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
impl AsciiExt<Vec<u8>> for [u8] {
#[inline]
fn is_ascii(&self) -> bool {
}
}
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
impl OwnedAsciiExt for Vec<u8> {
#[inline]
fn into_ascii_uppercase(mut self) -> Vec<u8> {
}
}
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
impl AsciiExt for u8 {
#[inline]
fn is_ascii(&self) -> bool {
}
}
-#[unstable = "would prefer to do this in a more general way"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "would prefer to do this in a more general way")]
impl AsciiExt for char {
#[inline]
fn is_ascii(&self) -> bool {
/// - Any other chars in the range [0x20,0x7e] are not escaped.
/// - Any other chars are given hex escapes.
/// - Unicode escapes are never generated by this function.
-#[unstable = "needs to be updated to use an iterator"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "needs to be updated to use an iterator")]
pub fn escape_default<F>(c: u8, mut f: F) where
F: FnMut(u8),
{
//! The boolean type
#![doc(primitive = "bool")]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
/// }
/// ```
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct HashMap<K, V, S = RandomState> {
// All hashes are keyed on these values, to prevent hash collision attacks.
hash_state: S,
/// let mut map: HashMap<&str, int> = HashMap::new();
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> HashMap<K, V, RandomState> {
Default::default()
}
/// let mut map: HashMap<&str, int> = HashMap::with_capacity(10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(capacity: uint) -> HashMap<K, V, RandomState> {
HashMap::with_capacity_and_hash_state(capacity, Default::default())
}
/// map.insert(1i, 2u);
/// ```
#[inline]
- #[unstable = "hasher stuff is unclear"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "hasher stuff is unclear")]
pub fn with_hash_state(hash_state: S) -> HashMap<K, V, S> {
HashMap {
hash_state: hash_state,
/// map.insert(1i, 2u);
/// ```
#[inline]
- #[unstable = "hasher stuff is unclear"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "hasher stuff is unclear")]
pub fn with_capacity_and_hash_state(capacity: uint, hash_state: S)
-> HashMap<K, V, S> {
let resize_policy = DefaultResizePolicy::new();
/// assert!(map.capacity() >= 100);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint {
self.resize_policy.usable_capacity(self.table.capacity())
}
/// let mut map: HashMap<&str, int> = HashMap::new();
/// map.reserve(10);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve(&mut self, additional: uint) {
let new_size = self.len().checked_add(additional).expect("capacity overflow");
let min_cap = self.resize_policy.min_capacity(new_size);
/// map.shrink_to_fit();
/// assert!(map.capacity() >= 2);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn shrink_to_fit(&mut self) {
let min_capacity = self.resize_policy.min_capacity(self.len());
let min_capacity = max(min_capacity.next_power_of_two(), INITIAL_CAPACITY);
/// println!("{}", key);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn keys<'a>(&'a self) -> Keys<'a, K, V> {
fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((&'a K,&'a V)) -> &'a K = first; // coerce to fn ptr
/// println!("{}", key);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn values<'a>(&'a self) -> Values<'a, K, V> {
fn second<A, B>((_, b): (A, B)) -> B { b }
let second: fn((&'a K,&'a V)) -> &'a V = second; // coerce to fn ptr
/// println!("key: {} val: {}", key, val);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<K, V> {
Iter { inner: self.table.iter() }
}
/// println!("key: {} val: {}", key, val);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter_mut(&mut self) -> IterMut<K, V> {
IterMut { inner: self.table.iter_mut() }
}
/// // Not possible with .iter()
/// let vec: Vec<(&str, int)> = map.into_iter().collect();
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<K, V> {
fn last_two<A, B, C>((_, b, c): (A, B, C)) -> (B, C) { (b, c) }
let last_two: fn((SafeHash, K, V)) -> (K, V) = last_two;
}
/// Gets the given key's corresponding entry in the map for in-place manipulation.
- #[unstable = "precise API still being fleshed out"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still being fleshed out")]
pub fn entry<'a>(&'a mut self, key: K) -> Entry<'a, K, V>
{
// Gotta resize now.
/// a.insert(1u, "a");
/// assert_eq!(a.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.table.size() }
/// Return true if the map contains no elements.
/// assert!(!a.is_empty());
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.len() == 0 }
/// Clears the map, returning all key-value pairs as an iterator. Keeps the
/// assert!(a.is_empty());
/// ```
#[inline]
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn drain(&mut self) -> Drain<K, V> {
fn last_two<A, B, C>((_, b, c): (A, B, C)) -> (B, C) { (b, c) }
let last_two: fn((SafeHash, K, V)) -> (K, V) = last_two; // coerce to fn pointer
/// a.clear();
/// assert!(a.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
pub fn clear(&mut self) {
self.drain();
/// assert_eq!(map.get(&1), Some(&"a"));
/// assert_eq!(map.get(&2), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
where Q: Hash<H> + Eq + BorrowFrom<K>
{
/// assert_eq!(map.contains_key(&1), true);
/// assert_eq!(map.contains_key(&2), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool
where Q: Hash<H> + Eq + BorrowFrom<K>
{
/// }
/// assert_eq!(map[1], "b");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>
where Q: Hash<H> + Eq + BorrowFrom<K>
{
/// assert_eq!(map.insert(37, "c"), Some("b"));
/// assert_eq!(map[37], "c");
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, k: K, v: V) -> Option<V> {
let hash = self.make_hash(&k);
self.reserve(1);
/// assert_eq!(map.remove(&1), Some("a"));
/// assert_eq!(map.remove(&1), None);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<V>
where Q: Hash<H> + Eq + BorrowFrom<K>
{
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V, S, H> Eq for HashMap<K, V, S>
where K: Eq + Hash<H>, V: Eq,
S: HashState<Hasher=H>,
H: hash::Hasher<Output=u64>
{}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V, S, H> Show for HashMap<K, V, S>
where K: Eq + Hash<H> + Show, V: Show,
S: HashState<Hasher=H>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V, S, H> Default for HashMap<K, V, S>
where K: Eq + Hash<H>,
S: HashState<Hasher=H> + Default,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, Q: ?Sized, V, S, H> Index<Q> for HashMap<K, V, S>
where K: Eq + Hash<H>,
Q: Eq + Hash<H> + BorrowFrom<K>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V, S, H, Q: ?Sized> IndexMut<Q> for HashMap<K, V, S>
where K: Eq + Hash<H>,
Q: Eq + Hash<H> + BorrowFrom<K>,
}
/// HashMap iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, K: 'a, V: 'a> {
inner: table::Iter<'a, K, V>
}
}
/// HashMap mutable values iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IterMut<'a, K: 'a, V: 'a> {
inner: table::IterMut<'a, K, V>
}
/// HashMap move iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<K, V> {
inner: iter::Map<
(SafeHash, K, V),
}
/// HashMap keys iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Keys<'a, K: 'a, V: 'a> {
inner: Map<(&'a K, &'a V), &'a K, Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a K>
}
}
/// HashMap values iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Values<'a, K: 'a, V: 'a> {
inner: Map<(&'a K, &'a V), &'a V, Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a V>
}
}
/// HashMap drain iterator
-#[unstable = "matches collection reform specification, waiting for dust to settle"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub struct Drain<'a, K: 'a, V: 'a> {
inner: iter::Map<
(SafeHash, K, V),
}
/// A view into a single occupied location in a HashMap
-#[unstable = "precise API still being fleshed out"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still being fleshed out")]
pub struct OccupiedEntry<'a, K: 'a, V: 'a> {
elem: FullBucket<K, V, &'a mut RawTable<K, V>>,
}
/// A view into a single empty location in a HashMap
-#[unstable = "precise API still being fleshed out"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still being fleshed out")]
pub struct VacantEntry<'a, K: 'a, V: 'a> {
hash: SafeHash,
key: K,
}
/// A view into a single location in a map, which may be vacant or occupied
-#[unstable = "precise API still being fleshed out"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "precise API still being fleshed out")]
pub enum Entry<'a, K: 'a, V: 'a> {
/// An occupied Entry
Occupied(OccupiedEntry<'a, K, V>),
NoElem(EmptyBucket<K, V, M>),
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for Iter<'a, K, V> {
type Item = (&'a K, &'a V);
#[inline] fn next(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next() }
#[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {
#[inline] fn len(&self) -> usize { self.inner.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for IterMut<'a, K, V> {
type Item = (&'a K, &'a mut V);
#[inline] fn next(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next() }
#[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
#[inline] fn len(&self) -> usize { self.inner.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V> Iterator for IntoIter<K, V> {
type Item = (K, V);
#[inline] fn next(&mut self) -> Option<(K, V)> { self.inner.next() }
#[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V> ExactSizeIterator for IntoIter<K, V> {
#[inline] fn len(&self) -> usize { self.inner.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for Keys<'a, K, V> {
type Item = &'a K;
#[inline] fn next(&mut self) -> Option<(&'a K)> { self.inner.next() }
#[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
#[inline] fn len(&self) -> usize { self.inner.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for Values<'a, K, V> {
type Item = &'a V;
#[inline] fn next(&mut self) -> Option<(&'a V)> { self.inner.next() }
#[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
#[inline] fn len(&self) -> usize { self.inner.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> Iterator for Drain<'a, K, V> {
type Item = (K, V);
#[inline] fn next(&mut self) -> Option<(K, V)> { self.inner.next() }
#[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K, V> ExactSizeIterator for Drain<'a, K, V> {
#[inline] fn len(&self) -> usize { self.inner.len() }
}
-#[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
impl<'a, K, V> Entry<'a, K, V> {
/// Returns a mutable reference to the entry if occupied, or the VacantEntry if vacant
pub fn get(self) -> Result<&'a mut V, VacantEntry<'a, K, V>> {
}
}
-#[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
impl<'a, K, V> OccupiedEntry<'a, K, V> {
/// Gets a reference to the value in the entry
pub fn get(&self) -> &V {
}
}
-#[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform v2 specification, waiting for dust to settle")]
impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {
/// Sets the value of the entry with the VacantEntry's key,
/// and returns a mutable reference to it
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V, S, H> FromIterator<(K, V)> for HashMap<K, V, S>
where K: Eq + Hash<H>,
S: HashState<Hasher=H> + Default,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K, V, S, H> Extend<(K, V)> for HashMap<K, V, S>
where K: Eq + Hash<H>,
S: HashState<Hasher=H>,
/// instances are unlikely to produce the same result for the same values.
#[derive(Clone)]
#[allow(missing_copy_implementations)]
-#[unstable = "hashing an hash maps may be altered"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "hashing an hash maps may be altered")]
pub struct RandomState {
k0: u64,
k1: u64,
}
-#[unstable = "hashing an hash maps may be altered"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "hashing an hash maps may be altered")]
impl RandomState {
/// Construct a new `RandomState` that is initialized with random keys.
#[inline]
}
}
-#[unstable = "hashing an hash maps may be altered"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "hashing an hash maps may be altered")]
impl HashState for RandomState {
type Hasher = Hasher;
fn hasher(&self) -> Hasher {
}
}
-#[unstable = "hashing an hash maps may be altered"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "hashing an hash maps may be altered")]
impl Default for RandomState {
#[inline]
fn default() -> RandomState {
/// }
/// ```
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct HashSet<T, S = RandomState> {
map: HashMap<T, (), S>
}
/// let mut set: HashSet<int> = HashSet::new();
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> HashSet<T, RandomState> {
HashSet::with_capacity(INITIAL_CAPACITY)
}
/// let mut set: HashSet<int> = HashSet::with_capacity(10);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with_capacity(capacity: uint) -> HashSet<T, RandomState> {
HashSet { map: HashMap::with_capacity(capacity) }
}
/// set.insert(2u);
/// ```
#[inline]
- #[unstable = "hasher stuff is unclear"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "hasher stuff is unclear")]
pub fn with_hash_state(hash_state: S) -> HashSet<T, S> {
HashSet::with_capacity_and_hash_state(INITIAL_CAPACITY, hash_state)
}
/// set.insert(1i);
/// ```
#[inline]
- #[unstable = "hasher stuff is unclear"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "hasher stuff is unclear")]
pub fn with_capacity_and_hash_state(capacity: uint, hash_state: S)
-> HashSet<T, S> {
HashSet {
/// assert!(set.capacity() >= 100);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn capacity(&self) -> uint {
self.map.capacity()
}
/// let mut set: HashSet<int> = HashSet::new();
/// set.reserve(10);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn reserve(&mut self, additional: uint) {
self.map.reserve(additional)
}
/// set.shrink_to_fit();
/// assert!(set.capacity() >= 2);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn shrink_to_fit(&mut self) {
self.map.shrink_to_fit()
}
/// println!("{}", x);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter { iter: self.map.keys() }
}
/// println!("{}", x);
/// }
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn into_iter(self) -> IntoIter<T> {
fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((T, ())) -> T = first;
/// let diff: HashSet<int> = b.difference(&a).map(|&x| x).collect();
/// assert_eq!(diff, [4i].iter().map(|&x| x).collect());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn difference<'a>(&'a self, other: &'a HashSet<T, S>) -> Difference<'a, T, S> {
Difference {
iter: self.iter(),
/// assert_eq!(diff1, diff2);
/// assert_eq!(diff1, [1i, 4].iter().map(|&x| x).collect());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn symmetric_difference<'a>(&'a self, other: &'a HashSet<T, S>)
-> SymmetricDifference<'a, T, S> {
SymmetricDifference { iter: self.difference(other).chain(other.difference(self)) }
/// let diff: HashSet<int> = a.intersection(&b).map(|&x| x).collect();
/// assert_eq!(diff, [2i, 3].iter().map(|&x| x).collect());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn intersection<'a>(&'a self, other: &'a HashSet<T, S>) -> Intersection<'a, T, S> {
Intersection {
iter: self.iter(),
/// let diff: HashSet<int> = a.union(&b).map(|&x| x).collect();
/// assert_eq!(diff, [1i, 2, 3, 4].iter().map(|&x| x).collect());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn union<'a>(&'a self, other: &'a HashSet<T, S>) -> Union<'a, T, S> {
Union { iter: self.iter().chain(other.difference(self)) }
}
/// v.insert(1u);
/// assert_eq!(v.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn len(&self) -> uint { self.map.len() }
/// Returns true if the set contains no elements
/// v.insert(1u);
/// assert!(!v.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_empty(&self) -> bool { self.map.len() == 0 }
/// Clears the set, returning all elements in an iterator.
#[inline]
- #[unstable = "matches collection reform specification, waiting for dust to settle"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "matches collection reform specification, waiting for dust to settle")]
pub fn drain(&mut self) -> Drain<T> {
fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((T, ())) -> T = first; // coerce to fn pointer
/// v.clear();
/// assert!(v.is_empty());
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn clear(&mut self) { self.map.clear() }
/// Returns `true` if the set contains a value.
/// assert_eq!(set.contains(&1), true);
/// assert_eq!(set.contains(&4), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
where Q: BorrowFrom<T> + Hash<H> + Eq
{
/// b.insert(1);
/// assert_eq!(a.is_disjoint(&b), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_disjoint(&self, other: &HashSet<T, S>) -> bool {
self.iter().all(|v| !other.contains(v))
}
/// set.insert(4);
/// assert_eq!(set.is_subset(&sup), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_subset(&self, other: &HashSet<T, S>) -> bool {
self.iter().all(|v| other.contains(v))
}
/// assert_eq!(set.is_superset(&sub), true);
/// ```
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_superset(&self, other: &HashSet<T, S>) -> bool {
other.is_subset(self)
}
/// assert_eq!(set.insert(2), false);
/// assert_eq!(set.len(), 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn insert(&mut self, value: T) -> bool { self.map.insert(value, ()).is_none() }
/// Removes a value from the set. Returns `true` if the value was
/// assert_eq!(set.remove(&2), true);
/// assert_eq!(set.remove(&2), false);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool
where Q: BorrowFrom<T> + Hash<H> + Eq
{
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, S, H> PartialEq for HashSet<T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, S, H> Eq for HashSet<T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H>,
H: hash::Hasher<Output=u64>
{}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, S, H> fmt::Show for HashSet<T, S>
where T: Eq + Hash<H> + fmt::Show,
S: HashState<Hasher=H>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, S, H> FromIterator<T> for HashSet<T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H> + Default,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, S, H> Extend<T> for HashSet<T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T, S, H> Default for HashSet<T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H> + Default,
H: hash::Hasher<Output=u64>
{
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn default() -> HashSet<T, S> {
HashSet::with_hash_state(Default::default())
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T, S, H> BitOr<&'b HashSet<T, S>> for &'a HashSet<T, S>
where T: Eq + Hash<H> + Clone,
S: HashState<Hasher=H> + Default,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T, S, H> BitAnd<&'b HashSet<T, S>> for &'a HashSet<T, S>
where T: Eq + Hash<H> + Clone,
S: HashState<Hasher=H> + Default,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T, S, H> BitXor<&'b HashSet<T, S>> for &'a HashSet<T, S>
where T: Eq + Hash<H> + Clone,
S: HashState<Hasher=H> + Default,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, 'b, T, S, H> Sub<&'b HashSet<T, S>> for &'a HashSet<T, S>
where T: Eq + Hash<H> + Clone,
S: HashState<Hasher=H> + Default,
}
/// HashSet iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, K: 'a> {
iter: Keys<'a, K, ()>
}
/// HashSet move iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct IntoIter<K> {
iter: Map<(K, ()), K, map::IntoIter<K, ()>, fn((K, ())) -> K>
}
/// HashSet drain iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Drain<'a, K: 'a> {
iter: Map<(K, ()), K, map::Drain<'a, K, ()>, fn((K, ())) -> K>,
}
/// Intersection iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Intersection<'a, T: 'a, S: 'a> {
// iterator of the first set
iter: Iter<'a, T>,
}
/// Difference iterator
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Difference<'a, T: 'a, S: 'a> {
// iterator of the first set
iter: Iter<'a, T>,
}
/// Symmetric difference iterator.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SymmetricDifference<'a, T: 'a, S: 'a> {
iter: Chain<Difference<'a, T, S>, Difference<'a, T, S>>
}
/// Set union iterator.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Union<'a, T: 'a, S: 'a> {
iter: Chain<Iter<'a, T>, Difference<'a, T, S>>
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K> Iterator for Iter<'a, K> {
type Item = &'a K;
fn next(&mut self) -> Option<&'a K> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K> ExactSizeIterator for Iter<'a, K> {
fn len(&self) -> usize { self.iter.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K> Iterator for IntoIter<K> {
type Item = K;
fn next(&mut self) -> Option<K> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<K> ExactSizeIterator for IntoIter<K> {
fn len(&self) -> usize { self.iter.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K> Iterator for Drain<'a, K> {
type Item = K;
fn next(&mut self) -> Option<K> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, K> ExactSizeIterator for Drain<'a, K> {
fn len(&self) -> usize { self.iter.len() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, S, H> Iterator for Intersection<'a, T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, S, H> Iterator for Difference<'a, T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H>,
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, S, H> Iterator for SymmetricDifference<'a, T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H>,
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T, S, H> Iterator for Union<'a, T, S>
where T: Eq + Hash<H>,
S: HashState<Hasher=H>,
//! }
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
pub use core_collections::Bound;
pub use core_collections::{BinaryHeap, Bitv, BitvSet, BTreeMap, BTreeSet};
mod hash;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub mod hash_map {
//! A hashmap
pub use super::hash::map::*;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub mod hash_set {
//! A hashset
pub use super::hash::set::*;
/// Experimental support for providing custom hash algorithms to a HashMap and
/// HashSet.
-#[unstable = "module was recently added"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "module was recently added")]
pub mod hash_state {
pub use super::hash::state::*;
}
//!
//! A simple wrapper over the platform's dynamic library facilities
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![allow(missing_docs)]
use prelude::v1::*;
//! }
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use prelude::v1::*;
use string::{FromUtf8Error, FromUtf16Error};
/// Base functionality for all errors in Rust.
-#[unstable = "the exact API of this trait may change"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the exact API of this trait may change")]
pub trait Error {
/// A short description of the error; usually a static string.
fn description(&self) -> &str;
}
/// A trait for types that can be converted from a given error type `E`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait FromError<E> {
/// Perform the conversion.
fn from_error(err: E) -> Self;
}
// Any type is convertable from itself
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<E> FromError<E> for E {
fn from_error(err: E) -> E {
err
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Error for Utf8Error {
fn description(&self) -> &str {
match *self {
fn detail(&self) -> Option<String> { Some(self.to_string()) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Error for FromUtf8Error {
fn description(&self) -> &str { "invalid utf-8" }
fn detail(&self) -> Option<String> { Some(self.to_string()) }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Error for FromUtf16Error {
fn description(&self) -> &str { "invalid utf-16" }
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use prelude::v1::*;
//! Utilities related to FFI bindings.
-#![unstable = "module just underwent fairly large reorganization and the dust \
- still needs to settle"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "module just underwent fairly large reorganization and the dust \
+ still needs to settle")]
pub use self::c_str::CString;
pub use self::c_str::c_str_to_bytes;
//! them with the same character. For example, the `{` character is escaped with
//! `{{` and the `}` character is escaped with `}}`.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use string;
/// let s = fmt::format(format_args!("Hello, {}!", "world"));
/// assert_eq!(s, "Hello, world!".to_string());
/// ```
-#[unstable = "this is an implementation detail of format! and should not \
- be called directly"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "this is an implementation detail of format! and should not \
+ be called directly")]
pub fn format(args: Arguments) -> string::String {
let mut output = string::String::new();
let _ = write!(&mut output, "{}", args);
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Clone for ChanWriter {
fn clone(&self) -> ChanWriter {
ChanWriter { tx: self.tx.clone() }
///
/// assert_eq!(w.into_inner(), vec!(0, 1, 2));
/// ```
-#[deprecated = "use the Vec<u8> Writer implementation directly"]
+#[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use the Vec<u8> Writer implementation directly")]
#[derive(Clone)]
pub struct MemWriter {
buf: Vec<u8>,
//! concerned with error handling; instead its caller is responsible for
//! responding to errors that may occur while attempting to read the numbers.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![deny(unused_must_use)]
pub use self::SeekStyle::*;
///
/// Usage of this field is discouraged, but if access is desired then the
/// fields are located here.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub unstable: UnstableFileStat,
}
/// returned from a `stat` syscall which is not contained in the `FileStat`
/// structure. This information is not necessarily platform independent, and may
/// have different meanings or no meaning at all on some platforms.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
#[derive(Copy, Hash)]
pub struct UnstableFileStat {
/// The ID of the device containing the file.
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Default for FilePermission {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
#[inline]
fn default() -> FilePermission { FilePermission::empty() }
}
///
/// If a `timeout` with zero or negative duration is specified then
/// the function returns `Err`, with the error kind set to `TimedOut`.
- #[unstable = "the timeout argument is likely to change types"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument is likely to change types")]
pub fn connect_timeout<P>(path: P, timeout: Duration)
-> IoResult<UnixStream>
where P: BytesContainer {
/// Sets the read/write timeout for this socket.
///
/// For more information, see `TcpStream::set_timeout`
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_timeout(timeout_ms)
}
/// Sets the read timeout for this socket.
///
/// For more information, see `TcpStream::set_timeout`
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_read_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_read_timeout(timeout_ms)
}
/// Sets the write timeout for this socket.
///
/// For more information, see `TcpStream::set_timeout`
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_write_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_write_timeout(timeout_ms)
}
/// When using this method, it is likely necessary to reset the timeout as
/// appropriate, the timeout specified is specific to this object, not
/// specific to the next request.
- #[unstable = "the name and arguments to this function are likely \
- to change"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the name and arguments to this function are likely \
+ to change")]
pub fn set_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_timeout(timeout_ms)
}
///
/// This function has the same semantics as `TcpAcceptor::close_accept`, and
/// more information can be found in that documentation.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn close_accept(&mut self) -> IoResult<()> {
self.inner.close_accept()
}
///
/// If a `timeout` with zero or negative duration is specified then
/// the function returns `Err`, with the error kind set to `TimedOut`.
- #[unstable = "the timeout argument may eventually change types"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may eventually change types")]
pub fn connect_timeout<A: ToSocketAddr>(addr: A,
timeout: Duration) -> IoResult<TcpStream> {
if timeout <= Duration::milliseconds(0) {
}
/// Sets the nodelay flag on this connection to the boolean specified
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn set_nodelay(&mut self, nodelay: bool) -> IoResult<()> {
self.inner.set_nodelay(nodelay)
}
/// If the value specified is `None`, then the keepalive flag is cleared on
/// this connection. Otherwise, the keepalive timeout will be set to the
/// specified time, in seconds.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn set_keepalive(&mut self, delay_in_seconds: Option<uint>) -> IoResult<()> {
self.inner.set_keepalive(delay_in_seconds)
}
///
/// For clarification on the semantics of interrupting a read and a write,
/// take a look at `set_read_timeout` and `set_write_timeout`.
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_timeout(timeout_ms)
}
/// action is taken. Otherwise, the read operation will be scheduled to
/// promptly return. If a timeout error is returned, then no data was read
/// during the timeout period.
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_read_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_read_timeout(timeout_ms)
}
/// does not know how many bytes were written as part of the timeout
/// operation. It may be the case that bytes continue to be written in an
/// asynchronous fashion after the call to write returns.
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_write_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_write_timeout(timeout_ms)
}
/// a.set_timeout(None);
/// let socket = a.accept();
/// ```
- #[unstable = "the type of the argument and name of this function are \
- subject to change"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the type of the argument and name of this function are \
+ subject to change")]
pub fn set_timeout(&mut self, ms: Option<u64>) { self.inner.set_timeout(ms); }
/// Closes the accepting capabilities of this acceptor.
/// // Signal our accept loop to exit
/// assert!(a.close_accept().is_ok());
/// ```
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn close_accept(&mut self) -> IoResult<()> {
self.inner.close_accept()
}
}
/// Joins a multicast IP address (becomes a member of it)
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn join_multicast(&mut self, multi: IpAddr) -> IoResult<()> {
self.inner.join_multicast(multi)
}
/// Leaves a multicast IP address (drops membership from it)
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn leave_multicast(&mut self, multi: IpAddr) -> IoResult<()> {
self.inner.leave_multicast(multi)
}
/// Set the multicast loop flag to the specified value
///
/// This lets multicast packets loop back to local sockets (if enabled)
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn set_multicast_loop(&mut self, on: bool) -> IoResult<()> {
self.inner.set_multicast_loop(on)
}
/// Sets the multicast TTL
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn set_multicast_ttl(&mut self, ttl: int) -> IoResult<()> {
self.inner.multicast_time_to_live(ttl)
}
/// Sets this socket's TTL
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn set_ttl(&mut self, ttl: int) -> IoResult<()> {
self.inner.time_to_live(ttl)
}
/// Sets the broadcast flag on or off
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn set_broadcast(&mut self, broadcast: bool) -> IoResult<()> {
self.inner.set_broadcast(broadcast)
}
/// Sets the read/write timeout for this socket.
///
/// For more information, see `TcpStream::set_timeout`
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_timeout(timeout_ms)
}
/// Sets the read timeout for this socket.
///
/// For more information, see `TcpStream::set_timeout`
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_read_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_read_timeout(timeout_ms)
}
/// Sets the write timeout for this socket.
///
/// For more information, see `TcpStream::set_timeout`
- #[unstable = "the timeout argument may change in type and value"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the timeout argument may change in type and value")]
pub fn set_write_timeout(&mut self, timeout_ms: Option<u64>) {
self.inner.set_write_timeout(timeout_ms)
}
/// p.wait()
/// }
/// ```
- #[unstable = "the type of the timeout is likely to change"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the type of the timeout is likely to change")]
pub fn set_timeout(&mut self, timeout_ms: Option<u64>) {
self.deadline = timeout_ms.map(|i| i + sys::timer::now()).unwrap_or(0);
}
//! and `format!`, also available to all Rust code.
#![crate_name = "std"]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
pub use core_collections::slice;
pub use core_collections::str;
pub use core_collections::string;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub use core_collections::vec;
pub use unicode::char;
//! library. Each macro is available for use when linking against the standard
//! library.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
/// The entry point for panic of Rust tasks.
///
/// panic!("this is a {} {message}", "fancy", message = "message");
/// ```
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! panic {
() => ({
panic!("explicit panic")
/// format!("x = {}, y = {y}", 10i, y = 30i);
/// ```
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! format {
($($arg:tt)*) => ($crate::fmt::format(format_args!($($arg)*)))
}
/// Equivalent to the `println!` macro except that a newline is not printed at
/// the end of the message.
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! print {
($($arg:tt)*) => ($crate::io::stdio::print_args(format_args!($($arg)*)))
}
/// println!("format {} arguments", "some");
/// ```
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! println {
($($arg:tt)*) => ($crate::io::stdio::println_args(format_args!($($arg)*)))
}
/// error if the value of the expression is `Err`. For more information, see
/// `std::io`.
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! try {
($expr:expr) => (match $expr {
$crate::result::Result::Ok(val) => val,
///
/// For more information about select, see the `std::sync::mpsc::Select` structure.
#[macro_export]
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
macro_rules! select {
(
$($name:pat = $rx:ident.$meth:ident() => $code:expr),+
//! Operations and constants for 32-bits floats (`f32` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![allow(missing_docs)]
#![allow(unsigned_negation)]
#![doc(primitive = "f32")]
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Float for f32 {
#[inline]
fn nan() -> f32 { num::Float::nan() }
///
/// * num - The float value
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_string(num: f32) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigAll, ExpNone, false);
///
/// * num - The float value
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_hex(num: f32) -> String {
let (r, _) = strconv::float_to_str_common(
num, 16u, true, SignNeg, DigAll, ExpNone, false);
/// * num - The float value
/// * radix - The base to use
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_radix_special(num: f32, rdx: uint) -> (String, bool) {
strconv::float_to_str_common(num, rdx, true, SignNeg, DigAll, ExpNone, false)
}
/// * num - The float value
/// * digits - The number of significant digits
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_exact(num: f32, dig: uint) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigExact(dig), ExpNone, false);
/// * num - The float value
/// * digits - The number of significant digits
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_digits(num: f32, dig: uint) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigMax(dig), ExpNone, false);
/// * digits - The number of digits after the decimal point
/// * upper - Use `E` instead of `e` for the exponent sign
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_exp_exact(num: f32, dig: uint, upper: bool) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigExact(dig), ExpDec, upper);
/// * digits - The number of digits after the decimal point
/// * upper - Use `E` instead of `e` for the exponent sign
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_exp_digits(num: f32, dig: uint, upper: bool) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigMax(dig), ExpDec, upper);
//! Operations and constants for 64-bits floats (`f64` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![allow(missing_docs)]
#![doc(primitive = "f64")]
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Float for f64 {
// inlined methods from `num::Float`
#[inline]
///
/// * num - The float value
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_string(num: f64) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigAll, ExpNone, false);
///
/// * num - The float value
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_hex(num: f64) -> String {
let (r, _) = strconv::float_to_str_common(
num, 16u, true, SignNeg, DigAll, ExpNone, false);
/// * num - The float value
/// * radix - The base to use
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_radix_special(num: f64, rdx: uint) -> (String, bool) {
strconv::float_to_str_common(num, rdx, true, SignNeg, DigAll, ExpNone, false)
}
/// * num - The float value
/// * digits - The number of significant digits
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_exact(num: f64, dig: uint) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigExact(dig), ExpNone, false);
/// * num - The float value
/// * digits - The number of significant digits
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_digits(num: f64, dig: uint) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigMax(dig), ExpNone, false);
/// * digits - The number of digits after the decimal point
/// * upper - Use `E` instead of `e` for the exponent sign
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_exp_exact(num: f64, dig: uint, upper: bool) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigExact(dig), ExpDec, upper);
/// * digits - The number of digits after the decimal point
/// * upper - Use `E` instead of `e` for the exponent sign
#[inline]
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub fn to_str_exp_digits(num: f64, dig: uint, upper: bool) -> String {
let (r, _) = strconv::float_to_str_common(
num, 10u, true, SignNeg, DigMax(dig), ExpDec, upper);
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![doc(hidden)]
macro_rules! assert_approx_eq {
//! Operations and constants for signed 16-bits integers (`i16` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i16")]
pub use core::i16::{BITS, BYTES, MIN, MAX};
//! Operations and constants for signed 32-bits integers (`i32` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i32")]
pub use core::i32::{BITS, BYTES, MIN, MAX};
//! Operations and constants for signed 64-bits integers (`i64` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i64")]
pub use core::i64::{BITS, BYTES, MIN, MAX};
//! Operations and constants for signed 8-bits integers (`i8` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "i8")]
pub use core::i8::{BITS, BYTES, MIN, MAX};
//! alpha cycle along with the development of clearer conventions
//! around integer types.
-#![deprecated = "replaced by isize"]
+#![deprecated(feature = "oldstuff", since = "1.0.0", reason = "replaced by isize")]
pub use core::int::{BITS, BYTES, MIN, MAX};
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![doc(hidden)]
macro_rules! int_module { ($T:ty) => (
//! new type will gradually take place over the alpha cycle along with
//! the development of clearer conventions around integer types.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "isize")]
pub use core::isize::{BITS, BYTES, MIN, MAX};
//! These are implemented for the primitive numeric types in `std::{u8, u16,
//! u32, u64, uint, i8, i16, i32, i64, int, f32, f64}`.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![allow(missing_docs)]
#[cfg(test)] use fmt::Show;
use option::Option;
-#[unstable = "may be removed or relocated"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be removed or relocated")]
pub mod strconv;
/// Mathematical operations on primitive floating point numbers.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Float
: Copy + Clone
+ NumCast
{
// inlined methods from `num::Float`
/// Returns the NaN value.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn nan() -> Self;
/// Returns the infinite value.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn infinity() -> Self;
/// Returns the negative infinite value.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn neg_infinity() -> Self;
/// Returns the `0` value.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn zero() -> Self;
/// Returns -0.0.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn neg_zero() -> Self;
/// Returns the `1` value.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn one() -> Self;
// FIXME (#5527): These should be associated constants
/// Returns the number of binary digits of mantissa that this type supports.
- #[deprecated = "use `std::f32::MANTISSA_DIGITS` or `std::f64::MANTISSA_DIGITS` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MANTISSA_DIGITS` or \
+ `std::f64::MANTISSA_DIGITS` as appropriate")]
fn mantissa_digits(unused_self: Option<Self>) -> uint;
/// Returns the number of base-10 digits of precision that this type supports.
- #[deprecated = "use `std::f32::DIGITS` or `std::f64::DIGITS` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::DIGITS` or `std::f64::DIGITS` as appropriate")]
fn digits(unused_self: Option<Self>) -> uint;
/// Returns the difference between 1.0 and the smallest representable number larger than 1.0.
- #[deprecated = "use `std::f32::EPSILON` or `std::f64::EPSILON` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::EPSILON` or `std::f64::EPSILON` as appropriate")]
fn epsilon() -> Self;
/// Returns the minimum binary exponent that this type can represent.
- #[deprecated = "use `std::f32::MIN_EXP` or `std::f64::MIN_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MIN_EXP` or `std::f64::MIN_EXP` as appropriate")]
fn min_exp(unused_self: Option<Self>) -> int;
/// Returns the maximum binary exponent that this type can represent.
- #[deprecated = "use `std::f32::MAX_EXP` or `std::f64::MAX_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MAX_EXP` or `std::f64::MAX_EXP` as appropriate")]
fn max_exp(unused_self: Option<Self>) -> int;
/// Returns the minimum base-10 exponent that this type can represent.
- #[deprecated = "use `std::f32::MIN_10_EXP` or `std::f64::MIN_10_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MIN_10_EXP` or `std::f64::MIN_10_EXP` as appropriate")]
fn min_10_exp(unused_self: Option<Self>) -> int;
/// Returns the maximum base-10 exponent that this type can represent.
- #[deprecated = "use `std::f32::MAX_10_EXP` or `std::f64::MAX_10_EXP` as appropriate"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "use `std::f32::MAX_10_EXP` or `std::f64::MAX_10_EXP` as appropriate")]
fn max_10_exp(unused_self: Option<Self>) -> int;
/// Returns the smallest finite value that this type can represent.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn min_value() -> Self;
/// Returns the smallest normalized positive number that this type can represent.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn min_pos_value(unused_self: Option<Self>) -> Self;
/// Returns the largest finite value that this type can represent.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn max_value() -> Self;
/// Returns true if this value is NaN and false otherwise.
- #[unstable = "position is undecided"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "position is undecided")]
fn is_nan(self) -> bool;
/// Returns true if this value is positive infinity or negative infinity and
/// false otherwise.
- #[unstable = "position is undecided"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "position is undecided")]
fn is_infinite(self) -> bool;
/// Returns true if this number is neither infinite nor NaN.
- #[unstable = "position is undecided"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "position is undecided")]
fn is_finite(self) -> bool;
/// Returns true if this number is neither zero, infinite, denormal, or NaN.
- #[unstable = "position is undecided"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "position is undecided")]
fn is_normal(self) -> bool;
/// Returns the category that this number falls into.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn classify(self) -> FpCategory;
/// Returns the mantissa, exponent and sign as integers, respectively.
- #[unstable = "signature is undecided"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "signature is undecided")]
fn integer_decode(self) -> (u64, i16, i8);
/// Return the largest integer less than or equal to a number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn floor(self) -> Self;
/// Return the smallest integer greater than or equal to a number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn ceil(self) -> Self;
/// Return the nearest integer to a number. Round half-way cases away from
/// `0.0`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn round(self) -> Self;
/// Return the integer part of a number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trunc(self) -> Self;
/// Return the fractional part of a number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn fract(self) -> Self;
/// Computes the absolute value of `self`. Returns `Float::nan()` if the
/// number is `Float::nan()`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn abs(self) -> Self;
/// Returns a number that represents the sign of `self`.
///
/// - `1.0` if the number is positive, `+0.0` or `Float::infinity()`
/// - `-1.0` if the number is negative, `-0.0` or `Float::neg_infinity()`
/// - `Float::nan()` if the number is `Float::nan()`
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn signum(self) -> Self;
/// Returns `true` if `self` is positive, including `+0.0` and
/// `Float::infinity()`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_positive(self) -> bool;
/// Returns `true` if `self` is negative, including `-0.0` and
/// `Float::neg_infinity()`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_negative(self) -> bool;
/// Fused multiply-add. Computes `(self * a) + b` with only one rounding
/// error. This produces a more accurate result with better performance than
/// a separate multiplication operation followed by an add.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn mul_add(self, a: Self, b: Self) -> Self;
/// Take the reciprocal (inverse) of a number, `1/x`.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn recip(self) -> Self;
/// Raise a number to an integer power.
///
/// Using this function is generally faster than using `powf`
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn powi(self, n: i32) -> Self;
/// Raise a number to a floating point power.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn powf(self, n: Self) -> Self;
/// Take the square root of a number.
///
/// Returns NaN if `self` is a negative number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn sqrt(self) -> Self;
/// Take the reciprocal (inverse) square root of a number, `1/sqrt(x)`.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn rsqrt(self) -> Self;
/// Returns `e^(self)`, (the exponential function).
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn exp(self) -> Self;
/// Returns 2 raised to the power of the number, `2^(self)`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn exp2(self) -> Self;
/// Returns the natural logarithm of the number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn ln(self) -> Self;
/// Returns the logarithm of the number with respect to an arbitrary base.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn log(self, base: Self) -> Self;
/// Returns the base 2 logarithm of the number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn log2(self) -> Self;
/// Returns the base 10 logarithm of the number.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn log10(self) -> Self;
/// Convert radians to degrees.
- #[unstable = "desirability is unclear"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "desirability is unclear")]
fn to_degrees(self) -> Self;
/// Convert degrees to radians.
- #[unstable = "desirability is unclear"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "desirability is unclear")]
fn to_radians(self) -> Self;
/// Constructs a floating point number created by multiplying `x` by 2
/// raised to the power of `exp`.
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn ldexp(x: Self, exp: int) -> Self;
/// Breaks the number into a normalized fraction and a base-2 exponent,
/// satisfying:
/// * `self = x * pow(2, exp)`
///
/// * `0.5 <= abs(x) < 1.0`
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn frexp(self) -> (Self, int);
/// Returns the next representable floating-point value in the direction of
/// `other`.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn next_after(self, other: Self) -> Self;
/// Returns the maximum of the two numbers.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn max(self, other: Self) -> Self;
/// Returns the minimum of the two numbers.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn min(self, other: Self) -> Self;
/// The positive difference of two numbers. Returns `0.0` if the number is
/// less than or equal to `other`, otherwise the difference between`self`
/// and `other` is returned.
- #[unstable = "may be renamed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be renamed")]
fn abs_sub(self, other: Self) -> Self;
/// Take the cubic root of a number.
- #[unstable = "may be renamed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be renamed")]
fn cbrt(self) -> Self;
/// Calculate the length of the hypotenuse of a right-angle triangle given
/// legs of length `x` and `y`.
- #[unstable = "unsure about its place in the world"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure about its place in the world")]
fn hypot(self, other: Self) -> Self;
/// Computes the sine of a number (in radians).
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn sin(self) -> Self;
/// Computes the cosine of a number (in radians).
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn cos(self) -> Self;
/// Computes the tangent of a number (in radians).
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn tan(self) -> Self;
/// Computes the arcsine of a number. Return value is in radians in
/// the range [-pi/2, pi/2] or NaN if the number is outside the range
/// [-1, 1].
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn asin(self) -> Self;
/// Computes the arccosine of a number. Return value is in radians in
/// the range [0, pi] or NaN if the number is outside the range
/// [-1, 1].
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn acos(self) -> Self;
/// Computes the arctangent of a number. Return value is in radians in the
/// range [-pi/2, pi/2];
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn atan(self) -> Self;
/// Computes the four quadrant arctangent of a number, `y`, and another
/// number `x`. Return value is in radians in the range [-pi, pi].
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn atan2(self, other: Self) -> Self;
/// Simultaneously computes the sine and cosine of the number, `x`. Returns
/// `(sin(x), cos(x))`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn sin_cos(self) -> (Self, Self);
/// Returns the exponential of the number, minus 1, in a way that is
/// accurate even if the number is close to zero.
- #[unstable = "may be renamed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be renamed")]
fn exp_m1(self) -> Self;
/// Returns the natural logarithm of the number plus 1 (`ln(1+n)`) more
/// accurately than if the operations were performed separately.
- #[unstable = "may be renamed"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "may be renamed")]
fn ln_1p(self) -> Self;
/// Hyperbolic sine function.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn sinh(self) -> Self;
/// Hyperbolic cosine function.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn cosh(self) -> Self;
/// Hyperbolic tangent function.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn tanh(self) -> Self;
/// Inverse hyperbolic sine function.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn asinh(self) -> Self;
/// Inverse hyperbolic cosine function.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn acosh(self) -> Self;
/// Inverse hyperbolic tangent function.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn atanh(self) -> Self;
}
//! Operations and constants for unsigned 16-bits integers (`u16` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u16")]
pub use core::u16::{BITS, BYTES, MIN, MAX};
//! Operations and constants for unsigned 32-bits integers (`u32` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u32")]
pub use core::u32::{BITS, BYTES, MIN, MAX};
//! Operations and constants for unsigned 64-bits integer (`u64` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u64")]
pub use core::u64::{BITS, BYTES, MIN, MAX};
//! Operations and constants for unsigned 8-bits integers (`u8` type)
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "u8")]
pub use core::u8::{BITS, BYTES, MIN, MAX};
//! alpha cycle along with the development of clearer conventions
//! around integer types.
-#![deprecated = "replaced by usize"]
+#![deprecated(feature = "oldstuff", since = "1.0.0", reason = "replaced by usize")]
pub use core::uint::{BITS, BYTES, MIN, MAX};
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![doc(hidden)]
#![allow(unsigned_negation)]
//! new type will gradually take place over the alpha cycle along with
//! the development of clearer conventions around integer types.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
#![doc(primitive = "usize")]
pub use core::usize::{BITS, BYTES, MIN, MAX};
//! so we will not _hide_ the facts of which OS the user is on -- they should be given the
//! opportunity to write OS-ignorant code by default.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![allow(missing_docs)]
#![allow(non_snake_case)]
//! println!("path exists: {}", path.exists());
//! ```
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use core::marker::Sized;
use ffi::CString;
//! pervasive that it would be obnoxious to import for every use, particularly
//! those that define methods on primitive types.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub mod v1;
//! The first version of the prelude of the standard library.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
// Reexported core operators
-#[stable] #[doc(no_inline)] pub use marker::{Copy, Send, Sized, Sync};
-#[stable] #[doc(no_inline)] pub use ops::{Drop, Fn, FnMut, FnOnce};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use marker::{Copy, Send, Sized, Sync};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use ops::{Drop, Fn, FnMut, FnOnce};
// TEMPORARY
-#[unstable] #[doc(no_inline)] pub use ops::FullRange;
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
+#[doc(no_inline)] pub use ops::FullRange;
// Reexported functions
-#[stable] #[doc(no_inline)] pub use mem::drop;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use mem::drop;
// Reexported types and traits
-#[stable] #[doc(no_inline)] pub use boxed::Box;
-#[stable] #[doc(no_inline)] pub use char::CharExt;
-#[stable] #[doc(no_inline)] pub use clone::Clone;
-#[stable] #[doc(no_inline)] pub use cmp::{PartialEq, PartialOrd, Eq, Ord};
-#[stable] #[doc(no_inline)] pub use iter::DoubleEndedIterator;
-#[stable] #[doc(no_inline)] pub use iter::ExactSizeIterator;
-#[stable] #[doc(no_inline)] pub use iter::{Iterator, IteratorExt, Extend};
-#[stable] #[doc(no_inline)] pub use option::Option::{self, Some, None};
-#[stable] #[doc(no_inline)] pub use ptr::{PtrExt, MutPtrExt};
-#[stable] #[doc(no_inline)] pub use result::Result::{self, Ok, Err};
-#[stable] #[doc(no_inline)] pub use slice::AsSlice;
-#[stable] #[doc(no_inline)] pub use slice::{SliceExt, SliceConcatExt};
-#[stable] #[doc(no_inline)] pub use str::{Str, StrExt};
-#[stable] #[doc(no_inline)] pub use string::{String, ToString};
-#[stable] #[doc(no_inline)] pub use vec::Vec;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use boxed::Box;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use char::CharExt;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use clone::Clone;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use cmp::{PartialEq, PartialOrd, Eq, Ord};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use iter::DoubleEndedIterator;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use iter::ExactSizeIterator;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use iter::{Iterator, IteratorExt, Extend};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use option::Option::{self, Some, None};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use ptr::{PtrExt, MutPtrExt};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use result::Result::{self, Ok, Err};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use slice::AsSlice;
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use slice::{SliceExt, SliceConcatExt};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use str::{Str, StrExt};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use string::{String, ToString};
+#[stable(feature = "grandfathered", since = "1.0.0")]
+#[doc(no_inline)] pub use vec::Vec;
// NB: remove when path reform lands
#[doc(no_inline)] pub use path::{Path, GenericPath};
//! }
//! ```
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use cell::RefCell;
use clone::Clone;
//! and should be considered as private implementation details for the
//! time being.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
// FIXME: this should not be here.
#![allow(missing_docs)]
/// Only a limited number of callbacks can be registered, and this function
/// returns whether the callback was successfully registered or not. It is not
/// currently possible to unregister a callback once it has been registered.
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub unsafe fn register(f: Callback) -> bool {
match CALLBACK_CNT.fetch_add(1, Ordering::SeqCst) {
// The invocation code has knowledge of this window where the count has
//! the standard library This varies per-platform, but these libraries are
//! necessary for running libstd.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
// All platforms need to link to rustrt
#[cfg(not(test))]
/// });
/// }
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Barrier {
lock: Mutex<BarrierState>,
cvar: Condvar,
///
/// A barrier will block `n`-1 threads which call `wait` and then wake up
/// all threads at once when the `n`th thread calls `wait`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(n: uint) -> Barrier {
Barrier {
lock: Mutex::new(BarrierState {
/// returns `true` from `is_leader` when returning from this function, and
/// all other threads will receive a result that will return `false` from
/// `is_leader`
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn wait(&self) -> BarrierWaitResult {
let mut lock = self.lock.lock().unwrap();
let local_gen = lock.generation_id;
///
/// Only one thread will have `true` returned from their result, all other
/// threads will have `false` returned.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn is_leader(&self) -> bool { self.0 }
}
/// started = cvar.wait(started).unwrap();
/// }
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Condvar { inner: Box<StaticCondvar> }
unsafe impl Send for Condvar {}
///
/// static CVAR: StaticCondvar = CONDVAR_INIT;
/// ```
-#[unstable = "may be merged with Condvar in the future"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub struct StaticCondvar {
inner: sys::Condvar,
mutex: AtomicUsize,
unsafe impl Sync for StaticCondvar {}
/// Constant initializer for a statically allocated condition variable.
-#[unstable = "may be merged with Condvar in the future"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub const CONDVAR_INIT: StaticCondvar = StaticCondvar {
inner: sys::CONDVAR_INIT,
mutex: ATOMIC_USIZE_INIT,
impl Condvar {
/// Creates a new condition variable which is ready to be waited on and
/// notified.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> Condvar {
Condvar {
inner: box StaticCondvar {
/// over time. Each condition variable is dynamically bound to exactly one
/// mutex to ensure defined behavior across platforms. If this functionality
/// is not desired, then unsafe primitives in `sys` are provided.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn wait<'a, T>(&self, guard: MutexGuard<'a, T>)
-> LockResult<MutexGuard<'a, T>> {
unsafe {
///
/// Like `wait`, the lock specified will be re-acquired when this function
/// returns, regardless of whether the timeout elapsed or not.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn wait_timeout<'a, T>(&self, guard: MutexGuard<'a, T>, dur: Duration)
-> LockResult<(MutexGuard<'a, T>, bool)> {
unsafe {
/// The semantics of this function are equivalent to `wait_timeout` except
/// that the implementation will repeatedly wait while the duration has not
/// passed and the provided function returns `false`.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn wait_timeout_with<'a, T, F>(&self,
guard: MutexGuard<'a, T>,
dur: Duration,
/// `notify_one` are not buffered in any way.
///
/// To wake up all threads, see `notify_all()`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn notify_one(&self) { unsafe { self.inner.inner.notify_one() } }
/// Wake up all blocked threads on this condvar.
/// way.
///
/// To wake up only one thread, see `notify_one()`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn notify_all(&self) { unsafe { self.inner.inner.notify_all() } }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl Drop for Condvar {
fn drop(&mut self) {
unsafe { self.inner.inner.destroy() }
/// notification.
///
/// See `Condvar::wait`.
- #[unstable = "may be merged with Condvar in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub fn wait<'a, T>(&'static self, guard: MutexGuard<'a, T>)
-> LockResult<MutexGuard<'a, T>> {
let poisoned = unsafe {
/// specified duration.
///
/// See `Condvar::wait_timeout`.
- #[unstable = "may be merged with Condvar in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub fn wait_timeout<'a, T>(&'static self, guard: MutexGuard<'a, T>, dur: Duration)
-> LockResult<(MutexGuard<'a, T>, bool)> {
let (poisoned, success) = unsafe {
/// passed and the function returns `false`.
///
/// See `Condvar::wait_timeout_with`.
- #[unstable = "may be merged with Condvar in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub fn wait_timeout_with<'a, T, F>(&'static self,
guard: MutexGuard<'a, T>,
dur: Duration,
/// Wake up one blocked thread on this condvar.
///
/// See `Condvar::notify_one`.
- #[unstable = "may be merged with Condvar in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub fn notify_one(&'static self) { unsafe { self.inner.notify_one() } }
/// Wake up all blocked threads on this condvar.
///
/// See `Condvar::notify_all`.
- #[unstable = "may be merged with Condvar in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub fn notify_all(&'static self) { unsafe { self.inner.notify_all() } }
/// Deallocate all resources associated with this static condvar.
/// active users of the condvar, and this also doesn't prevent any future
/// users of the condvar. This method is required to be called to not leak
/// memory on all platforms.
- #[unstable = "may be merged with Condvar in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Condvar in the future")]
pub unsafe fn destroy(&'static self) {
self.inner.destroy()
}
//! ```
#![allow(missing_docs)]
-#![unstable = "futures as-is have yet to be deeply reevaluated with recent \
- core changes to Rust's synchronization story, and will likely \
- become stable in the future but are unstable until that time"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "futures as-is have yet to be deeply reevaluated with recent \
+ core changes to Rust's synchronization story, and will likely \
+ become stable in the future but are unstable until that time")]
use core::prelude::*;
use core::mem::replace;
//! and/or blocking at all, but rather provide the necessary tools to build
//! other types of concurrent primitives.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
pub use alloc::arc::{Arc, Weak};
pub use core::atomic;
//! }
//! ```
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
// A description of how Rust's channel implementation works
//
/// The receiving-half of Rust's channel type. This half can only be owned by
/// one task
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Receiver<T> {
inner: UnsafeCell<Flavor<T>>,
}
/// An iterator over messages on a receiver, this iterator will block
/// whenever `next` is called, waiting for a new message, and `None` will be
/// returned when the corresponding channel has hung up.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Iter<'a, T:'a> {
rx: &'a Receiver<T>
}
/// The sending-half of Rust's asynchronous channel type. This half can only be
/// owned by one task, but it can be cloned to send to other tasks.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Sender<T> {
inner: UnsafeCell<Flavor<T>>,
}
/// The sending-half of Rust's synchronous channel type. This half can only be
/// owned by one task, but it can be cloned to send to other tasks.
-#[stable]
#[cfg(stage0)] // NOTE remove impl after next snapshot
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SyncSender<T> {
inner: Arc<RacyCell<sync::Packet<T>>>,
// can't share in an arc
/// The sending-half of Rust's synchronous channel type. This half can only be
/// owned by one task, but it can be cloned to send to other tasks.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub struct SyncSender<T> {
inner: Arc<RacyCell<sync::Packet<T>>>,
/// disconnected, implying that the data could never be received. The error
/// contains the data being sent as a payload so it can be recovered.
#[derive(PartialEq, Eq)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct SendError<T>(pub T);
/// An error returned from the `recv` function on a `Receiver`.
/// The `recv` operation can only fail if the sending half of a channel is
/// disconnected, implying that no further messages will ever be received.
#[derive(PartialEq, Eq, Clone, Copy)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RecvError;
/// This enumeration is the list of the possible reasons that try_recv could not
/// return data when called.
#[derive(PartialEq, Clone, Copy)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub enum TryRecvError {
/// This channel is currently empty, but the sender(s) have not yet
/// disconnected, so data may yet become available.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Empty,
/// This channel's sending half has become disconnected, and there will
/// never be any more data received on this channel
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Disconnected,
}
/// This enumeration is the list of the possible error outcomes for the
/// `SyncSender::try_send` method.
#[derive(PartialEq, Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub enum TrySendError<T> {
/// The data could not be sent on the channel because it would require that
/// the callee block to send the data.
/// If this is a buffered channel, then the buffer is full at this time. If
/// this is not a buffered channel, then there is no receiver available to
/// acquire the data.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Full(T),
/// This channel's receiving half has disconnected, so the data could not be
/// sent. The data is returned back to the callee in this case.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Disconnected(T),
}
/// // Let's see what that answer was
/// println!("{:?}", rx.recv().unwrap());
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
let a = Arc::new(RacyCell::new(oneshot::Packet::new()));
(Sender::new(Flavor::Oneshot(a.clone())), Receiver::new(Flavor::Oneshot(a)))
/// assert_eq!(rx.recv().unwrap(), 1i);
/// assert_eq!(rx.recv().unwrap(), 2i);
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
let a = Arc::new(RacyCell::new(sync::Packet::new(bound)));
(SyncSender::new(a.clone()), Receiver::new(Flavor::Sync(a)))
/// drop(rx);
/// assert_eq!(tx.send(1i).err().unwrap().0, 1);
/// ```
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn send(&self, t: T) -> Result<(), SendError<T>> {
let (new_inner, ret) = match *unsafe { self.inner() } {
Flavor::Oneshot(ref p) => {
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Send> Clone for Sender<T> {
fn clone(&self) -> Sender<T> {
let (packet, sleeper, guard) = match *unsafe { self.inner() } {
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Send> Drop for Sender<T> {
fn drop(&mut self) {
match *unsafe { self.inner_mut() } {
/// This function will never panic, but it may return `Err` if the
/// `Receiver` has disconnected and is no longer able to receive
/// information.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn send(&self, t: T) -> Result<(), SendError<T>> {
unsafe { (*self.inner.get()).send(t).map_err(SendError) }
}
///
/// See `SyncSender::send` for notes about guarantees of whether the
/// receiver has received the data or not if this function is successful.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn try_send(&self, t: T) -> Result<(), TrySendError<T>> {
unsafe { (*self.inner.get()).try_send(t) }
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Send> Clone for SyncSender<T> {
fn clone(&self) -> SyncSender<T> {
unsafe { (*self.inner.get()).clone_chan(); }
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Send> Drop for SyncSender<T> {
fn drop(&mut self) {
unsafe { (*self.inner.get()).drop_chan(); }
///
/// This is useful for a flavor of "optimistic check" before deciding to
/// block on a receiver.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn try_recv(&self) -> Result<T, TryRecvError> {
loop {
let new_port = match *unsafe { self.inner() } {
/// If the corresponding `Sender` has disconnected, or it disconnects while
/// this call is blocking, this call will wake up and return `Err` to
/// indicate that no more messages can ever be received on this channel.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn recv(&self) -> Result<T, RecvError> {
loop {
let new_port = match *unsafe { self.inner() } {
/// Returns an iterator that will block waiting for messages, but never
/// `panic!`. It will return `None` when the channel has hung up.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn iter(&self) -> Iter<T> {
Iter { rx: self }
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: Send> Iterator for Iter<'a, T> {
type Item = T;
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Send> Drop for Receiver<T> {
fn drop(&mut self) {
match *unsafe { self.inner_mut() } {
//! method, and see the method for more information about it. Due to this
//! caveat, this queue may not be appropriate for all use-cases.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
// http://www.1024cores.net/home/lock-free-algorithms
// /queues/non-intrusive-mpsc-node-based-queue
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Send> Drop for Queue<T> {
fn drop(&mut self) {
unsafe {
//! ```
#![allow(dead_code)]
-#![unstable = "This implementation, while likely sufficient, is unsafe and \
- likely to be error prone. At some point in the future this \
- module will likely be replaced, and it is currently \
- unknown how much API breakage that will cause. The ability \
- to select over a number of channels will remain forever, \
- but no guarantees beyond this are being made"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "This implementation, while likely sufficient, is unsafe and \
+ likely to be error prone. At some point in the future this \
+ module will likely be replaced, and it is currently \
+ unknown how much API breakage that will cause. The ability \
+ to select over a number of channels will remain forever, \
+ but no guarantees beyond this are being made")]
use core::prelude::*;
//! concurrently between two tasks. This data structure is safe to use and
//! enforces the semantics that there is one pusher and one popper.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use core::prelude::*;
///
/// *guard += 1;
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Mutex<T> {
// Note that this static mutex is in a *box*, not inlined into the struct
// itself. Once a native mutex has been used once, its address can never
/// }
/// // lock is unlocked here.
/// ```
-#[unstable = "may be merged with Mutex in the future"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Mutex in the future")]
pub struct StaticMutex {
lock: sys::Mutex,
poison: poison::Flag,
/// The data protected by the mutex can be access through this guard via its
/// Deref and DerefMut implementations
#[must_use]
-#[stable]
#[cfg(stage0)] // NOTE remove impl after next snapshot
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct MutexGuard<'a, T: 'a> {
// funny underscores due to how Deref/DerefMut currently work (they
// disregard field privacy).
/// The data protected by the mutex can be access through this guard via its
/// Deref and DerefMut implementations
#[must_use]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub struct MutexGuard<'a, T: 'a> {
// funny underscores due to how Deref/DerefMut currently work (they
/// Static initialization of a mutex. This constant can be used to initialize
/// other mutex constants.
-#[unstable = "may be merged with Mutex in the future"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Mutex in the future")]
pub const MUTEX_INIT: StaticMutex = StaticMutex {
lock: sys::MUTEX_INIT,
poison: poison::FLAG_INIT,
impl<T: Send> Mutex<T> {
/// Creates a new mutex in an unlocked state ready for use.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(t: T) -> Mutex<T> {
Mutex {
inner: box MUTEX_INIT,
///
/// If another user of this mutex panicked while holding the mutex, then
/// this call will return an error once the mutex is acquired.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn lock(&self) -> LockResult<MutexGuard<T>> {
unsafe { self.inner.lock.lock() }
MutexGuard::new(&*self.inner, &self.data)
/// If another user of this mutex panicked while holding the mutex, then
/// this call will return failure if the mutex would otherwise be
/// acquired.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn try_lock(&self) -> TryLockResult<MutexGuard<T>> {
if unsafe { self.inner.lock.try_lock() } {
Ok(try!(MutexGuard::new(&*self.inner, &self.data)))
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T: Send> Drop for Mutex<T> {
fn drop(&mut self) {
// This is actually safe b/c we know that there is no further usage of
impl StaticMutex {
/// Acquires this lock, see `Mutex::lock`
#[inline]
- #[unstable = "may be merged with Mutex in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Mutex in the future")]
pub fn lock(&'static self) -> LockResult<MutexGuard<()>> {
unsafe { self.lock.lock() }
MutexGuard::new(self, &DUMMY.0)
/// Attempts to grab this lock, see `Mutex::try_lock`
#[inline]
- #[unstable = "may be merged with Mutex in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Mutex in the future")]
pub fn try_lock(&'static self) -> TryLockResult<MutexGuard<()>> {
if unsafe { self.lock.try_lock() } {
Ok(try!(MutexGuard::new(self, &DUMMY.0)))
/// *all* platforms. It may be the case that some platforms do not leak
/// memory if this method is not called, but this is not guaranteed to be
/// true on all platforms.
- #[unstable = "may be merged with Mutex in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with Mutex in the future")]
pub unsafe fn destroy(&'static self) {
self.lock.destroy()
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'mutex, T> Deref for MutexGuard<'mutex, T> {
type Target = T;
unsafe { &*self.__data.get() }
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'mutex, T> DerefMut for MutexGuard<'mutex, T> {
fn deref_mut<'a>(&'a mut self) -> &'a mut T {
unsafe { &mut *self.__data.get() }
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Drop for MutexGuard<'a, T> {
#[inline]
fn drop(&mut self) {
/// // run initialization here
/// });
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Once {
mutex: StaticMutex,
cnt: AtomicIsize,
unsafe impl Sync for Once {}
/// Initialization value for static `Once` values.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub const ONCE_INIT: Once = Once {
mutex: MUTEX_INIT,
cnt: ATOMIC_ISIZE_INIT,
///
/// When this function returns, it is guaranteed that some initialization
/// has run and completed (it may not be the closure specified).
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn call_once<F>(&'static self, f: F) where F: FnOnce() {
// Optimize common path: load is much cheaper than fetch_add.
if self.cnt.load(Ordering::SeqCst) < 0 {
/// is held. The precise semantics for when a lock is poisoned is documented on
/// each lock, but once a lock is poisoned then all future acquisitions will
/// return this error.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct PoisonError<T> {
guard: T,
}
/// An enumeration of possible errors which can occur while calling the
/// `try_lock` method.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub enum TryLockError<T> {
/// The lock could not be acquired because another task failed while holding
/// the lock.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
Poisoned(PoisonError<T>),
/// The lock could not be acquired at this time because the operation would
/// otherwise block.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
WouldBlock,
}
/// that the primitive was poisoned. Note that the `Err` variant *also* carries
/// the associated guard, and it can be acquired through the `into_inner`
/// method.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub type LockResult<Guard> = Result<Guard, PoisonError<Guard>>;
/// A type alias for the result of a nonblocking locking method.
/// For more information, see `LockResult`. A `TryLockResult` doesn't
/// necessarily hold the associated guard in the `Err` type as the lock may not
/// have been acquired for other reasons.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub type TryLockResult<Guard> = Result<Guard, TryLockError<Guard>>;
impl<T> fmt::Show for PoisonError<T> {
impl<T> PoisonError<T> {
/// Consumes this error indicating that a lock is poisoned, returning the
/// underlying guard to allow access regardless.
- #[deprecated="renamed to into_inner"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "renamed to into_inner")]
pub fn into_guard(self) -> T { self.guard }
/// Consumes this error indicating that a lock is poisoned, returning the
/// underlying guard to allow access regardless.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn into_inner(self) -> T { self.guard }
/// Reaches into this error indicating that a lock is poisoned, returning a
/// reference to the underlying guard to allow access regardless.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn get_ref(&self) -> &T { &self.guard }
/// Reaches into this error indicating that a lock is poisoned, returning a
/// mutable reference to the underlying guard to allow access regardless.
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn get_mut(&mut self) -> &mut T { &mut self.guard }
}
/// assert_eq!(*w, 6);
/// } // write lock is dropped here
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RwLock<T> {
inner: Box<StaticRwLock>,
data: UnsafeCell<T>,
/// }
/// unsafe { LOCK.destroy() } // free all resources
/// ```
-#[unstable = "may be merged with RwLock in the future"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with RwLock in the future")]
pub struct StaticRwLock {
lock: sys::RWLock,
poison: poison::Flag,
unsafe impl Sync for StaticRwLock {}
/// Constant initialization for a statically-initialized rwlock.
-#[unstable = "may be merged with RwLock in the future"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with RwLock in the future")]
pub const RW_LOCK_INIT: StaticRwLock = StaticRwLock {
lock: sys::RWLOCK_INIT,
poison: poison::FLAG_INIT,
/// RAII structure used to release the shared read access of a lock when
/// dropped.
#[must_use]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct RwLockReadGuard<'a, T: 'a> {
__lock: &'a StaticRwLock,
/// RAII structure used to release the shared read access of a lock when
/// dropped.
#[must_use]
-#[stable]
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RwLockReadGuard<'a, T: 'a> {
__lock: &'a StaticRwLock,
__data: &'a UnsafeCell<T>,
/// RAII structure used to release the exclusive write access of a lock when
/// dropped.
#[must_use]
-#[stable]
#[cfg(stage0)] // NOTE remove impl after next snapshot
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct RwLockWriteGuard<'a, T: 'a> {
__lock: &'a StaticRwLock,
__data: &'a UnsafeCell<T>,
/// RAII structure used to release the exclusive write access of a lock when
/// dropped.
#[must_use]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub struct RwLockWriteGuard<'a, T: 'a> {
__lock: &'a StaticRwLock,
impl<T: Send + Sync> RwLock<T> {
/// Creates a new instance of an RwLock which is unlocked and read to go.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new(t: T) -> RwLock<T> {
RwLock { inner: box RW_LOCK_INIT, data: UnsafeCell::new(t) }
}
/// is poisoned whenever a writer panics while holding an exclusive lock.
/// The failure will occur immediately after the lock has been acquired.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn read(&self) -> LockResult<RwLockReadGuard<T>> {
unsafe { self.inner.lock.read() }
RwLockReadGuard::new(&*self.inner, &self.data)
/// error will only be returned if the lock would have otherwise been
/// acquired.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn try_read(&self) -> TryLockResult<RwLockReadGuard<T>> {
if unsafe { self.inner.lock.try_read() } {
Ok(try!(RwLockReadGuard::new(&*self.inner, &self.data)))
/// is poisoned whenever a writer panics while holding an exclusive lock.
/// An error will be returned when the lock is acquired.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn write(&self) -> LockResult<RwLockWriteGuard<T>> {
unsafe { self.inner.lock.write() }
RwLockWriteGuard::new(&*self.inner, &self.data)
/// error will only be returned if the lock would have otherwise been
/// acquired.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn try_write(&self) -> TryLockResult<RwLockWriteGuard<T>> {
if unsafe { self.inner.lock.try_read() } {
Ok(try!(RwLockWriteGuard::new(&*self.inner, &self.data)))
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<T> Drop for RwLock<T> {
fn drop(&mut self) {
unsafe { self.inner.lock.destroy() }
///
/// See `RwLock::read`.
#[inline]
- #[unstable = "may be merged with RwLock in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with RwLock in the future")]
pub fn read(&'static self) -> LockResult<RwLockReadGuard<'static, ()>> {
unsafe { self.lock.read() }
RwLockReadGuard::new(self, &DUMMY.0)
///
/// See `RwLock::try_read`.
#[inline]
- #[unstable = "may be merged with RwLock in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with RwLock in the future")]
pub fn try_read(&'static self)
-> TryLockResult<RwLockReadGuard<'static, ()>> {
if unsafe { self.lock.try_read() } {
///
/// See `RwLock::write`.
#[inline]
- #[unstable = "may be merged with RwLock in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with RwLock in the future")]
pub fn write(&'static self) -> LockResult<RwLockWriteGuard<'static, ()>> {
unsafe { self.lock.write() }
RwLockWriteGuard::new(self, &DUMMY.0)
///
/// See `RwLock::try_write`.
#[inline]
- #[unstable = "may be merged with RwLock in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with RwLock in the future")]
pub fn try_write(&'static self)
-> TryLockResult<RwLockWriteGuard<'static, ()>> {
if unsafe { self.lock.try_write() } {
/// active users of the lock, and this also doesn't prevent any future users
/// of this lock. This method is required to be called to not leak memory on
/// all platforms.
- #[unstable = "may be merged with RwLock in the future"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may be merged with RwLock in the future")]
pub unsafe fn destroy(&'static self) {
self.lock.destroy()
}
}
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'rwlock, T> Deref for RwLockReadGuard<'rwlock, T> {
type Target = T;
fn deref(&self) -> &T { unsafe { &*self.__data.get() } }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'rwlock, T> Deref for RwLockWriteGuard<'rwlock, T> {
type Target = T;
fn deref(&self) -> &T { unsafe { &*self.__data.get() } }
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'rwlock, T> DerefMut for RwLockWriteGuard<'rwlock, T> {
fn deref_mut(&mut self) -> &mut T {
unsafe { &mut *self.__data.get() }
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Drop for RwLockReadGuard<'a, T> {
fn drop(&mut self) {
unsafe { self.__lock.lock.read_unlock(); }
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T> Drop for RwLockWriteGuard<'a, T> {
fn drop(&mut self) {
self.__lock.poison.done(&self.__poison);
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![unstable = "the interaction between semaphores and the acquisition/release \
- of resources is currently unclear"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "the interaction between semaphores and the acquisition/release \
+ of resources is currently unclear")]
use ops::Drop;
use sync::{Mutex, Condvar};
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a> Drop for SemaphoreGuard<'a> {
fn drop(&mut self) {
self.sem.release();
//! Abstraction of a thread pool for basic parallelism.
-#![unstable = "the semantics of a failing task and whether a thread is \
- re-attached to a thread pool are somewhat unclear, and the \
- utility of this type in `std::sync` is questionable with \
- respect to the jobs of other primitives"]
+#![unstable(feature = "unnamed_feature", since="1.0.0",
+ reason = "the semantics of a failing task and whether a thread is \
+ re-attached to a thread pool are somewhat unclear, and the \
+ utility of this type in `std::sync` is questionable with \
+ respect to the jobs of other primitives")]
use core::prelude::*;
//! }
//! ```
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use sys_common::AsInner;
use libc;
//! descriptors, and sockets, but its functionality will grow over
//! time.
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use sys_common::AsInner;
use libc;
//!
//! * It can be implemented highly efficiently on many platforms.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use any::Any;
use boxed::Box;
/// Thread configuration. Provides detailed control over the properties
/// and behavior of new threads.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Builder {
// A name for the thread-to-be, for identification in panic messages
name: Option<String>,
impl Builder {
/// Generate the base configuration for spawning a thread, from which
/// configuration methods can be chained.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn new() -> Builder {
Builder {
name: None,
/// Name the thread-to-be. Currently the name is used for identification
/// only in panic messages.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn name(mut self, name: String) -> Builder {
self.name = Some(name);
self
}
/// Set the size of the stack for the new thread.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn stack_size(mut self, size: uint) -> Builder {
self.stack_size = Some(size);
self
}
/// Redirect thread-local stdout.
- #[unstable = "Will likely go away after proc removal"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Will likely go away after proc removal")]
pub fn stdout(mut self, stdout: Box<Writer + Send>) -> Builder {
self.stdout = Some(stdout);
self
}
/// Redirect thread-local stderr.
- #[unstable = "Will likely go away after proc removal"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "Will likely go away after proc removal")]
pub fn stderr(mut self, stderr: Box<Writer + Send>) -> Builder {
self.stderr = Some(stderr);
self
/// Spawn a new detached thread, and return a handle to it.
///
/// See `Thead::spawn` and the module doc for more details.
- #[unstable = "may change with specifics of new Send semantics"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may change with specifics of new Send semantics")]
pub fn spawn<F>(self, f: F) -> Thread where F: FnOnce(), F: Send + 'static {
let (native, thread) = self.spawn_inner(Thunk::new(f), Thunk::with_arg(|_| {}));
unsafe { imp::detach(native) };
/// scope, and return a `JoinGuard`.
///
/// See `Thead::scoped` and the module doc for more details.
- #[unstable = "may change with specifics of new Send semantics"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may change with specifics of new Send semantics")]
pub fn scoped<'a, T, F>(self, f: F) -> JoinGuard<'a, T> where
T: Send + 'a, F: FnOnce() -> T, F: Send + 'a
{
unsafe impl Sync for Inner {}
#[derive(Clone)]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
/// A handle to a thread.
pub struct Thread {
inner: Arc<Inner>,
/// main thread; the whole process is terminated when the main thread
/// finishes.) The thread handle can be used for low-level
/// synchronization. See the module documentation for additional details.
- #[unstable = "may change with specifics of new Send semantics"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may change with specifics of new Send semantics")]
pub fn spawn<F>(f: F) -> Thread where F: FnOnce(), F: Send + 'static {
Builder::new().spawn(f)
}
/// current thread's stack (hence the "scoped" name), it cannot be detached;
/// it *must* be joined before the relevant stack frame is popped. See the
/// module documentation for additional details.
- #[unstable = "may change with specifics of new Send semantics"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may change with specifics of new Send semantics")]
pub fn scoped<'a, T, F>(f: F) -> JoinGuard<'a, T> where
T: Send + 'a, F: FnOnce() -> T, F: Send + 'a
{
}
/// Gets a handle to the thread that invokes it.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn current() -> Thread {
thread_info::current_thread()
}
/// Cooperatively give up a timeslice to the OS scheduler.
- #[unstable = "name may change"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "name may change")]
pub fn yield_now() {
unsafe { imp::yield_now() }
}
/// Determines whether the current thread is panicking.
#[inline]
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn panicking() -> bool {
unwind::panicking()
}
// future, this will be implemented in a more efficient way, perhaps along the lines of
// http://cr.openjdk.java.net/~stefank/6989984.1/raw_files/new/src/os/linux/vm/os_linux.cpp
// or futuxes, and in either case may allow spurious wakeups.
- #[unstable = "recently introduced"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recently introduced")]
pub fn park() {
let thread = Thread::current();
let mut guard = thread.inner.lock.lock().unwrap();
/// Atomically makes the handle's token available if it is not already.
///
/// See the module doc for more detail.
- #[unstable = "recently introduced"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "recently introduced")]
pub fn unpark(&self) {
let mut guard = self.inner.lock.lock().unwrap();
if !*guard {
}
/// Get the thread's name.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn name(&self) -> Option<&str> {
self.inner.name.as_ref().map(|s| s.as_slice())
}
/// Indicates the manner in which a thread exited.
///
/// A thread that completes without panicking is considered to exit successfully.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub type Result<T> = ::result::Result<T, Box<Any + Send>>;
struct Packet<T>(Arc<UnsafeCell<Option<Result<T>>>>);
///
/// The type `T` is the return type for the thread's main function.
#[must_use]
-#[unstable = "may change with specifics of new Send semantics"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "may change with specifics of new Send semantics")]
pub struct JoinGuard<'a, T: 'a> {
native: imp::rust_thread,
thread: Thread,
packet: Packet<T>,
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
unsafe impl<'a, T: Send + 'a> Sync for JoinGuard<'a, T> {}
impl<'a, T: Send + 'a> JoinGuard<'a, T> {
/// Extract a handle to the thread this guard will join on.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn thread(&self) -> &Thread {
&self.thread
}
///
/// If the child thread panics, `Err` is returned with the parameter given
/// to `panic`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn join(mut self) -> Result<T> {
assert!(!self.joined);
unsafe { imp::join(self.native) };
impl<T: Send> JoinGuard<'static, T> {
/// Detaches the child thread, allowing it to outlive its parent.
- #[unstable = "unsure whether this API imposes limitations elsewhere"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "unsure whether this API imposes limitations elsewhere")]
pub fn detach(mut self) {
unsafe { imp::detach(self.native) };
self.joined = true; // avoid joining in the destructor
}
#[unsafe_destructor]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl<'a, T: Send + 'a> Drop for JoinGuard<'a, T> {
fn drop(&mut self) {
if !self.joined {
//! will want to make use of some form of **interior mutability** through the
//! `Cell` or `RefCell` types.
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
use prelude::v1::*;
/// assert_eq!(*f.borrow(), 2);
/// });
/// ```
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Key<T> {
// The key itself may be tagged with #[thread_local], and this `Key` is
// stored as a `static`, and it's not valid for a static to reference the
/// Declare a new thread local storage key of type `std::thread_local::Key`.
#[macro_export]
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
macro_rules! thread_local {
(static $name:ident: $t:ty = $init:expr) => (
static $name: ::std::thread_local::Key<$t> = {
}
/// Indicator of the state of a thread local storage key.
-#[unstable = "state querying was recently added"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "state querying was recently added")]
#[derive(Eq, PartialEq, Copy)]
pub enum State {
/// All keys are in this state whenever a thread starts. Keys will
/// This function will `panic!()` if the key currently has its
/// destructor running, and it **may** panic if the destructor has
/// previously been run for this thread.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn with<F, R>(&'static self, f: F) -> R
where F: FnOnce(&T) -> R {
let slot = (self.inner)();
/// initialization does not panic. Keys in the `Valid` state are guaranteed
/// to be able to be accessed. Keys in the `Destroyed` state will panic on
/// any call to `with`.
- #[unstable = "state querying was recently added"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "state querying was recently added")]
pub fn state(&'static self) -> State {
unsafe {
match (self.inner)().get() {
}
/// Deprecated
- #[deprecated = "function renamed to state() and returns more info"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "function renamed to state() and returns more info")]
pub fn destroyed(&'static self) -> bool { self.state() == State::Destroyed }
}
//! });
//! ```
-#![unstable = "scoped TLS has yet to have wide enough use to fully consider \
- stabilizing its interface"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "scoped TLS has yet to have wide enough use to fully consider \
+ stabilizing its interface")]
use prelude::v1::*;
//! Temporal quantification
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
use {fmt, i64};
use ops::{Add, Sub, Mul, Div, Neg, FnOnce};
//! ```
#![doc(primitive = "tuple")]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
// except according to those terms.
#![doc(primitive = "unit")]
-#![stable]
+#![stable(feature = "grandfathered", since = "1.0.0")]
//! The `()` type, sometimes called "unit" or "nil".
//!
use codemap::BytePos;
use diagnostic::SpanHandler;
use parse::lexer::comments::{doc_comment_style, strip_doc_comment_decoration};
-use parse::token::InternedString;
+use parse::token::{InternedString, intern_and_get_ident};
use parse::token;
use ptr::P;
fn value_str(&self) -> Option<InternedString>;
/// Gets a list of inner meta items from a list MetaItem type.
fn meta_item_list<'a>(&'a self) -> Option<&'a [P<MetaItem>]>;
+
+ fn span(&self) -> Span;
}
impl AttrMetaMethods for Attribute {
fn meta_item_list<'a>(&'a self) -> Option<&'a [P<MetaItem>]> {
self.node.value.meta_item_list()
}
+ fn span(&self) -> Span { self.meta().span }
}
impl AttrMetaMethods for MetaItem {
_ => None
}
}
+ fn span(&self) -> Span { self.span }
}
// Annoying, but required to get test_cfg to work
fn meta_item_list<'a>(&'a self) -> Option<&'a [P<MetaItem>]> {
(**self).meta_item_list()
}
+ fn span(&self) -> Span { (**self).span() }
}
}
}
-/// Represents the #[deprecated="foo"] and friends attributes.
+/// Represents the #[deprecated] and friends attributes.
#[derive(RustcEncodable,RustcDecodable,Clone,Show)]
pub struct Stability {
pub level: StabilityLevel,
- pub text: Option<InternedString>
+ pub feature: InternedString,
+ pub since: InternedString,
+ pub reason: Option<InternedString>,
}
/// The available stability levels.
pub fn find_stability_generic<'a,
AM: AttrMetaMethods,
I: Iterator<Item=&'a AM>>
- (mut attrs: I)
+ (diagnostic: &SpanHandler, mut attrs: I)
-> Option<(Stability, &'a AM)> {
for attr in attrs {
let level = match attr.name().get() {
_ => continue // not a stability level
};
+ let (feature, since, reason) = match attr.meta_item_list() {
+ Some(metas) => {
+ let mut feature = None;
+ let mut since = None;
+ let mut reason = None;
+ for meta in metas.iter() {
+ if meta.name().get() == "feature" {
+ match meta.value_str() {
+ Some(v) => feature = Some(v),
+ None => {
+ diagnostic.span_err(meta.span, "incorrect meta item");
+ }
+ }
+ }
+ if meta.name().get() == "since" {
+ match meta.value_str() {
+ Some(v) => since = Some(v),
+ None => {
+ diagnostic.span_err(meta.span, "incorrect meta item");
+ }
+ }
+ }
+ if meta.name().get() == "reason" {
+ match meta.value_str() {
+ Some(v) => reason = Some(v),
+ None => {
+ diagnostic.span_err(meta.span, "incorrect meta item");
+ }
+ }
+ }
+ }
+ (feature, since, reason)
+ }
+ None => {
+ diagnostic.span_err(attr.span(), "incorrect stability attribute type");
+ (None, None, None)
+ }
+ };
+
+ if feature == None {
+ diagnostic.span_err(attr.span(), "missing 'feature'");
+ }
+
+ if since == None {
+ diagnostic.span_err(attr.span(), "missing 'since'");
+ }
+
return Some((Stability {
level: level,
- text: attr.value_str()
- }, attr));
+ feature: feature.unwrap_or(intern_and_get_ident("bogus")),
+ since: since.unwrap_or(intern_and_get_ident("bogus")),
+ reason: reason,
+ }, attr));
}
None
}
/// Find the first stability attribute. `None` if none exists.
-pub fn find_stability(attrs: &[Attribute]) -> Option<Stability> {
- find_stability_generic(attrs.iter()).map(|(s, attr)| {
+pub fn find_stability(diagnostic: &SpanHandler, attrs: &[Attribute]) -> Option<Stability> {
+ find_stability_generic(diagnostic, attrs.iter()).map(|(s, attr)| {
mark_used(attr);
s
})
}
}
- #[deprecated = "Replaced with `expander().fold_expr()`"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0",
+ reason = "Replaced with `expander().fold_expr()`")]
pub fn expand_expr(&mut self, e: P<ast::Expr>) -> P<ast::Expr> {
self.expander().fold_expr(e)
}
//! This API is completely unstable and subject to change.
#![crate_name = "syntax"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "dylib"]
#![crate_type = "rlib"]
}
/// Deprecated: use `into_iter`.
- #[deprecated = "use into_iter"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "use into_iter")]
pub fn move_iter(self) -> IntoIter<T> {
self.into_iter()
}
//! [ti]: https://en.wikipedia.org/wiki/Terminfo
#![crate_name = "term"]
-#![unstable = "use the crates.io `term` library instead"]
+#![unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "use the crates.io `term` library instead")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
// build off of.
#![crate_name = "test"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
//! (yet) aim to provide a full set of Unicode tables.
#![crate_name = "unicode"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
#![crate_type = "rlib"]
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
/// (inclusive) are allowed. A `char` can always be safely cast to a `u32`;
/// however the converse is not always true due to the above range limits
/// and, as such, should be performed via the `from_u32` function..
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub mod char {
pub use core::char::{MAX, from_u32, from_digit};
use tables::{derived_property, property, general_category, conversions, charwidth};
/// Functionality for manipulating `char`.
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait CharExt {
/// Checks if a `char` parses as a numeric digit in the given radix.
///
/// # Panics
///
/// Panics if given a radix > 36.
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn is_digit(self, radix: uint) -> bool;
/// Converts a character to the corresponding digit.
/// # Panics
///
/// Panics if given a radix outside the range [0..36].
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn to_digit(self, radix: uint) -> Option<uint>;
/// Returns an iterator that yields the hexadecimal Unicode escape
/// All characters are escaped with Rust syntax of the form `\\u{NNNN}`
/// where `NNNN` is the shortest hexadecimal representation of the code
/// point.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_unicode(self) -> char::EscapeUnicode;
/// Returns an iterator that yields the 'default' ASCII and
/// escaped.
/// * Any other chars in the range [0x20,0x7e] are not escaped.
/// * Any other chars are given hex Unicode escapes; see `escape_unicode`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_default(self) -> char::EscapeDefault;
/// Returns the amount of bytes this character would need if encoded in
/// UTF-8.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf8(self) -> uint;
/// Returns the amount of bytes this character would need if encoded in
/// UTF-16.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf16(self) -> uint;
/// Encodes this character as UTF-8 into the provided byte buffer,
///
/// If the buffer is not large enough, nothing will be written into it
/// and a `None` will be returned.
- #[unstable = "pending decision about Iterator/Writer/Reader"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending decision about Iterator/Writer/Reader")]
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint>;
/// Encodes this character as UTF-16 into the provided `u16` buffer,
///
/// If the buffer is not large enough, nothing will be written into it
/// and a `None` will be returned.
- #[unstable = "pending decision about Iterator/Writer/Reader"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending decision about Iterator/Writer/Reader")]
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint>;
/// Returns whether the specified character is considered a Unicode
/// alphabetic code point.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_alphabetic(self) -> bool;
/// Returns whether the specified character satisfies the 'XID_Start'
/// 'XID_Start' is a Unicode Derived Property specified in
/// [UAX #31](http://unicode.org/reports/tr31/#NFKC_Modifications),
/// mostly similar to ID_Start but modified for closure under NFKx.
- #[unstable = "mainly needed for compiler internals"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "mainly needed for compiler internals")]
fn is_xid_start(self) -> bool;
/// Returns whether the specified `char` satisfies the 'XID_Continue'
/// 'XID_Continue' is a Unicode Derived Property specified in
/// [UAX #31](http://unicode.org/reports/tr31/#NFKC_Modifications),
/// mostly similar to 'ID_Continue' but modified for closure under NFKx.
- #[unstable = "mainly needed for compiler internals"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "mainly needed for compiler internals")]
fn is_xid_continue(self) -> bool;
/// Indicates whether a character is in lowercase.
///
/// This is defined according to the terms of the Unicode Derived Core
/// Property `Lowercase`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_lowercase(self) -> bool;
/// Indicates whether a character is in uppercase.
///
/// This is defined according to the terms of the Unicode Derived Core
/// Property `Uppercase`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_uppercase(self) -> bool;
/// Indicates whether a character is whitespace.
///
/// Whitespace is defined in terms of the Unicode Property `White_Space`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_whitespace(self) -> bool;
/// Indicates whether a character is alphanumeric.
///
/// Alphanumericness is defined in terms of the Unicode General Categories
/// 'Nd', 'Nl', 'No' and the Derived Core Property 'Alphabetic'.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_alphanumeric(self) -> bool;
/// Indicates whether a character is a control code point.
///
/// Control code points are defined in terms of the Unicode General
/// Category `Cc`.
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_control(self) -> bool;
/// Indicates whether the character is numeric (Nd, Nl, or No).
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_numeric(self) -> bool;
/// Converts a character to its lowercase equivalent.
///
/// Returns the lowercase equivalent of the character, or the character
/// itself if no conversion is possible.
- #[unstable = "pending case transformation decisions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending case transformation decisions")]
fn to_lowercase(self) -> char;
/// Converts a character to its uppercase equivalent.
/// [`SpecialCasing`.txt`]: ftp://ftp.unicode.org/Public/UNIDATA/SpecialCasing.txt
///
/// [2]: http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf#G33992
- #[unstable = "pending case transformation decisions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending case transformation decisions")]
fn to_uppercase(self) -> char;
/// Returns this character's displayed width in columns, or `None` if it is a
/// [Unicode Standard Annex #11](http://www.unicode.org/reports/tr11/)
/// recommends that these characters be treated as 1 column (i.e.,
/// `is_cjk` = `false`) if the context cannot be reliably determined.
- #[unstable = "needs expert opinion. is_cjk flag stands out as ugly"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "needs expert opinion. is_cjk flag stands out as ugly")]
fn width(self, is_cjk: bool) -> Option<uint>;
}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
impl CharExt for char {
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn is_digit(self, radix: uint) -> bool { C::is_digit(self, radix) }
- #[unstable = "pending integer conventions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending integer conventions")]
fn to_digit(self, radix: uint) -> Option<uint> { C::to_digit(self, radix) }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_unicode(self) -> char::EscapeUnicode { C::escape_unicode(self) }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn escape_default(self) -> char::EscapeDefault { C::escape_default(self) }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf8(self) -> uint { C::len_utf8(self) }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn len_utf16(self) -> uint { C::len_utf16(self) }
- #[unstable = "pending decision about Iterator/Writer/Reader"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending decision about Iterator/Writer/Reader")]
fn encode_utf8(self, dst: &mut [u8]) -> Option<uint> { C::encode_utf8(self, dst) }
- #[unstable = "pending decision about Iterator/Writer/Reader"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending decision about Iterator/Writer/Reader")]
fn encode_utf16(self, dst: &mut [u16]) -> Option<uint> { C::encode_utf16(self, dst) }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_alphabetic(self) -> bool {
match self {
'a' ... 'z' | 'A' ... 'Z' => true,
}
}
- #[unstable = "mainly needed for compiler internals"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "mainly needed for compiler internals")]
fn is_xid_start(self) -> bool { derived_property::XID_Start(self) }
- #[unstable = "mainly needed for compiler internals"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "mainly needed for compiler internals")]
fn is_xid_continue(self) -> bool { derived_property::XID_Continue(self) }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_lowercase(self) -> bool {
match self {
'a' ... 'z' => true,
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_uppercase(self) -> bool {
match self {
'A' ... 'Z' => true,
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_whitespace(self) -> bool {
match self {
' ' | '\x09' ... '\x0d' => true,
}
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_alphanumeric(self) -> bool {
self.is_alphabetic() || self.is_numeric()
}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_control(self) -> bool { general_category::Cc(self) }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn is_numeric(self) -> bool {
match self {
'0' ... '9' => true,
}
}
- #[unstable = "pending case transformation decisions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending case transformation decisions")]
fn to_lowercase(self) -> char { conversions::to_lower(self) }
- #[unstable = "pending case transformation decisions"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "pending case transformation decisions")]
fn to_uppercase(self) -> char { conversions::to_upper(self) }
- #[unstable = "needs expert opinion. is_cjk flag stands out as ugly"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0",
+ reason = "needs expert opinion. is_cjk flag stands out as ugly")]
fn width(self, is_cjk: bool) -> Option<uint> { charwidth::width(self, is_cjk) }
}
use tables::grapheme::GraphemeCat;
/// An iterator over the words of a string, separated by a sequence of whitespace
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct Words<'a> {
inner: Filter<&'a str, Split<'a, fn(char) -> bool>, fn(&&str) -> bool>,
}
// except according to those terms.
#![crate_name="inherited_stability"]
#![crate_type = "lib"]
-#![unstable]
+#![unstable(feature = "unnamed_feature", since = "1.0.0")]
#![staged_api]
-pub fn experimental() {}
+pub fn unstable() {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn stable() {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub mod stable_mod {
- pub fn experimental() {}
+ pub fn unstable() {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn stable() {}
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub mod unstable_mod {
- #[unstable]
- pub fn experimental() {}
+ #[deprecated(feature = "unnamed_feature", since = "1.0.0")]
+ pub fn deprecated() {}
pub fn unstable() {}
}
-pub mod experimental_mod {
- pub fn experimental() {}
-
- #[stable]
- pub fn stable() {}
-}
-
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub trait Stable {
- fn experimental(&self);
+ fn unstable(&self);
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn stable(&self);
}
impl Stable for uint {
- fn experimental(&self) {}
+ fn unstable(&self) {}
fn stable(&self) {}
}
-pub enum Experimental {
- ExperimentalVariant,
- #[stable]
+pub enum Unstable {
+ UnstableVariant,
+ #[stable(feature = "grandfathered", since = "1.0.0")]
StableVariant
}
#![crate_type = "lib"]
#![staged_api]
-#[deprecated]
+#[deprecated(feature = "oldstuff", since = "1.0.0")]
pub fn foo() -> uint {
20
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn bar() -> uint {
40
}
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn baz() -> uint {
30
}
#![crate_type = "lib"]
#![staged_api]
-#[deprecated]
+#[deprecated(feature = "oldstuff", since = "1.0.0")]
pub fn deprecated() {}
-#[deprecated="text"]
+#[deprecated(feature = "oldstuff", since = "1.0.0", reason = "text")]
pub fn deprecated_text() {}
-#[unstable]
-pub fn experimental() {}
-#[unstable="text"]
-pub fn experimental_text() {}
-
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn unstable() {}
-#[unstable="text"]
+#[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "text")]
pub fn unstable_text() {}
pub fn unmarked() {}
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub fn stable() {}
-#[stable="text"]
+#[stable(feature = "grandfathered", since = "1.0.0", reason = "text")]
pub fn stable_text() {}
-#[locked]
-pub fn locked() {}
-#[locked="text"]
-pub fn locked_text() {}
-
-#[frozen]
-pub fn frozen() {}
-#[frozen="text"]
-pub fn frozen_text() {}
-
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct MethodTester;
impl MethodTester {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
pub fn method_deprecated(&self) {}
- #[deprecated="text"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "text")]
pub fn method_deprecated_text(&self) {}
- #[unstable]
- pub fn method_experimental(&self) {}
- #[unstable="text"]
- pub fn method_experimental_text(&self) {}
-
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn method_unstable(&self) {}
- #[unstable="text"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "text")]
pub fn method_unstable_text(&self) {}
pub fn method_unmarked(&self) {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn method_stable(&self) {}
- #[stable="text"]
+ #[stable(feature = "grandfathered", since = "1.0.0", reason = "text")]
pub fn method_stable_text(&self) {}
#[locked]
}
pub trait Trait {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn trait_deprecated(&self) {}
- #[deprecated="text"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "text")]
fn trait_deprecated_text(&self) {}
- #[unstable]
- fn trait_experimental(&self) {}
- #[unstable="text"]
- fn trait_experimental_text(&self) {}
-
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn trait_unstable(&self) {}
- #[unstable="text"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "text")]
fn trait_unstable_text(&self) {}
fn trait_unmarked(&self) {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trait_stable(&self) {}
- #[stable="text"]
+ #[stable(feature = "grandfathered", since = "1.0.0", reason = "text")]
fn trait_stable_text(&self) {}
#[locked]
impl Trait for MethodTester {}
-#[unstable]
-pub trait ExperimentalTrait {}
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
+pub trait UnstableTrait {}
-#[deprecated]
+#[deprecated(feature = "oldstuff", since = "1.0.0")]
pub struct DeprecatedStruct { pub i: int }
-#[unstable]
-pub struct ExperimentalStruct { pub i: int }
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct UnstableStruct { pub i: int }
pub struct UnmarkedStruct { pub i: int }
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct StableStruct { pub i: int }
-#[frozen]
-pub struct FrozenStruct { pub i: int }
-#[locked]
-pub struct LockedStruct { pub i: int }
-#[deprecated]
+#[deprecated(feature = "oldstuff", since = "1.0.0")]
pub struct DeprecatedUnitStruct;
-#[unstable]
-pub struct ExperimentalUnitStruct;
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct UnstableUnitStruct;
pub struct UnmarkedUnitStruct;
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct StableUnitStruct;
-#[frozen]
-pub struct FrozenUnitStruct;
-#[locked]
-pub struct LockedUnitStruct;
pub enum Enum {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
DeprecatedVariant,
- #[unstable]
- ExperimentalVariant,
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
UnstableVariant,
UnmarkedVariant,
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
StableVariant,
- #[frozen]
- FrozenVariant,
- #[locked]
- LockedVariant,
}
-#[deprecated]
+#[deprecated(feature = "oldstuff", since = "1.0.0")]
pub struct DeprecatedTupleStruct(pub int);
-#[unstable]
-pub struct ExperimentalTupleStruct(pub int);
-#[unstable]
+#[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct UnstableTupleStruct(pub int);
pub struct UnmarkedTupleStruct(pub int);
-#[stable]
+#[stable(feature = "grandfathered", since = "1.0.0")]
pub struct StableTupleStruct(pub int);
-#[frozen]
-pub struct FrozenTupleStruct(pub int);
-#[locked]
-pub struct LockedTupleStruct(pub int);
#[macro_export]
macro_rules! macro_test {
// except according to those terms.
#![cfg_attr(foo, experimental)]
-#![cfg_attr(not(foo), stable)]
+#![cfg_attr(not(foo), stable(feature = "unnamed_feature", since = "1.0.0"))]
#![staged_api]
// compile-flags:--cfg foo
-#![cfg_attr(foo, unstable)]
-#![cfg_attr(not(foo), stable)]
+#![cfg_attr(foo, unstable(feature = "unnamed_feature", since = "1.0.0"))]
+#![cfg_attr(not(foo), stable(feature = "unnamed_feature", since = "1.0.0"))]
#![staged_api]
struct Foo;
impl Foo {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn foo(self) {}
}
impl Foo {
fn foo() {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
} //~ ERROR expected `fn`, found `}`
fn main() {}
struct Foo;
impl Foo {
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
} //~ ERROR expected `fn`, found `}`
fn main() {}
foo.method_deprecated_text(); //~ ERROR use of deprecated item: text
foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text
- experimental(); //~ ERROR use of unstable item
- foo.method_experimental(); //~ ERROR use of unstable item
- foo.trait_experimental(); //~ ERROR use of unstable item
-
- experimental_text(); //~ ERROR use of unstable item: text
- foo.method_experimental_text(); //~ ERROR use of unstable item: text
- foo.trait_experimental_text(); //~ ERROR use of unstable item: text
-
unstable(); //~ ERROR use of unstable item
foo.method_unstable(); //~ ERROR use of unstable item
foo.trait_unstable(); //~ ERROR use of unstable item
foo.method_stable_text();
foo.trait_stable_text();
- frozen();
- foo.method_frozen();
- foo.trait_frozen();
-
- frozen_text();
- foo.method_frozen_text();
- foo.trait_frozen_text();
-
- locked();
- foo.method_locked();
- foo.trait_locked();
-
- locked_text();
- foo.method_locked_text();
- foo.trait_locked_text();
-
let _ = DeprecatedStruct { i: 0 }; //~ ERROR use of deprecated item
- let _ = ExperimentalStruct { i: 0 }; //~ ERROR use of unstable item
let _ = UnstableStruct { i: 0 }; //~ ERROR use of unstable item
let _ = UnmarkedStruct { i: 0 }; //~ ERROR use of unmarked item
let _ = StableStruct { i: 0 };
- let _ = FrozenStruct { i: 0 };
- let _ = LockedStruct { i: 0 };
let _ = DeprecatedUnitStruct; //~ ERROR use of deprecated item
- let _ = ExperimentalUnitStruct; //~ ERROR use of unstable item
let _ = UnstableUnitStruct; //~ ERROR use of unstable item
let _ = UnmarkedUnitStruct; //~ ERROR use of unmarked item
let _ = StableUnitStruct;
- let _ = FrozenUnitStruct;
- let _ = LockedUnitStruct;
let _ = Enum::DeprecatedVariant; //~ ERROR use of deprecated item
- let _ = Enum::ExperimentalVariant; //~ ERROR use of unstable item
let _ = Enum::UnstableVariant; //~ ERROR use of unstable item
let _ = Enum::UnmarkedVariant; //~ ERROR use of unmarked item
let _ = Enum::StableVariant;
- let _ = Enum::FrozenVariant;
- let _ = Enum::LockedVariant;
let _ = DeprecatedTupleStruct (1); //~ ERROR use of deprecated item
- let _ = ExperimentalTupleStruct (1); //~ ERROR use of unstable item
let _ = UnstableTupleStruct (1); //~ ERROR use of unstable item
let _ = UnmarkedTupleStruct (1); //~ ERROR use of unmarked item
let _ = StableTupleStruct (1);
- let _ = FrozenTupleStruct (1);
- let _ = LockedTupleStruct (1);
// At the moment, the lint checker only checks stability in
// in the arguments of macros.
fn test_method_param<F: Trait>(foo: F) {
foo.trait_deprecated(); //~ ERROR use of deprecated item
foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text
- foo.trait_experimental(); //~ ERROR use of unstable item
- foo.trait_experimental_text(); //~ ERROR use of unstable item: text
foo.trait_unstable(); //~ ERROR use of unstable item
foo.trait_unstable_text(); //~ ERROR use of unstable item: text
foo.trait_unmarked(); //~ ERROR use of unmarked item
fn test_method_object(foo: &Trait) {
foo.trait_deprecated(); //~ ERROR use of deprecated item
foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text
- foo.trait_experimental(); //~ ERROR use of unstable item
- foo.trait_experimental_text(); //~ ERROR use of unstable item: text
foo.trait_unstable(); //~ ERROR use of unstable item
foo.trait_unstable_text(); //~ ERROR use of unstable item: text
foo.trait_unmarked(); //~ ERROR use of unmarked item
struct S;
- impl ExperimentalTrait for S { } //~ ERROR use of unstable item
+ impl UnstableTrait for S { } //~ ERROR use of unstable item
- trait LocalTrait : ExperimentalTrait { } //~ ERROR use of unstable item
+ trait LocalTrait : UnstableTrait { } //~ ERROR use of unstable item
}
mod inheritance {
use self::inherited_stability::*;
fn test_inheritance() {
- experimental(); //~ ERROR use of unstable item
+ unstable(); //~ ERROR use of unstable item
stable();
- stable_mod::experimental(); //~ ERROR use of unstable item
+ stable_mod::unstable(); //~ ERROR use of unstable item
stable_mod::stable();
- unstable_mod::experimental(); //~ ERROR use of unstable item
+ unstable_mod::deprecated(); //~ ERROR use of deprecated item
unstable_mod::unstable(); //~ ERROR use of unstable item
- experimental_mod::experimental(); //~ ERROR use of unstable item
- experimental_mod::stable();
-
- let _ = Experimental::ExperimentalVariant; //~ ERROR use of unstable item
- let _ = Experimental::StableVariant;
+ let _ = Unstable::UnstableVariant; //~ ERROR use of unstable item
+ let _ = Unstable::StableVariant;
let x: usize = 0;
- x.experimental(); //~ ERROR use of unstable item
+ x.unstable(); //~ ERROR use of unstable item
x.stable();
}
}
mod this_crate {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
pub fn deprecated() {}
- #[deprecated="text"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "text")]
pub fn deprecated_text() {}
- #[unstable]
- pub fn experimental() {}
- #[unstable="text"]
- pub fn experimental_text() {}
-
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn unstable() {}
- #[unstable="text"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "text")]
pub fn unstable_text() {}
pub fn unmarked() {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn stable() {}
- #[stable="text"]
+ #[stable(feature = "grandfathered", since = "1.0.0", reason = "text")]
pub fn stable_text() {}
- #[locked]
- pub fn locked() {}
- #[locked="text"]
- pub fn locked_text() {}
-
- #[frozen]
- pub fn frozen() {}
- #[frozen="text"]
- pub fn frozen_text() {}
-
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub struct MethodTester;
impl MethodTester {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
pub fn method_deprecated(&self) {}
- #[deprecated="text"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "text")]
pub fn method_deprecated_text(&self) {}
- #[unstable]
- pub fn method_experimental(&self) {}
- #[unstable="text"]
- pub fn method_experimental_text(&self) {}
-
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub fn method_unstable(&self) {}
- #[unstable="text"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "text")]
pub fn method_unstable_text(&self) {}
pub fn method_unmarked(&self) {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub fn method_stable(&self) {}
- #[stable="text"]
+ #[stable(feature = "grandfathered", since = "1.0.0", reason = "text")]
pub fn method_stable_text(&self) {}
-
- #[locked]
- pub fn method_locked(&self) {}
- #[locked="text"]
- pub fn method_locked_text(&self) {}
-
- #[frozen]
- pub fn method_frozen(&self) {}
- #[frozen="text"]
- pub fn method_frozen_text(&self) {}
}
pub trait Trait {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn trait_deprecated(&self) {}
- #[deprecated="text"]
+ #[deprecated(feature = "oldstuff", since = "1.0.0", reason = "text")]
fn trait_deprecated_text(&self) {}
- #[unstable]
- fn trait_experimental(&self) {}
- #[unstable="text"]
- fn trait_experimental_text(&self) {}
-
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
fn trait_unstable(&self) {}
- #[unstable="text"]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0", reason = "text")]
fn trait_unstable_text(&self) {}
fn trait_unmarked(&self) {}
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
fn trait_stable(&self) {}
- #[stable="text"]
+ #[stable(feature = "grandfathered", since = "1.0.0", reason = "text")]
fn trait_stable_text(&self) {}
-
- #[locked]
- fn trait_locked(&self) {}
- #[locked="text"]
- fn trait_locked_text(&self) {}
-
- #[frozen]
- fn trait_frozen(&self) {}
- #[frozen="text"]
- fn trait_frozen_text(&self) {}
}
impl Trait for MethodTester {}
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
pub struct DeprecatedStruct { i: isize }
- #[unstable]
- pub struct ExperimentalStruct { i: isize }
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct UnstableStruct { i: isize }
pub struct UnmarkedStruct { i: isize }
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub struct StableStruct { i: isize }
- #[frozen]
- pub struct FrozenStruct { i: isize }
- #[locked]
- pub struct LockedStruct { i: isize }
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
pub struct DeprecatedUnitStruct;
- #[unstable]
- pub struct ExperimentalUnitStruct;
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct UnstableUnitStruct;
pub struct UnmarkedUnitStruct;
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub struct StableUnitStruct;
- #[frozen]
- pub struct FrozenUnitStruct;
- #[locked]
- pub struct LockedUnitStruct;
pub enum Enum {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
DeprecatedVariant,
- #[unstable]
- ExperimentalVariant,
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
UnstableVariant,
UnmarkedVariant,
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
StableVariant,
- #[frozen]
- FrozenVariant,
- #[locked]
- LockedVariant,
}
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
pub struct DeprecatedTupleStruct(isize);
- #[unstable]
- pub struct ExperimentalTupleStruct(isize);
- #[unstable]
+ #[unstable(feature = "unnamed_feature", since = "1.0.0")]
pub struct UnstableTupleStruct(isize);
pub struct UnmarkedTupleStruct(isize);
- #[stable]
+ #[stable(feature = "grandfathered", since = "1.0.0")]
pub struct StableTupleStruct(isize);
- #[frozen]
- pub struct FrozenTupleStruct(isize);
- #[locked]
- pub struct LockedTupleStruct(isize);
fn test() {
// Only the deprecated cases of the following should generate
foo.method_deprecated_text(); //~ ERROR use of deprecated item: text
foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text
- experimental();
- foo.method_experimental();
- foo.trait_experimental();
-
- experimental_text();
- foo.method_experimental_text();
- foo.trait_experimental_text();
-
unstable();
foo.method_unstable();
foo.trait_unstable();
foo.method_stable_text();
foo.trait_stable_text();
- frozen();
- foo.method_frozen();
- foo.trait_frozen();
-
- frozen_text();
- foo.method_frozen_text();
- foo.trait_frozen_text();
-
- locked();
- foo.method_locked();
- foo.trait_locked();
-
- locked_text();
- foo.method_locked_text();
- foo.trait_locked_text();
-
let _ = DeprecatedStruct { i: 0 }; //~ ERROR use of deprecated item
- let _ = ExperimentalStruct { i: 0 };
let _ = UnstableStruct { i: 0 };
let _ = UnmarkedStruct { i: 0 };
let _ = StableStruct { i: 0 };
- let _ = FrozenStruct { i: 0 };
- let _ = LockedStruct { i: 0 };
let _ = DeprecatedUnitStruct; //~ ERROR use of deprecated item
- let _ = ExperimentalUnitStruct;
let _ = UnstableUnitStruct;
let _ = UnmarkedUnitStruct;
let _ = StableUnitStruct;
- let _ = FrozenUnitStruct;
- let _ = LockedUnitStruct;
let _ = Enum::DeprecatedVariant; //~ ERROR use of deprecated item
- let _ = Enum::ExperimentalVariant;
let _ = Enum::UnstableVariant;
let _ = Enum::UnmarkedVariant;
let _ = Enum::StableVariant;
- let _ = Enum::FrozenVariant;
- let _ = Enum::LockedVariant;
let _ = DeprecatedTupleStruct (1); //~ ERROR use of deprecated item
- let _ = ExperimentalTupleStruct (1);
let _ = UnstableTupleStruct (1);
let _ = UnmarkedTupleStruct (1);
let _ = StableTupleStruct (1);
- let _ = FrozenTupleStruct (1);
- let _ = LockedTupleStruct (1);
}
fn test_method_param<F: Trait>(foo: F) {
foo.trait_deprecated(); //~ ERROR use of deprecated item
foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text
- foo.trait_experimental();
- foo.trait_experimental_text();
foo.trait_unstable();
foo.trait_unstable_text();
foo.trait_unmarked();
fn test_method_object(foo: &Trait) {
foo.trait_deprecated(); //~ ERROR use of deprecated item
foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text
- foo.trait_experimental();
- foo.trait_experimental_text();
foo.trait_unstable();
foo.trait_unstable_text();
foo.trait_unmarked();
foo.trait_stable();
}
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn test_fn_body() {
fn fn_in_body() {}
fn_in_body();
}
impl MethodTester {
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
fn test_method_body(&self) {
fn fn_in_body() {}
fn_in_body();
}
}
- #[deprecated]
+ #[deprecated(feature = "oldstuff", since = "1.0.0")]
pub trait DeprecatedTrait {}
struct S;