diff options
| author | pravic <[email protected]> | 2016-04-12 17:47:49 +0300 |
|---|---|---|
| committer | pravic <[email protected]> | 2016-04-12 17:47:49 +0300 |
| commit | 91d227b219446d3a8b13f5bf7eb87bfc78a8b339 (patch) | |
| tree | 0e438aefd2b3cf07354a68595d5aa4ed73f81f15 /libcore/nonzero.rs | |
| parent | add native import libraries (diff) | |
| download | kmd-env-rs-91d227b219446d3a8b13f5bf7eb87bfc78a8b339.tar.xz kmd-env-rs-91d227b219446d3a8b13f5bf7eb87bfc78a8b339.zip | |
add libcore from 2016-04-11 nightly
Diffstat (limited to 'libcore/nonzero.rs')
| -rw-r--r-- | libcore/nonzero.rs | 60 |
1 files changed, 60 insertions, 0 deletions
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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<T:?Sized> Zeroable for *const T {} +unsafe impl<T:?Sized> 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: Zeroable>(T); + +impl<T: Zeroable> NonZero<T> { + /// 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<T> { + NonZero(inner) + } +} + +impl<T: Zeroable> Deref for NonZero<T> { + type Target = T; + + #[inline] + fn deref(&self) -> &T { + let NonZero(ref inner) = *self; + inner + } +} + +impl<T: Zeroable+CoerceUnsized<U>, U: Zeroable> CoerceUnsized<NonZero<U>> for NonZero<T> {} |