Crate standback[][src]

Standback backports a number of methods, structs, and macros that have been stabilized in the Rust standard library since 1.31.0. This allows crate authors to depend on Standback rather than forcing downstream users to upgrade their compiler (or not use the new feature at all).

Due to a variety of restrictions in the Rust, it is not possible to implement everything that has been stabilized.

Usage

If you are using methods on already-existing structs, you should use the following:

use standback::prelude::*;

Additionally, if you are using newly stabilized structs, types, or anything else that would normally have to be imported, use standback instead of std:

use standback::mem::take;

It is highly recommended to use #![allow(unstable_name_collisions)], as that’s the whole point of this crate. Just be extra-careful to not do it for anything that can’t be backported.

#![no_std] support

By default, there standard library is used where necessary. If support for #![no_std] is required, use default-features = false.

An allocator is not required for any backported item. If any require an allocator in the future, it will be gated under an alloc feature.

Methods on existing structs

The following methods and constants are available via the prelude:

// 1.43
f32::RADIX
f32::MANTISSA_DIGITS
f32::DIGITS
f32::EPSILON
f32::MIN
f32::MIN_POSITIVE
f32::MAX
f32::MIN_EXP
f32::MAX_EXP
f32::MIN_10_EXP
f32::MAX_10_EXP
f32::NAN
f32::INFINITY
f32::NEG_INFINITY
f64::RADIX
f64::MANTISSA_DIGITS
f64::DIGITS
f64::EPSILON
f64::MIN
f64::MIN_POSITIVE
f64::MAX
f64::MIN_EXP
f64::MAX_EXP
f64::MIN_10_EXP
f64::MAX_10_EXP
f64::NAN
f64::INFINITY
f64::NEG_INFINITY
u8::MIN
u8::MAX
u16::MIN
u16::MAX
u32::MIN
u32::MAX
u64::MIN
u64::MAX
u128::MIN
u128::MAX
usize::MIN
usize::MAX
i8::MIN
i8::MAX
i16::MIN
i16::MAX
i32::MIN
i32::MAX
i64::MIN
i64::MAX
i128::MIN
i128::MAX
isize::MIN
isize::MAX

// 1.42
CondVar::wait_while
CondVar::wait_timeout_while
ManuallyDrop::take

// 1.41
Result::map_or
Result::map_or_else

// 1.40
Option::as_deref
Option::as_deref_mut
f32::to_be_bytes
f32::to_le_bytes
f32::to_ne_bytes
f64::to_be_bytes
f64::to_le_bytes
f64::to_ne_bytes
f32::from_be_bytes
f32::from_le_bytes
f32::from_ne_bytes
f64::from_be_bytes
f64::from_le_bytes
f64::from_ne_bytes
slice::repeat

// 1.39
// None :(

// 1.38
<*const T>::cast
<*mut T>::cast
Duration::as_secs_f32
Duration::as_secs_f64
Duration::div_f32
Duration::div_f64
Duration::from_secs_f32
Duration::from_secs_f64
Duration::mul_f32
Duration::mul_f64
i8::rem_euclid
i8::checked_rem_euclid
i8::wrapping_rem_euclid
i8::overflowing_rem_euclid
i8::div_euclid
i8::checked_div_euclid
i8::wrapping_div_euclid
i8::overflowing_div_euclid
i16::rem_euclid
i16::checked_rem_euclid
i16::wrapping_rem_euclid
i16::overflowing_rem_euclid
i16::div_euclid
i16::checked_div_euclid
i16::wrapping_div_euclid
i16::overflowing_div_euclid
i32::rem_euclid
i32::checked_rem_euclid
i32::wrapping_rem_euclid
i32::overflowing_rem_euclid
i32::div_euclid
i32::checked_div_euclid
i32::wrapping_div_euclid
i32::overflowing_div_euclid
i64::rem_euclid
i64::checked_rem_euclid
i64::wrapping_rem_euclid
i64::overflowing_rem_euclid
i64::div_euclid
i64::checked_div_euclid
i64::wrapping_div_euclid
i64::overflowing_div_euclid
i128::rem_euclid
i128::checked_rem_euclid
i128::wrapping_rem_euclid
i128::overflowing_rem_euclid
i128::div_euclid
i128::checked_div_euclid
i128::wrapping_div_euclid
i128::overflowing_div_euclid
isize::rem_euclid
isize::checked_rem_euclid
isize::wrapping_rem_euclid
isize::overflowing_rem_euclid
isize::div_euclid
isize::checked_div_euclid
isize::wrapping_div_euclid
isize::overflowing_div_euclid
u8::rem_euclid
u8::checked_rem_euclid
u8::wrapping_rem_euclid
u8::overflowing_rem_euclid
u8::div_euclid
u8::checked_div_euclid
u8::wrapping_div_euclid
u8::overflowing_div_euclid
u16::rem_euclid
u16::checked_rem_euclid
u16::wrapping_rem_euclid
u16::overflowing_rem_euclid
u16::div_euclid
u16::checked_div_euclid
u16::wrapping_div_euclid
u16::overflowing_div_euclid
u32::rem_euclid
u32::checked_rem_euclid
u32::wrapping_rem_euclid
u32::overflowing_rem_euclid
u32::div_euclid
u32::checked_div_euclid
u32::wrapping_div_euclid
u32::overflowing_div_euclid
u64::rem_euclid
u64::checked_rem_euclid
u64::wrapping_rem_euclid
u64::overflowing_rem_euclid
u64::div_euclid
u64::checked_div_euclid
u64::wrapping_div_euclid
u64::overflowing_div_euclid
u128::rem_euclid
u128::checked_rem_euclid
u128::wrapping_rem_euclid
u128::overflowing_rem_euclid
u128::div_euclid
u128::checked_div_euclid
u128::wrapping_div_euclid
u128::overflowing_div_euclid
usize::rem_euclid
usize::checked_rem_euclid
usize::wrapping_rem_euclid
usize::overflowing_rem_euclid
usize::div_euclid
usize::checked_div_euclid
usize::wrapping_div_euclid
usize::overflowing_div_euclid
f32::rem_euclid
f32::div_euclid
f64::rem_euclid
f64::div_euclid

