From 91d227b219446d3a8b13f5bf7eb87bfc78a8b339 Mon Sep 17 00:00:00 2001 From: pravic Date: Tue, 12 Apr 2016 17:47:49 +0300 Subject: add libcore from 2016-04-11 nightly --- libcore/nonzero.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 libcore/nonzero.rs (limited to 'libcore/nonzero.rs') diff --git a/libcore/nonzero.rs b/libcore/nonzero.rs new file mode 100644 index 0000000..92bbc4e --- /dev/null +++ b/libcore/nonzero.rs @@ -0,0 +1,60 @@ +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Exposes the NonZero lang item which provides optimization hints. +#![unstable(feature = "nonzero", + reason = "needs an RFC to flesh out the design", + issue = "27730")] + +use marker::Sized; +use ops::{CoerceUnsized, Deref}; + +/// Unsafe trait to indicate what types are usable with the NonZero struct +pub unsafe trait Zeroable {} + +unsafe impl Zeroable for *const T {} +unsafe impl Zeroable for *mut T {} +unsafe impl Zeroable for isize {} +unsafe impl Zeroable for usize {} +unsafe impl Zeroable for i8 {} +unsafe impl Zeroable for u8 {} +unsafe impl Zeroable for i16 {} +unsafe impl Zeroable for u16 {} +unsafe impl Zeroable for i32 {} +unsafe impl Zeroable for u32 {} +unsafe impl Zeroable for i64 {} +unsafe impl Zeroable for u64 {} + +/// A wrapper type for raw pointers and integers that will never be +/// NULL or 0 that might allow certain optimizations. +#[lang = "non_zero"] +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Hash)] +pub struct NonZero(T); + +impl NonZero { + /// Creates an instance of NonZero with the provided value. + /// You must indeed ensure that the value is actually "non-zero". + #[inline(always)] + pub const unsafe fn new(inner: T) -> NonZero { + NonZero(inner) + } +} + +impl Deref for NonZero { + type Target = T; + + #[inline] + fn deref(&self) -> &T { + let NonZero(ref inner) = *self; + inner + } +} + +impl, U: Zeroable> CoerceUnsized> for NonZero {} -- cgit v1.2.3