// 1.37
Cell::from_mut
Cell<[T]>::as_slice_of_cells
DoubleEndedIterator::nth_back
Option::xor
slice::copy_within

// 1.36
Iterator::copied
mem::MaybeUninit
task::Context
task::RawWaker
task::RawWakerVTable
task::Waker
task::Poll

// 1.35
RefCell::replace_with
ptr::hash
Range::contains
RangeFrom::contains
RangeTo::contains
RangeInclusive::contains
RangeToInclusive::contains
Option::copied

// 1.34
slice::sort_by_cached_key
i8::checked_pow
i8::saturating_pow
i8::wrapping_pow
i8::overflowing_pow
i16::checked_pow
i16::saturating_pow
i16::wrapping_pow
i16::overflowing_pow
i32::checked_pow
i32::saturating_pow
i32::wrapping_pow
i32::overflowing_pow
i64::checked_pow
i64::saturating_pow
i64::wrapping_pow
i64::overflowing_pow
i128::checked_pow
i128::saturating_pow
i128::wrapping_pow
i128::overflowing_pow
isize::checked_pow
isize::saturating_pow
isize::wrapping_pow
isize::overflowing_pow
u8::checked_pow
u8::saturating_pow
u8::wrapping_pow
u8::overflowing_pow
u16::checked_pow
u16::saturating_pow
u16::wrapping_pow
u16::overflowing_pow
u32::checked_pow
u32::saturating_pow
u32::wrapping_pow
u32::overflowing_pow
u64::checked_pow
u64::saturating_pow
u64::wrapping_pow
u64::overflowing_pow
u128::checked_pow
u128::saturating_pow
u128::wrapping_pow
u128::overflowing_pow
usize::checked_pow
usize::saturating_pow
usize::wrapping_pow
usize::overflowing_pow

// 1.33
os::unix::fs::FileExt::read_exact_at
os::unix::fs::FileExt::write_all_at
Option::transpose
Result::transpose
VecDeque::resize_with
Duration::as_millis
Duration::as_micros
Duration::as_nanos

// 1.32
i8::to_be_bytes
i8::to_le_bytes
i8::to_ne_bytes
i8::from_be_bytes
i8::from_le_bytes
i8::from_ne_bytes
i16::to_be_bytes
i16::to_le_bytes
i16::to_ne_bytes
i16::from_be_bytes
i16::from_le_bytes
i16::from_ne_bytes
i32::to_be_bytes
i32::to_le_bytes
i32::to_ne_bytes
i32::from_be_bytes
i32::from_le_bytes
i32::from_ne_bytes
i64::to_be_bytes
i64::to_le_bytes
i64::to_ne_bytes
i64::from_be_bytes
i64::from_le_bytes
i64::from_ne_bytes
i128::to_be_bytes
i128::to_le_bytes
i128::to_ne_bytes
i128::from_be_bytes
i128::from_le_bytes
i128::from_ne_bytes
isize::to_be_bytes
isize::to_le_bytes
isize::to_ne_bytes
isize::from_be_bytes
isize::from_le_bytes
isize::from_ne_bytes
u8::to_be_bytes
u8::to_le_bytes
u8::to_ne_bytes
u8::from_be_bytes
u8::from_le_bytes
u8::from_ne_bytes
u16::to_be_bytes
u16::to_le_bytes
u16::to_ne_bytes
u16::from_be_bytes
u16::from_le_bytes
u16::from_ne_bytes
u32::to_be_bytes
u32::to_le_bytes
u32::to_ne_bytes
u32::from_be_bytes
u32::from_le_bytes
u32::from_ne_bytes
u64::to_be_bytes
u64::to_le_bytes
u64::to_ne_bytes
u64::from_be_bytes
u64::from_le_bytes
u64::from_ne_bytes
u128::to_be_bytes
u128::to_le_bytes
u128::to_ne_bytes
u128::from_be_bytes
u128::from_le_bytes
u128::from_ne_bytes
usize::to_be_bytes
usize::to_le_bytes
usize::to_ne_bytes
usize::from_be_bytes
usize::from_le_bytes
usize::from_ne_bytes

Other APIs implemented

primitive // 1.43 — requires rustc 1.32.0
f32::LOG10_2 // 1.43
f32::LOG2_10 // 1.43
f64::LOG10_2 // 1.43
f64::LOG2_10 // 1.43
iter::once_with // 1.43
mem::take // 1.40
iterator::Copied // 1.36
array::TryFromSliceError // 1.36
iter::from_fn // 1.34
iter::successors // 1.34
convert::TryFrom // 1.34
convert::TryInto // 1.34
num::TryFromIntError // 1.34
convert::identity // 1.33
pin::Pin // 1.33
marker::Unpin // 1.33

Macros

Macros should not be imported directly, but rather through the prelude.

todo! // 1.39
matches! // 1.42

Modules

array
convert
f32
f64
iter
marker
mem
num
pin
prelude
ptr
task

Traits

Float
Integer
Sealed