162306a36Sopenharmony_ci// SPDX-License-Identifier: Apache-2.0 OR MIT
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci//! The `Box<T>` type for heap allocation.
462306a36Sopenharmony_ci//!
562306a36Sopenharmony_ci//! [`Box<T>`], casually referred to as a 'box', provides the simplest form of
662306a36Sopenharmony_ci//! heap allocation in Rust. Boxes provide ownership for this allocation, and
762306a36Sopenharmony_ci//! drop their contents when they go out of scope. Boxes also ensure that they
862306a36Sopenharmony_ci//! never allocate more than `isize::MAX` bytes.
962306a36Sopenharmony_ci//!
1062306a36Sopenharmony_ci//! # Examples
1162306a36Sopenharmony_ci//!
1262306a36Sopenharmony_ci//! Move a value from the stack to the heap by creating a [`Box`]:
1362306a36Sopenharmony_ci//!
1462306a36Sopenharmony_ci//! ```
1562306a36Sopenharmony_ci//! let val: u8 = 5;
1662306a36Sopenharmony_ci//! let boxed: Box<u8> = Box::new(val);
1762306a36Sopenharmony_ci//! ```
1862306a36Sopenharmony_ci//!
1962306a36Sopenharmony_ci//! Move a value from a [`Box`] back to the stack by [dereferencing]:
2062306a36Sopenharmony_ci//!
2162306a36Sopenharmony_ci//! ```
2262306a36Sopenharmony_ci//! let boxed: Box<u8> = Box::new(5);
2362306a36Sopenharmony_ci//! let val: u8 = *boxed;
2462306a36Sopenharmony_ci//! ```
2562306a36Sopenharmony_ci//!
2662306a36Sopenharmony_ci//! Creating a recursive data structure:
2762306a36Sopenharmony_ci//!
2862306a36Sopenharmony_ci//! ```
2962306a36Sopenharmony_ci//! #[derive(Debug)]
3062306a36Sopenharmony_ci//! enum List<T> {
3162306a36Sopenharmony_ci//!     Cons(T, Box<List<T>>),
3262306a36Sopenharmony_ci//!     Nil,
3362306a36Sopenharmony_ci//! }
3462306a36Sopenharmony_ci//!
3562306a36Sopenharmony_ci//! let list: List<i32> = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil))));
3662306a36Sopenharmony_ci//! println!("{list:?}");
3762306a36Sopenharmony_ci//! ```
3862306a36Sopenharmony_ci//!
3962306a36Sopenharmony_ci//! This will print `Cons(1, Cons(2, Nil))`.
4062306a36Sopenharmony_ci//!
4162306a36Sopenharmony_ci//! Recursive structures must be boxed, because if the definition of `Cons`
4262306a36Sopenharmony_ci//! looked like this:
4362306a36Sopenharmony_ci//!
4462306a36Sopenharmony_ci//! ```compile_fail,E0072
4562306a36Sopenharmony_ci//! # enum List<T> {
4662306a36Sopenharmony_ci//! Cons(T, List<T>),
4762306a36Sopenharmony_ci//! # }
4862306a36Sopenharmony_ci//! ```
4962306a36Sopenharmony_ci//!
5062306a36Sopenharmony_ci//! It wouldn't work. This is because the size of a `List` depends on how many
5162306a36Sopenharmony_ci//! elements are in the list, and so we don't know how much memory to allocate
5262306a36Sopenharmony_ci//! for a `Cons`. By introducing a [`Box<T>`], which has a defined size, we know how
5362306a36Sopenharmony_ci//! big `Cons` needs to be.
5462306a36Sopenharmony_ci//!
5562306a36Sopenharmony_ci//! # Memory layout
5662306a36Sopenharmony_ci//!
5762306a36Sopenharmony_ci//! For non-zero-sized values, a [`Box`] will use the [`Global`] allocator for
5862306a36Sopenharmony_ci//! its allocation. It is valid to convert both ways between a [`Box`] and a
5962306a36Sopenharmony_ci//! raw pointer allocated with the [`Global`] allocator, given that the
6062306a36Sopenharmony_ci//! [`Layout`] used with the allocator is correct for the type. More precisely,
6162306a36Sopenharmony_ci//! a `value: *mut T` that has been allocated with the [`Global`] allocator
6262306a36Sopenharmony_ci//! with `Layout::for_value(&*value)` may be converted into a box using
6362306a36Sopenharmony_ci//! [`Box::<T>::from_raw(value)`]. Conversely, the memory backing a `value: *mut
6462306a36Sopenharmony_ci//! T` obtained from [`Box::<T>::into_raw`] may be deallocated using the
6562306a36Sopenharmony_ci//! [`Global`] allocator with [`Layout::for_value(&*value)`].
6662306a36Sopenharmony_ci//!
6762306a36Sopenharmony_ci//! For zero-sized values, the `Box` pointer still has to be [valid] for reads
6862306a36Sopenharmony_ci//! and writes and sufficiently aligned. In particular, casting any aligned
6962306a36Sopenharmony_ci//! non-zero integer literal to a raw pointer produces a valid pointer, but a
7062306a36Sopenharmony_ci//! pointer pointing into previously allocated memory that since got freed is
7162306a36Sopenharmony_ci//! not valid. The recommended way to build a Box to a ZST if `Box::new` cannot
7262306a36Sopenharmony_ci//! be used is to use [`ptr::NonNull::dangling`].
7362306a36Sopenharmony_ci//!
7462306a36Sopenharmony_ci//! So long as `T: Sized`, a `Box<T>` is guaranteed to be represented
7562306a36Sopenharmony_ci//! as a single pointer and is also ABI-compatible with C pointers
7662306a36Sopenharmony_ci//! (i.e. the C type `T*`). This means that if you have extern "C"
7762306a36Sopenharmony_ci//! Rust functions that will be called from C, you can define those
7862306a36Sopenharmony_ci//! Rust functions using `Box<T>` types, and use `T*` as corresponding
7962306a36Sopenharmony_ci//! type on the C side. As an example, consider this C header which
8062306a36Sopenharmony_ci//! declares functions that create and destroy some kind of `Foo`
8162306a36Sopenharmony_ci//! value:
8262306a36Sopenharmony_ci//!
8362306a36Sopenharmony_ci//! ```c
8462306a36Sopenharmony_ci//! /* C header */
8562306a36Sopenharmony_ci//!
8662306a36Sopenharmony_ci//! /* Returns ownership to the caller */
8762306a36Sopenharmony_ci//! struct Foo* foo_new(void);
8862306a36Sopenharmony_ci//!
8962306a36Sopenharmony_ci//! /* Takes ownership from the caller; no-op when invoked with null */
9062306a36Sopenharmony_ci//! void foo_delete(struct Foo*);
9162306a36Sopenharmony_ci//! ```
9262306a36Sopenharmony_ci//!
9362306a36Sopenharmony_ci//! These two functions might be implemented in Rust as follows. Here, the
9462306a36Sopenharmony_ci//! `struct Foo*` type from C is translated to `Box<Foo>`, which captures
9562306a36Sopenharmony_ci//! the ownership constraints. Note also that the nullable argument to
9662306a36Sopenharmony_ci//! `foo_delete` is represented in Rust as `Option<Box<Foo>>`, since `Box<Foo>`
9762306a36Sopenharmony_ci//! cannot be null.
9862306a36Sopenharmony_ci//!
9962306a36Sopenharmony_ci//! ```
10062306a36Sopenharmony_ci//! #[repr(C)]
10162306a36Sopenharmony_ci//! pub struct Foo;
10262306a36Sopenharmony_ci//!
10362306a36Sopenharmony_ci//! #[no_mangle]
10462306a36Sopenharmony_ci//! pub extern "C" fn foo_new() -> Box<Foo> {
10562306a36Sopenharmony_ci//!     Box::new(Foo)
10662306a36Sopenharmony_ci//! }
10762306a36Sopenharmony_ci//!
10862306a36Sopenharmony_ci//! #[no_mangle]
10962306a36Sopenharmony_ci//! pub extern "C" fn foo_delete(_: Option<Box<Foo>>) {}
11062306a36Sopenharmony_ci//! ```
11162306a36Sopenharmony_ci//!
11262306a36Sopenharmony_ci//! Even though `Box<T>` has the same representation and C ABI as a C pointer,
11362306a36Sopenharmony_ci//! this does not mean that you can convert an arbitrary `T*` into a `Box<T>`
11462306a36Sopenharmony_ci//! and expect things to work. `Box<T>` values will always be fully aligned,
11562306a36Sopenharmony_ci//! non-null pointers. Moreover, the destructor for `Box<T>` will attempt to
11662306a36Sopenharmony_ci//! free the value with the global allocator. In general, the best practice
11762306a36Sopenharmony_ci//! is to only use `Box<T>` for pointers that originated from the global
11862306a36Sopenharmony_ci//! allocator.
11962306a36Sopenharmony_ci//!
12062306a36Sopenharmony_ci//! **Important.** At least at present, you should avoid using
12162306a36Sopenharmony_ci//! `Box<T>` types for functions that are defined in C but invoked
12262306a36Sopenharmony_ci//! from Rust. In those cases, you should directly mirror the C types
12362306a36Sopenharmony_ci//! as closely as possible. Using types like `Box<T>` where the C
12462306a36Sopenharmony_ci//! definition is just using `T*` can lead to undefined behavior, as
12562306a36Sopenharmony_ci//! described in [rust-lang/unsafe-code-guidelines#198][ucg#198].
12662306a36Sopenharmony_ci//!
12762306a36Sopenharmony_ci//! # Considerations for unsafe code
12862306a36Sopenharmony_ci//!
12962306a36Sopenharmony_ci//! **Warning: This section is not normative and is subject to change, possibly
13062306a36Sopenharmony_ci//! being relaxed in the future! It is a simplified summary of the rules
13162306a36Sopenharmony_ci//! currently implemented in the compiler.**
13262306a36Sopenharmony_ci//!
13362306a36Sopenharmony_ci//! The aliasing rules for `Box<T>` are the same as for `&mut T`. `Box<T>`
13462306a36Sopenharmony_ci//! asserts uniqueness over its content. Using raw pointers derived from a box
13562306a36Sopenharmony_ci//! after that box has been mutated through, moved or borrowed as `&mut T`
13662306a36Sopenharmony_ci//! is not allowed. For more guidance on working with box from unsafe code, see
13762306a36Sopenharmony_ci//! [rust-lang/unsafe-code-guidelines#326][ucg#326].
13862306a36Sopenharmony_ci//!
13962306a36Sopenharmony_ci//!
14062306a36Sopenharmony_ci//! [ucg#198]: https://github.com/rust-lang/unsafe-code-guidelines/issues/198
14162306a36Sopenharmony_ci//! [ucg#326]: https://github.com/rust-lang/unsafe-code-guidelines/issues/326
14262306a36Sopenharmony_ci//! [dereferencing]: core::ops::Deref
14362306a36Sopenharmony_ci//! [`Box::<T>::from_raw(value)`]: Box::from_raw
14462306a36Sopenharmony_ci//! [`Global`]: crate::alloc::Global
14562306a36Sopenharmony_ci//! [`Layout`]: crate::alloc::Layout
14662306a36Sopenharmony_ci//! [`Layout::for_value(&*value)`]: crate::alloc::Layout::for_value
14762306a36Sopenharmony_ci//! [valid]: ptr#safety
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci#![stable(feature = "rust1", since = "1.0.0")]
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ciuse core::any::Any;
15262306a36Sopenharmony_ciuse core::async_iter::AsyncIterator;
15362306a36Sopenharmony_ciuse core::borrow;
15462306a36Sopenharmony_ciuse core::cmp::Ordering;
15562306a36Sopenharmony_ciuse core::error::Error;
15662306a36Sopenharmony_ciuse core::fmt;
15762306a36Sopenharmony_ciuse core::future::Future;
15862306a36Sopenharmony_ciuse core::hash::{Hash, Hasher};
15962306a36Sopenharmony_ciuse core::iter::FusedIterator;
16062306a36Sopenharmony_ciuse core::marker::Tuple;
16162306a36Sopenharmony_ciuse core::marker::Unsize;
16262306a36Sopenharmony_ciuse core::mem::{self, SizedTypeProperties};
16362306a36Sopenharmony_ciuse core::ops::{
16462306a36Sopenharmony_ci    CoerceUnsized, Deref, DerefMut, DispatchFromDyn, Generator, GeneratorState, Receiver,
16562306a36Sopenharmony_ci};
16662306a36Sopenharmony_ciuse core::pin::Pin;
16762306a36Sopenharmony_ciuse core::ptr::{self, NonNull, Unique};
16862306a36Sopenharmony_ciuse core::task::{Context, Poll};
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
17162306a36Sopenharmony_ciuse crate::alloc::{handle_alloc_error, WriteCloneIntoRaw};
17262306a36Sopenharmony_ciuse crate::alloc::{AllocError, Allocator, Global, Layout};
17362306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
17462306a36Sopenharmony_ciuse crate::borrow::Cow;
17562306a36Sopenharmony_ciuse crate::raw_vec::RawVec;
17662306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
17762306a36Sopenharmony_ciuse crate::str::from_boxed_utf8_unchecked;
17862306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
17962306a36Sopenharmony_ciuse crate::string::String;
18062306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
18162306a36Sopenharmony_ciuse crate::vec::Vec;
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci#[cfg(not(no_thin))]
18462306a36Sopenharmony_ci#[unstable(feature = "thin_box", issue = "92791")]
18562306a36Sopenharmony_cipub use thin::ThinBox;
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci#[cfg(not(no_thin))]
18862306a36Sopenharmony_cimod thin;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci/// A pointer type that uniquely owns a heap allocation of type `T`.
19162306a36Sopenharmony_ci///
19262306a36Sopenharmony_ci/// See the [module-level documentation](../../std/boxed/index.html) for more.
19362306a36Sopenharmony_ci#[lang = "owned_box"]
19462306a36Sopenharmony_ci#[fundamental]
19562306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
19662306a36Sopenharmony_ci// The declaration of the `Box` struct must be kept in sync with the
19762306a36Sopenharmony_ci// `alloc::alloc::box_free` function or ICEs will happen. See the comment
19862306a36Sopenharmony_ci// on `box_free` for more details.
19962306a36Sopenharmony_cipub struct Box<
20062306a36Sopenharmony_ci    T: ?Sized,
20162306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global,
20262306a36Sopenharmony_ci>(Unique<T>, A);
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ciimpl<T> Box<T> {
20562306a36Sopenharmony_ci    /// Allocates memory on the heap and then places `x` into it.
20662306a36Sopenharmony_ci    ///
20762306a36Sopenharmony_ci    /// This doesn't actually allocate if `T` is zero-sized.
20862306a36Sopenharmony_ci    ///
20962306a36Sopenharmony_ci    /// # Examples
21062306a36Sopenharmony_ci    ///
21162306a36Sopenharmony_ci    /// ```
21262306a36Sopenharmony_ci    /// let five = Box::new(5);
21362306a36Sopenharmony_ci    /// ```
21462306a36Sopenharmony_ci    #[cfg(all(not(no_global_oom_handling)))]
21562306a36Sopenharmony_ci    #[inline(always)]
21662306a36Sopenharmony_ci    #[stable(feature = "rust1", since = "1.0.0")]
21762306a36Sopenharmony_ci    #[must_use]
21862306a36Sopenharmony_ci    #[rustc_diagnostic_item = "box_new"]
21962306a36Sopenharmony_ci    pub fn new(x: T) -> Self {
22062306a36Sopenharmony_ci        #[rustc_box]
22162306a36Sopenharmony_ci        Box::new(x)
22262306a36Sopenharmony_ci    }
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci    /// Constructs a new box with uninitialized contents.
22562306a36Sopenharmony_ci    ///
22662306a36Sopenharmony_ci    /// # Examples
22762306a36Sopenharmony_ci    ///
22862306a36Sopenharmony_ci    /// ```
22962306a36Sopenharmony_ci    /// #![feature(new_uninit)]
23062306a36Sopenharmony_ci    ///
23162306a36Sopenharmony_ci    /// let mut five = Box::<u32>::new_uninit();
23262306a36Sopenharmony_ci    ///
23362306a36Sopenharmony_ci    /// let five = unsafe {
23462306a36Sopenharmony_ci    ///     // Deferred initialization:
23562306a36Sopenharmony_ci    ///     five.as_mut_ptr().write(5);
23662306a36Sopenharmony_ci    ///
23762306a36Sopenharmony_ci    ///     five.assume_init()
23862306a36Sopenharmony_ci    /// };
23962306a36Sopenharmony_ci    ///
24062306a36Sopenharmony_ci    /// assert_eq!(*five, 5)
24162306a36Sopenharmony_ci    /// ```
24262306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
24362306a36Sopenharmony_ci    #[unstable(feature = "new_uninit", issue = "63291")]
24462306a36Sopenharmony_ci    #[must_use]
24562306a36Sopenharmony_ci    #[inline]
24662306a36Sopenharmony_ci    pub fn new_uninit() -> Box<mem::MaybeUninit<T>> {
24762306a36Sopenharmony_ci        Self::new_uninit_in(Global)
24862306a36Sopenharmony_ci    }
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci    /// Constructs a new `Box` with uninitialized contents, with the memory
25162306a36Sopenharmony_ci    /// being filled with `0` bytes.
25262306a36Sopenharmony_ci    ///
25362306a36Sopenharmony_ci    /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
25462306a36Sopenharmony_ci    /// of this method.
25562306a36Sopenharmony_ci    ///
25662306a36Sopenharmony_ci    /// # Examples
25762306a36Sopenharmony_ci    ///
25862306a36Sopenharmony_ci    /// ```
25962306a36Sopenharmony_ci    /// #![feature(new_uninit)]
26062306a36Sopenharmony_ci    ///
26162306a36Sopenharmony_ci    /// let zero = Box::<u32>::new_zeroed();
26262306a36Sopenharmony_ci    /// let zero = unsafe { zero.assume_init() };
26362306a36Sopenharmony_ci    ///
26462306a36Sopenharmony_ci    /// assert_eq!(*zero, 0)
26562306a36Sopenharmony_ci    /// ```
26662306a36Sopenharmony_ci    ///
26762306a36Sopenharmony_ci    /// [zeroed]: mem::MaybeUninit::zeroed
26862306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
26962306a36Sopenharmony_ci    #[inline]
27062306a36Sopenharmony_ci    #[unstable(feature = "new_uninit", issue = "63291")]
27162306a36Sopenharmony_ci    #[must_use]
27262306a36Sopenharmony_ci    pub fn new_zeroed() -> Box<mem::MaybeUninit<T>> {
27362306a36Sopenharmony_ci        Self::new_zeroed_in(Global)
27462306a36Sopenharmony_ci    }
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci    /// Constructs a new `Pin<Box<T>>`. If `T` does not implement [`Unpin`], then
27762306a36Sopenharmony_ci    /// `x` will be pinned in memory and unable to be moved.
27862306a36Sopenharmony_ci    ///
27962306a36Sopenharmony_ci    /// Constructing and pinning of the `Box` can also be done in two steps: `Box::pin(x)`
28062306a36Sopenharmony_ci    /// does the same as <code>[Box::into_pin]\([Box::new]\(x))</code>. Consider using
28162306a36Sopenharmony_ci    /// [`into_pin`](Box::into_pin) if you already have a `Box<T>`, or if you want to
28262306a36Sopenharmony_ci    /// construct a (pinned) `Box` in a different way than with [`Box::new`].
28362306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
28462306a36Sopenharmony_ci    #[stable(feature = "pin", since = "1.33.0")]
28562306a36Sopenharmony_ci    #[must_use]
28662306a36Sopenharmony_ci    #[inline(always)]
28762306a36Sopenharmony_ci    pub fn pin(x: T) -> Pin<Box<T>> {
28862306a36Sopenharmony_ci        Box::new(x).into()
28962306a36Sopenharmony_ci    }
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci    /// Allocates memory on the heap then places `x` into it,
29262306a36Sopenharmony_ci    /// returning an error if the allocation fails
29362306a36Sopenharmony_ci    ///
29462306a36Sopenharmony_ci    /// This doesn't actually allocate if `T` is zero-sized.
29562306a36Sopenharmony_ci    ///
29662306a36Sopenharmony_ci    /// # Examples
29762306a36Sopenharmony_ci    ///
29862306a36Sopenharmony_ci    /// ```
29962306a36Sopenharmony_ci    /// #![feature(allocator_api)]
30062306a36Sopenharmony_ci    ///
30162306a36Sopenharmony_ci    /// let five = Box::try_new(5)?;
30262306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
30362306a36Sopenharmony_ci    /// ```
30462306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
30562306a36Sopenharmony_ci    #[inline]
30662306a36Sopenharmony_ci    pub fn try_new(x: T) -> Result<Self, AllocError> {
30762306a36Sopenharmony_ci        Self::try_new_in(x, Global)
30862306a36Sopenharmony_ci    }
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci    /// Constructs a new box with uninitialized contents on the heap,
31162306a36Sopenharmony_ci    /// returning an error if the allocation fails
31262306a36Sopenharmony_ci    ///
31362306a36Sopenharmony_ci    /// # Examples
31462306a36Sopenharmony_ci    ///
31562306a36Sopenharmony_ci    /// ```
31662306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
31762306a36Sopenharmony_ci    ///
31862306a36Sopenharmony_ci    /// let mut five = Box::<u32>::try_new_uninit()?;
31962306a36Sopenharmony_ci    ///
32062306a36Sopenharmony_ci    /// let five = unsafe {
32162306a36Sopenharmony_ci    ///     // Deferred initialization:
32262306a36Sopenharmony_ci    ///     five.as_mut_ptr().write(5);
32362306a36Sopenharmony_ci    ///
32462306a36Sopenharmony_ci    ///     five.assume_init()
32562306a36Sopenharmony_ci    /// };
32662306a36Sopenharmony_ci    ///
32762306a36Sopenharmony_ci    /// assert_eq!(*five, 5);
32862306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
32962306a36Sopenharmony_ci    /// ```
33062306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
33162306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
33262306a36Sopenharmony_ci    #[inline]
33362306a36Sopenharmony_ci    pub fn try_new_uninit() -> Result<Box<mem::MaybeUninit<T>>, AllocError> {
33462306a36Sopenharmony_ci        Box::try_new_uninit_in(Global)
33562306a36Sopenharmony_ci    }
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci    /// Constructs a new `Box` with uninitialized contents, with the memory
33862306a36Sopenharmony_ci    /// being filled with `0` bytes on the heap
33962306a36Sopenharmony_ci    ///
34062306a36Sopenharmony_ci    /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
34162306a36Sopenharmony_ci    /// of this method.
34262306a36Sopenharmony_ci    ///
34362306a36Sopenharmony_ci    /// # Examples
34462306a36Sopenharmony_ci    ///
34562306a36Sopenharmony_ci    /// ```
34662306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
34762306a36Sopenharmony_ci    ///
34862306a36Sopenharmony_ci    /// let zero = Box::<u32>::try_new_zeroed()?;
34962306a36Sopenharmony_ci    /// let zero = unsafe { zero.assume_init() };
35062306a36Sopenharmony_ci    ///
35162306a36Sopenharmony_ci    /// assert_eq!(*zero, 0);
35262306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
35362306a36Sopenharmony_ci    /// ```
35462306a36Sopenharmony_ci    ///
35562306a36Sopenharmony_ci    /// [zeroed]: mem::MaybeUninit::zeroed
35662306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
35762306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
35862306a36Sopenharmony_ci    #[inline]
35962306a36Sopenharmony_ci    pub fn try_new_zeroed() -> Result<Box<mem::MaybeUninit<T>>, AllocError> {
36062306a36Sopenharmony_ci        Box::try_new_zeroed_in(Global)
36162306a36Sopenharmony_ci    }
36262306a36Sopenharmony_ci}
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ciimpl<T, A: Allocator> Box<T, A> {
36562306a36Sopenharmony_ci    /// Allocates memory in the given allocator then places `x` into it.
36662306a36Sopenharmony_ci    ///
36762306a36Sopenharmony_ci    /// This doesn't actually allocate if `T` is zero-sized.
36862306a36Sopenharmony_ci    ///
36962306a36Sopenharmony_ci    /// # Examples
37062306a36Sopenharmony_ci    ///
37162306a36Sopenharmony_ci    /// ```
37262306a36Sopenharmony_ci    /// #![feature(allocator_api)]
37362306a36Sopenharmony_ci    ///
37462306a36Sopenharmony_ci    /// use std::alloc::System;
37562306a36Sopenharmony_ci    ///
37662306a36Sopenharmony_ci    /// let five = Box::new_in(5, System);
37762306a36Sopenharmony_ci    /// ```
37862306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
37962306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
38062306a36Sopenharmony_ci    #[must_use]
38162306a36Sopenharmony_ci    #[inline]
38262306a36Sopenharmony_ci    pub fn new_in(x: T, alloc: A) -> Self
38362306a36Sopenharmony_ci    where
38462306a36Sopenharmony_ci        A: Allocator,
38562306a36Sopenharmony_ci    {
38662306a36Sopenharmony_ci        let mut boxed = Self::new_uninit_in(alloc);
38762306a36Sopenharmony_ci        unsafe {
38862306a36Sopenharmony_ci            boxed.as_mut_ptr().write(x);
38962306a36Sopenharmony_ci            boxed.assume_init()
39062306a36Sopenharmony_ci        }
39162306a36Sopenharmony_ci    }
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci    /// Allocates memory in the given allocator then places `x` into it,
39462306a36Sopenharmony_ci    /// returning an error if the allocation fails
39562306a36Sopenharmony_ci    ///
39662306a36Sopenharmony_ci    /// This doesn't actually allocate if `T` is zero-sized.
39762306a36Sopenharmony_ci    ///
39862306a36Sopenharmony_ci    /// # Examples
39962306a36Sopenharmony_ci    ///
40062306a36Sopenharmony_ci    /// ```
40162306a36Sopenharmony_ci    /// #![feature(allocator_api)]
40262306a36Sopenharmony_ci    ///
40362306a36Sopenharmony_ci    /// use std::alloc::System;
40462306a36Sopenharmony_ci    ///
40562306a36Sopenharmony_ci    /// let five = Box::try_new_in(5, System)?;
40662306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
40762306a36Sopenharmony_ci    /// ```
40862306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
40962306a36Sopenharmony_ci    #[inline]
41062306a36Sopenharmony_ci    pub fn try_new_in(x: T, alloc: A) -> Result<Self, AllocError>
41162306a36Sopenharmony_ci    where
41262306a36Sopenharmony_ci        A: Allocator,
41362306a36Sopenharmony_ci    {
41462306a36Sopenharmony_ci        let mut boxed = Self::try_new_uninit_in(alloc)?;
41562306a36Sopenharmony_ci        unsafe {
41662306a36Sopenharmony_ci            boxed.as_mut_ptr().write(x);
41762306a36Sopenharmony_ci            Ok(boxed.assume_init())
41862306a36Sopenharmony_ci        }
41962306a36Sopenharmony_ci    }
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci    /// Constructs a new box with uninitialized contents in the provided allocator.
42262306a36Sopenharmony_ci    ///
42362306a36Sopenharmony_ci    /// # Examples
42462306a36Sopenharmony_ci    ///
42562306a36Sopenharmony_ci    /// ```
42662306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
42762306a36Sopenharmony_ci    ///
42862306a36Sopenharmony_ci    /// use std::alloc::System;
42962306a36Sopenharmony_ci    ///
43062306a36Sopenharmony_ci    /// let mut five = Box::<u32, _>::new_uninit_in(System);
43162306a36Sopenharmony_ci    ///
43262306a36Sopenharmony_ci    /// let five = unsafe {
43362306a36Sopenharmony_ci    ///     // Deferred initialization:
43462306a36Sopenharmony_ci    ///     five.as_mut_ptr().write(5);
43562306a36Sopenharmony_ci    ///
43662306a36Sopenharmony_ci    ///     five.assume_init()
43762306a36Sopenharmony_ci    /// };
43862306a36Sopenharmony_ci    ///
43962306a36Sopenharmony_ci    /// assert_eq!(*five, 5)
44062306a36Sopenharmony_ci    /// ```
44162306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
44262306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
44362306a36Sopenharmony_ci    #[must_use]
44462306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
44562306a36Sopenharmony_ci    pub fn new_uninit_in(alloc: A) -> Box<mem::MaybeUninit<T>, A>
44662306a36Sopenharmony_ci    where
44762306a36Sopenharmony_ci        A: Allocator,
44862306a36Sopenharmony_ci    {
44962306a36Sopenharmony_ci        let layout = Layout::new::<mem::MaybeUninit<T>>();
45062306a36Sopenharmony_ci        // NOTE: Prefer match over unwrap_or_else since closure sometimes not inlineable.
45162306a36Sopenharmony_ci        // That would make code size bigger.
45262306a36Sopenharmony_ci        match Box::try_new_uninit_in(alloc) {
45362306a36Sopenharmony_ci            Ok(m) => m,
45462306a36Sopenharmony_ci            Err(_) => handle_alloc_error(layout),
45562306a36Sopenharmony_ci        }
45662306a36Sopenharmony_ci    }
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci    /// Constructs a new box with uninitialized contents in the provided allocator,
45962306a36Sopenharmony_ci    /// returning an error if the allocation fails
46062306a36Sopenharmony_ci    ///
46162306a36Sopenharmony_ci    /// # Examples
46262306a36Sopenharmony_ci    ///
46362306a36Sopenharmony_ci    /// ```
46462306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
46562306a36Sopenharmony_ci    ///
46662306a36Sopenharmony_ci    /// use std::alloc::System;
46762306a36Sopenharmony_ci    ///
46862306a36Sopenharmony_ci    /// let mut five = Box::<u32, _>::try_new_uninit_in(System)?;
46962306a36Sopenharmony_ci    ///
47062306a36Sopenharmony_ci    /// let five = unsafe {
47162306a36Sopenharmony_ci    ///     // Deferred initialization:
47262306a36Sopenharmony_ci    ///     five.as_mut_ptr().write(5);
47362306a36Sopenharmony_ci    ///
47462306a36Sopenharmony_ci    ///     five.assume_init()
47562306a36Sopenharmony_ci    /// };
47662306a36Sopenharmony_ci    ///
47762306a36Sopenharmony_ci    /// assert_eq!(*five, 5);
47862306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
47962306a36Sopenharmony_ci    /// ```
48062306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
48162306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
48262306a36Sopenharmony_ci    pub fn try_new_uninit_in(alloc: A) -> Result<Box<mem::MaybeUninit<T>, A>, AllocError>
48362306a36Sopenharmony_ci    where
48462306a36Sopenharmony_ci        A: Allocator,
48562306a36Sopenharmony_ci    {
48662306a36Sopenharmony_ci        let ptr = if T::IS_ZST {
48762306a36Sopenharmony_ci            NonNull::dangling()
48862306a36Sopenharmony_ci        } else {
48962306a36Sopenharmony_ci            let layout = Layout::new::<mem::MaybeUninit<T>>();
49062306a36Sopenharmony_ci            alloc.allocate(layout)?.cast()
49162306a36Sopenharmony_ci        };
49262306a36Sopenharmony_ci        unsafe { Ok(Box::from_raw_in(ptr.as_ptr(), alloc)) }
49362306a36Sopenharmony_ci    }
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci    /// Constructs a new `Box` with uninitialized contents, with the memory
49662306a36Sopenharmony_ci    /// being filled with `0` bytes in the provided allocator.
49762306a36Sopenharmony_ci    ///
49862306a36Sopenharmony_ci    /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
49962306a36Sopenharmony_ci    /// of this method.
50062306a36Sopenharmony_ci    ///
50162306a36Sopenharmony_ci    /// # Examples
50262306a36Sopenharmony_ci    ///
50362306a36Sopenharmony_ci    /// ```
50462306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
50562306a36Sopenharmony_ci    ///
50662306a36Sopenharmony_ci    /// use std::alloc::System;
50762306a36Sopenharmony_ci    ///
50862306a36Sopenharmony_ci    /// let zero = Box::<u32, _>::new_zeroed_in(System);
50962306a36Sopenharmony_ci    /// let zero = unsafe { zero.assume_init() };
51062306a36Sopenharmony_ci    ///
51162306a36Sopenharmony_ci    /// assert_eq!(*zero, 0)
51262306a36Sopenharmony_ci    /// ```
51362306a36Sopenharmony_ci    ///
51462306a36Sopenharmony_ci    /// [zeroed]: mem::MaybeUninit::zeroed
51562306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
51662306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
51762306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
51862306a36Sopenharmony_ci    #[must_use]
51962306a36Sopenharmony_ci    pub fn new_zeroed_in(alloc: A) -> Box<mem::MaybeUninit<T>, A>
52062306a36Sopenharmony_ci    where
52162306a36Sopenharmony_ci        A: Allocator,
52262306a36Sopenharmony_ci    {
52362306a36Sopenharmony_ci        let layout = Layout::new::<mem::MaybeUninit<T>>();
52462306a36Sopenharmony_ci        // NOTE: Prefer match over unwrap_or_else since closure sometimes not inlineable.
52562306a36Sopenharmony_ci        // That would make code size bigger.
52662306a36Sopenharmony_ci        match Box::try_new_zeroed_in(alloc) {
52762306a36Sopenharmony_ci            Ok(m) => m,
52862306a36Sopenharmony_ci            Err(_) => handle_alloc_error(layout),
52962306a36Sopenharmony_ci        }
53062306a36Sopenharmony_ci    }
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci    /// Constructs a new `Box` with uninitialized contents, with the memory
53362306a36Sopenharmony_ci    /// being filled with `0` bytes in the provided allocator,
53462306a36Sopenharmony_ci    /// returning an error if the allocation fails,
53562306a36Sopenharmony_ci    ///
53662306a36Sopenharmony_ci    /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
53762306a36Sopenharmony_ci    /// of this method.
53862306a36Sopenharmony_ci    ///
53962306a36Sopenharmony_ci    /// # Examples
54062306a36Sopenharmony_ci    ///
54162306a36Sopenharmony_ci    /// ```
54262306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
54362306a36Sopenharmony_ci    ///
54462306a36Sopenharmony_ci    /// use std::alloc::System;
54562306a36Sopenharmony_ci    ///
54662306a36Sopenharmony_ci    /// let zero = Box::<u32, _>::try_new_zeroed_in(System)?;
54762306a36Sopenharmony_ci    /// let zero = unsafe { zero.assume_init() };
54862306a36Sopenharmony_ci    ///
54962306a36Sopenharmony_ci    /// assert_eq!(*zero, 0);
55062306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
55162306a36Sopenharmony_ci    /// ```
55262306a36Sopenharmony_ci    ///
55362306a36Sopenharmony_ci    /// [zeroed]: mem::MaybeUninit::zeroed
55462306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
55562306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
55662306a36Sopenharmony_ci    pub fn try_new_zeroed_in(alloc: A) -> Result<Box<mem::MaybeUninit<T>, A>, AllocError>
55762306a36Sopenharmony_ci    where
55862306a36Sopenharmony_ci        A: Allocator,
55962306a36Sopenharmony_ci    {
56062306a36Sopenharmony_ci        let ptr = if T::IS_ZST {
56162306a36Sopenharmony_ci            NonNull::dangling()
56262306a36Sopenharmony_ci        } else {
56362306a36Sopenharmony_ci            let layout = Layout::new::<mem::MaybeUninit<T>>();
56462306a36Sopenharmony_ci            alloc.allocate_zeroed(layout)?.cast()
56562306a36Sopenharmony_ci        };
56662306a36Sopenharmony_ci        unsafe { Ok(Box::from_raw_in(ptr.as_ptr(), alloc)) }
56762306a36Sopenharmony_ci    }
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ci    /// Constructs a new `Pin<Box<T, A>>`. If `T` does not implement [`Unpin`], then
57062306a36Sopenharmony_ci    /// `x` will be pinned in memory and unable to be moved.
57162306a36Sopenharmony_ci    ///
57262306a36Sopenharmony_ci    /// Constructing and pinning of the `Box` can also be done in two steps: `Box::pin_in(x, alloc)`
57362306a36Sopenharmony_ci    /// does the same as <code>[Box::into_pin]\([Box::new_in]\(x, alloc))</code>. Consider using
57462306a36Sopenharmony_ci    /// [`into_pin`](Box::into_pin) if you already have a `Box<T, A>`, or if you want to
57562306a36Sopenharmony_ci    /// construct a (pinned) `Box` in a different way than with [`Box::new_in`].
57662306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
57762306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
57862306a36Sopenharmony_ci    #[must_use]
57962306a36Sopenharmony_ci    #[inline(always)]
58062306a36Sopenharmony_ci    pub fn pin_in(x: T, alloc: A) -> Pin<Self>
58162306a36Sopenharmony_ci    where
58262306a36Sopenharmony_ci        A: 'static + Allocator,
58362306a36Sopenharmony_ci    {
58462306a36Sopenharmony_ci        Self::into_pin(Self::new_in(x, alloc))
58562306a36Sopenharmony_ci    }
58662306a36Sopenharmony_ci
58762306a36Sopenharmony_ci    /// Converts a `Box<T>` into a `Box<[T]>`
58862306a36Sopenharmony_ci    ///
58962306a36Sopenharmony_ci    /// This conversion does not allocate on the heap and happens in place.
59062306a36Sopenharmony_ci    #[unstable(feature = "box_into_boxed_slice", issue = "71582")]
59162306a36Sopenharmony_ci    pub fn into_boxed_slice(boxed: Self) -> Box<[T], A> {
59262306a36Sopenharmony_ci        let (raw, alloc) = Box::into_raw_with_allocator(boxed);
59362306a36Sopenharmony_ci        unsafe { Box::from_raw_in(raw as *mut [T; 1], alloc) }
59462306a36Sopenharmony_ci    }
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci    /// Consumes the `Box`, returning the wrapped value.
59762306a36Sopenharmony_ci    ///
59862306a36Sopenharmony_ci    /// # Examples
59962306a36Sopenharmony_ci    ///
60062306a36Sopenharmony_ci    /// ```
60162306a36Sopenharmony_ci    /// #![feature(box_into_inner)]
60262306a36Sopenharmony_ci    ///
60362306a36Sopenharmony_ci    /// let c = Box::new(5);
60462306a36Sopenharmony_ci    ///
60562306a36Sopenharmony_ci    /// assert_eq!(Box::into_inner(c), 5);
60662306a36Sopenharmony_ci    /// ```
60762306a36Sopenharmony_ci    #[unstable(feature = "box_into_inner", issue = "80437")]
60862306a36Sopenharmony_ci    #[inline]
60962306a36Sopenharmony_ci    pub fn into_inner(boxed: Self) -> T {
61062306a36Sopenharmony_ci        *boxed
61162306a36Sopenharmony_ci    }
61262306a36Sopenharmony_ci}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ciimpl<T> Box<[T]> {
61562306a36Sopenharmony_ci    /// Constructs a new boxed slice with uninitialized contents.
61662306a36Sopenharmony_ci    ///
61762306a36Sopenharmony_ci    /// # Examples
61862306a36Sopenharmony_ci    ///
61962306a36Sopenharmony_ci    /// ```
62062306a36Sopenharmony_ci    /// #![feature(new_uninit)]
62162306a36Sopenharmony_ci    ///
62262306a36Sopenharmony_ci    /// let mut values = Box::<[u32]>::new_uninit_slice(3);
62362306a36Sopenharmony_ci    ///
62462306a36Sopenharmony_ci    /// let values = unsafe {
62562306a36Sopenharmony_ci    ///     // Deferred initialization:
62662306a36Sopenharmony_ci    ///     values[0].as_mut_ptr().write(1);
62762306a36Sopenharmony_ci    ///     values[1].as_mut_ptr().write(2);
62862306a36Sopenharmony_ci    ///     values[2].as_mut_ptr().write(3);
62962306a36Sopenharmony_ci    ///
63062306a36Sopenharmony_ci    ///     values.assume_init()
63162306a36Sopenharmony_ci    /// };
63262306a36Sopenharmony_ci    ///
63362306a36Sopenharmony_ci    /// assert_eq!(*values, [1, 2, 3])
63462306a36Sopenharmony_ci    /// ```
63562306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
63662306a36Sopenharmony_ci    #[unstable(feature = "new_uninit", issue = "63291")]
63762306a36Sopenharmony_ci    #[must_use]
63862306a36Sopenharmony_ci    pub fn new_uninit_slice(len: usize) -> Box<[mem::MaybeUninit<T>]> {
63962306a36Sopenharmony_ci        unsafe { RawVec::with_capacity(len).into_box(len) }
64062306a36Sopenharmony_ci    }
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci    /// Constructs a new boxed slice with uninitialized contents, with the memory
64362306a36Sopenharmony_ci    /// being filled with `0` bytes.
64462306a36Sopenharmony_ci    ///
64562306a36Sopenharmony_ci    /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
64662306a36Sopenharmony_ci    /// of this method.
64762306a36Sopenharmony_ci    ///
64862306a36Sopenharmony_ci    /// # Examples
64962306a36Sopenharmony_ci    ///
65062306a36Sopenharmony_ci    /// ```
65162306a36Sopenharmony_ci    /// #![feature(new_uninit)]
65262306a36Sopenharmony_ci    ///
65362306a36Sopenharmony_ci    /// let values = Box::<[u32]>::new_zeroed_slice(3);
65462306a36Sopenharmony_ci    /// let values = unsafe { values.assume_init() };
65562306a36Sopenharmony_ci    ///
65662306a36Sopenharmony_ci    /// assert_eq!(*values, [0, 0, 0])
65762306a36Sopenharmony_ci    /// ```
65862306a36Sopenharmony_ci    ///
65962306a36Sopenharmony_ci    /// [zeroed]: mem::MaybeUninit::zeroed
66062306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
66162306a36Sopenharmony_ci    #[unstable(feature = "new_uninit", issue = "63291")]
66262306a36Sopenharmony_ci    #[must_use]
66362306a36Sopenharmony_ci    pub fn new_zeroed_slice(len: usize) -> Box<[mem::MaybeUninit<T>]> {
66462306a36Sopenharmony_ci        unsafe { RawVec::with_capacity_zeroed(len).into_box(len) }
66562306a36Sopenharmony_ci    }
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci    /// Constructs a new boxed slice with uninitialized contents. Returns an error if
66862306a36Sopenharmony_ci    /// the allocation fails
66962306a36Sopenharmony_ci    ///
67062306a36Sopenharmony_ci    /// # Examples
67162306a36Sopenharmony_ci    ///
67262306a36Sopenharmony_ci    /// ```
67362306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
67462306a36Sopenharmony_ci    ///
67562306a36Sopenharmony_ci    /// let mut values = Box::<[u32]>::try_new_uninit_slice(3)?;
67662306a36Sopenharmony_ci    /// let values = unsafe {
67762306a36Sopenharmony_ci    ///     // Deferred initialization:
67862306a36Sopenharmony_ci    ///     values[0].as_mut_ptr().write(1);
67962306a36Sopenharmony_ci    ///     values[1].as_mut_ptr().write(2);
68062306a36Sopenharmony_ci    ///     values[2].as_mut_ptr().write(3);
68162306a36Sopenharmony_ci    ///     values.assume_init()
68262306a36Sopenharmony_ci    /// };
68362306a36Sopenharmony_ci    ///
68462306a36Sopenharmony_ci    /// assert_eq!(*values, [1, 2, 3]);
68562306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
68662306a36Sopenharmony_ci    /// ```
68762306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
68862306a36Sopenharmony_ci    #[inline]
68962306a36Sopenharmony_ci    pub fn try_new_uninit_slice(len: usize) -> Result<Box<[mem::MaybeUninit<T>]>, AllocError> {
69062306a36Sopenharmony_ci        let ptr = if T::IS_ZST || len == 0 {
69162306a36Sopenharmony_ci            NonNull::dangling()
69262306a36Sopenharmony_ci        } else {
69362306a36Sopenharmony_ci            let layout = match Layout::array::<mem::MaybeUninit<T>>(len) {
69462306a36Sopenharmony_ci                Ok(l) => l,
69562306a36Sopenharmony_ci                Err(_) => return Err(AllocError),
69662306a36Sopenharmony_ci            };
69762306a36Sopenharmony_ci            Global.allocate(layout)?.cast()
69862306a36Sopenharmony_ci        };
69962306a36Sopenharmony_ci        unsafe { Ok(RawVec::from_raw_parts_in(ptr.as_ptr(), len, Global).into_box(len)) }
70062306a36Sopenharmony_ci    }
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci    /// Constructs a new boxed slice with uninitialized contents, with the memory
70362306a36Sopenharmony_ci    /// being filled with `0` bytes. Returns an error if the allocation fails
70462306a36Sopenharmony_ci    ///
70562306a36Sopenharmony_ci    /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
70662306a36Sopenharmony_ci    /// of this method.
70762306a36Sopenharmony_ci    ///
70862306a36Sopenharmony_ci    /// # Examples
70962306a36Sopenharmony_ci    ///
71062306a36Sopenharmony_ci    /// ```
71162306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
71262306a36Sopenharmony_ci    ///
71362306a36Sopenharmony_ci    /// let values = Box::<[u32]>::try_new_zeroed_slice(3)?;
71462306a36Sopenharmony_ci    /// let values = unsafe { values.assume_init() };
71562306a36Sopenharmony_ci    ///
71662306a36Sopenharmony_ci    /// assert_eq!(*values, [0, 0, 0]);
71762306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
71862306a36Sopenharmony_ci    /// ```
71962306a36Sopenharmony_ci    ///
72062306a36Sopenharmony_ci    /// [zeroed]: mem::MaybeUninit::zeroed
72162306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
72262306a36Sopenharmony_ci    #[inline]
72362306a36Sopenharmony_ci    pub fn try_new_zeroed_slice(len: usize) -> Result<Box<[mem::MaybeUninit<T>]>, AllocError> {
72462306a36Sopenharmony_ci        let ptr = if T::IS_ZST || len == 0 {
72562306a36Sopenharmony_ci            NonNull::dangling()
72662306a36Sopenharmony_ci        } else {
72762306a36Sopenharmony_ci            let layout = match Layout::array::<mem::MaybeUninit<T>>(len) {
72862306a36Sopenharmony_ci                Ok(l) => l,
72962306a36Sopenharmony_ci                Err(_) => return Err(AllocError),
73062306a36Sopenharmony_ci            };
73162306a36Sopenharmony_ci            Global.allocate_zeroed(layout)?.cast()
73262306a36Sopenharmony_ci        };
73362306a36Sopenharmony_ci        unsafe { Ok(RawVec::from_raw_parts_in(ptr.as_ptr(), len, Global).into_box(len)) }
73462306a36Sopenharmony_ci    }
73562306a36Sopenharmony_ci}
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ciimpl<T, A: Allocator> Box<[T], A> {
73862306a36Sopenharmony_ci    /// Constructs a new boxed slice with uninitialized contents in the provided allocator.
73962306a36Sopenharmony_ci    ///
74062306a36Sopenharmony_ci    /// # Examples
74162306a36Sopenharmony_ci    ///
74262306a36Sopenharmony_ci    /// ```
74362306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
74462306a36Sopenharmony_ci    ///
74562306a36Sopenharmony_ci    /// use std::alloc::System;
74662306a36Sopenharmony_ci    ///
74762306a36Sopenharmony_ci    /// let mut values = Box::<[u32], _>::new_uninit_slice_in(3, System);
74862306a36Sopenharmony_ci    ///
74962306a36Sopenharmony_ci    /// let values = unsafe {
75062306a36Sopenharmony_ci    ///     // Deferred initialization:
75162306a36Sopenharmony_ci    ///     values[0].as_mut_ptr().write(1);
75262306a36Sopenharmony_ci    ///     values[1].as_mut_ptr().write(2);
75362306a36Sopenharmony_ci    ///     values[2].as_mut_ptr().write(3);
75462306a36Sopenharmony_ci    ///
75562306a36Sopenharmony_ci    ///     values.assume_init()
75662306a36Sopenharmony_ci    /// };
75762306a36Sopenharmony_ci    ///
75862306a36Sopenharmony_ci    /// assert_eq!(*values, [1, 2, 3])
75962306a36Sopenharmony_ci    /// ```
76062306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
76162306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
76262306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
76362306a36Sopenharmony_ci    #[must_use]
76462306a36Sopenharmony_ci    pub fn new_uninit_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit<T>], A> {
76562306a36Sopenharmony_ci        unsafe { RawVec::with_capacity_in(len, alloc).into_box(len) }
76662306a36Sopenharmony_ci    }
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci    /// Constructs a new boxed slice with uninitialized contents in the provided allocator,
76962306a36Sopenharmony_ci    /// with the memory being filled with `0` bytes.
77062306a36Sopenharmony_ci    ///
77162306a36Sopenharmony_ci    /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
77262306a36Sopenharmony_ci    /// of this method.
77362306a36Sopenharmony_ci    ///
77462306a36Sopenharmony_ci    /// # Examples
77562306a36Sopenharmony_ci    ///
77662306a36Sopenharmony_ci    /// ```
77762306a36Sopenharmony_ci    /// #![feature(allocator_api, new_uninit)]
77862306a36Sopenharmony_ci    ///
77962306a36Sopenharmony_ci    /// use std::alloc::System;
78062306a36Sopenharmony_ci    ///
78162306a36Sopenharmony_ci    /// let values = Box::<[u32], _>::new_zeroed_slice_in(3, System);
78262306a36Sopenharmony_ci    /// let values = unsafe { values.assume_init() };
78362306a36Sopenharmony_ci    ///
78462306a36Sopenharmony_ci    /// assert_eq!(*values, [0, 0, 0])
78562306a36Sopenharmony_ci    /// ```
78662306a36Sopenharmony_ci    ///
78762306a36Sopenharmony_ci    /// [zeroed]: mem::MaybeUninit::zeroed
78862306a36Sopenharmony_ci    #[cfg(not(no_global_oom_handling))]
78962306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
79062306a36Sopenharmony_ci    // #[unstable(feature = "new_uninit", issue = "63291")]
79162306a36Sopenharmony_ci    #[must_use]
79262306a36Sopenharmony_ci    pub fn new_zeroed_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit<T>], A> {
79362306a36Sopenharmony_ci        unsafe { RawVec::with_capacity_zeroed_in(len, alloc).into_box(len) }
79462306a36Sopenharmony_ci    }
79562306a36Sopenharmony_ci}
79662306a36Sopenharmony_ci
79762306a36Sopenharmony_ciimpl<T, A: Allocator> Box<mem::MaybeUninit<T>, A> {
79862306a36Sopenharmony_ci    /// Converts to `Box<T, A>`.
79962306a36Sopenharmony_ci    ///
80062306a36Sopenharmony_ci    /// # Safety
80162306a36Sopenharmony_ci    ///
80262306a36Sopenharmony_ci    /// As with [`MaybeUninit::assume_init`],
80362306a36Sopenharmony_ci    /// it is up to the caller to guarantee that the value
80462306a36Sopenharmony_ci    /// really is in an initialized state.
80562306a36Sopenharmony_ci    /// Calling this when the content is not yet fully initialized
80662306a36Sopenharmony_ci    /// causes immediate undefined behavior.
80762306a36Sopenharmony_ci    ///
80862306a36Sopenharmony_ci    /// [`MaybeUninit::assume_init`]: mem::MaybeUninit::assume_init
80962306a36Sopenharmony_ci    ///
81062306a36Sopenharmony_ci    /// # Examples
81162306a36Sopenharmony_ci    ///
81262306a36Sopenharmony_ci    /// ```
81362306a36Sopenharmony_ci    /// #![feature(new_uninit)]
81462306a36Sopenharmony_ci    ///
81562306a36Sopenharmony_ci    /// let mut five = Box::<u32>::new_uninit();
81662306a36Sopenharmony_ci    ///
81762306a36Sopenharmony_ci    /// let five: Box<u32> = unsafe {
81862306a36Sopenharmony_ci    ///     // Deferred initialization:
81962306a36Sopenharmony_ci    ///     five.as_mut_ptr().write(5);
82062306a36Sopenharmony_ci    ///
82162306a36Sopenharmony_ci    ///     five.assume_init()
82262306a36Sopenharmony_ci    /// };
82362306a36Sopenharmony_ci    ///
82462306a36Sopenharmony_ci    /// assert_eq!(*five, 5)
82562306a36Sopenharmony_ci    /// ```
82662306a36Sopenharmony_ci    #[unstable(feature = "new_uninit", issue = "63291")]
82762306a36Sopenharmony_ci    #[inline]
82862306a36Sopenharmony_ci    pub unsafe fn assume_init(self) -> Box<T, A> {
82962306a36Sopenharmony_ci        let (raw, alloc) = Box::into_raw_with_allocator(self);
83062306a36Sopenharmony_ci        unsafe { Box::from_raw_in(raw as *mut T, alloc) }
83162306a36Sopenharmony_ci    }
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci    /// Writes the value and converts to `Box<T, A>`.
83462306a36Sopenharmony_ci    ///
83562306a36Sopenharmony_ci    /// This method converts the box similarly to [`Box::assume_init`] but
83662306a36Sopenharmony_ci    /// writes `value` into it before conversion thus guaranteeing safety.
83762306a36Sopenharmony_ci    /// In some scenarios use of this method may improve performance because
83862306a36Sopenharmony_ci    /// the compiler may be able to optimize copying from stack.
83962306a36Sopenharmony_ci    ///
84062306a36Sopenharmony_ci    /// # Examples
84162306a36Sopenharmony_ci    ///
84262306a36Sopenharmony_ci    /// ```
84362306a36Sopenharmony_ci    /// #![feature(new_uninit)]
84462306a36Sopenharmony_ci    ///
84562306a36Sopenharmony_ci    /// let big_box = Box::<[usize; 1024]>::new_uninit();
84662306a36Sopenharmony_ci    ///
84762306a36Sopenharmony_ci    /// let mut array = [0; 1024];
84862306a36Sopenharmony_ci    /// for (i, place) in array.iter_mut().enumerate() {
84962306a36Sopenharmony_ci    ///     *place = i;
85062306a36Sopenharmony_ci    /// }
85162306a36Sopenharmony_ci    ///
85262306a36Sopenharmony_ci    /// // The optimizer may be able to elide this copy, so previous code writes
85362306a36Sopenharmony_ci    /// // to heap directly.
85462306a36Sopenharmony_ci    /// let big_box = Box::write(big_box, array);
85562306a36Sopenharmony_ci    ///
85662306a36Sopenharmony_ci    /// for (i, x) in big_box.iter().enumerate() {
85762306a36Sopenharmony_ci    ///     assert_eq!(*x, i);
85862306a36Sopenharmony_ci    /// }
85962306a36Sopenharmony_ci    /// ```
86062306a36Sopenharmony_ci    #[unstable(feature = "new_uninit", issue = "63291")]
86162306a36Sopenharmony_ci    #[inline]
86262306a36Sopenharmony_ci    pub fn write(mut boxed: Self, value: T) -> Box<T, A> {
86362306a36Sopenharmony_ci        unsafe {
86462306a36Sopenharmony_ci            (*boxed).write(value);
86562306a36Sopenharmony_ci            boxed.assume_init()
86662306a36Sopenharmony_ci        }
86762306a36Sopenharmony_ci    }
86862306a36Sopenharmony_ci}
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_ciimpl<T, A: Allocator> Box<[mem::MaybeUninit<T>], A> {
87162306a36Sopenharmony_ci    /// Converts to `Box<[T], A>`.
87262306a36Sopenharmony_ci    ///
87362306a36Sopenharmony_ci    /// # Safety
87462306a36Sopenharmony_ci    ///
87562306a36Sopenharmony_ci    /// As with [`MaybeUninit::assume_init`],
87662306a36Sopenharmony_ci    /// it is up to the caller to guarantee that the values
87762306a36Sopenharmony_ci    /// really are in an initialized state.
87862306a36Sopenharmony_ci    /// Calling this when the content is not yet fully initialized
87962306a36Sopenharmony_ci    /// causes immediate undefined behavior.
88062306a36Sopenharmony_ci    ///
88162306a36Sopenharmony_ci    /// [`MaybeUninit::assume_init`]: mem::MaybeUninit::assume_init
88262306a36Sopenharmony_ci    ///
88362306a36Sopenharmony_ci    /// # Examples
88462306a36Sopenharmony_ci    ///
88562306a36Sopenharmony_ci    /// ```
88662306a36Sopenharmony_ci    /// #![feature(new_uninit)]
88762306a36Sopenharmony_ci    ///
88862306a36Sopenharmony_ci    /// let mut values = Box::<[u32]>::new_uninit_slice(3);
88962306a36Sopenharmony_ci    ///
89062306a36Sopenharmony_ci    /// let values = unsafe {
89162306a36Sopenharmony_ci    ///     // Deferred initialization:
89262306a36Sopenharmony_ci    ///     values[0].as_mut_ptr().write(1);
89362306a36Sopenharmony_ci    ///     values[1].as_mut_ptr().write(2);
89462306a36Sopenharmony_ci    ///     values[2].as_mut_ptr().write(3);
89562306a36Sopenharmony_ci    ///
89662306a36Sopenharmony_ci    ///     values.assume_init()
89762306a36Sopenharmony_ci    /// };
89862306a36Sopenharmony_ci    ///
89962306a36Sopenharmony_ci    /// assert_eq!(*values, [1, 2, 3])
90062306a36Sopenharmony_ci    /// ```
90162306a36Sopenharmony_ci    #[unstable(feature = "new_uninit", issue = "63291")]
90262306a36Sopenharmony_ci    #[inline]
90362306a36Sopenharmony_ci    pub unsafe fn assume_init(self) -> Box<[T], A> {
90462306a36Sopenharmony_ci        let (raw, alloc) = Box::into_raw_with_allocator(self);
90562306a36Sopenharmony_ci        unsafe { Box::from_raw_in(raw as *mut [T], alloc) }
90662306a36Sopenharmony_ci    }
90762306a36Sopenharmony_ci}
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ciimpl<T: ?Sized> Box<T> {
91062306a36Sopenharmony_ci    /// Constructs a box from a raw pointer.
91162306a36Sopenharmony_ci    ///
91262306a36Sopenharmony_ci    /// After calling this function, the raw pointer is owned by the
91362306a36Sopenharmony_ci    /// resulting `Box`. Specifically, the `Box` destructor will call
91462306a36Sopenharmony_ci    /// the destructor of `T` and free the allocated memory. For this
91562306a36Sopenharmony_ci    /// to be safe, the memory must have been allocated in accordance
91662306a36Sopenharmony_ci    /// with the [memory layout] used by `Box` .
91762306a36Sopenharmony_ci    ///
91862306a36Sopenharmony_ci    /// # Safety
91962306a36Sopenharmony_ci    ///
92062306a36Sopenharmony_ci    /// This function is unsafe because improper use may lead to
92162306a36Sopenharmony_ci    /// memory problems. For example, a double-free may occur if the
92262306a36Sopenharmony_ci    /// function is called twice on the same raw pointer.
92362306a36Sopenharmony_ci    ///
92462306a36Sopenharmony_ci    /// The safety conditions are described in the [memory layout] section.
92562306a36Sopenharmony_ci    ///
92662306a36Sopenharmony_ci    /// # Examples
92762306a36Sopenharmony_ci    ///
92862306a36Sopenharmony_ci    /// Recreate a `Box` which was previously converted to a raw pointer
92962306a36Sopenharmony_ci    /// using [`Box::into_raw`]:
93062306a36Sopenharmony_ci    /// ```
93162306a36Sopenharmony_ci    /// let x = Box::new(5);
93262306a36Sopenharmony_ci    /// let ptr = Box::into_raw(x);
93362306a36Sopenharmony_ci    /// let x = unsafe { Box::from_raw(ptr) };
93462306a36Sopenharmony_ci    /// ```
93562306a36Sopenharmony_ci    /// Manually create a `Box` from scratch by using the global allocator:
93662306a36Sopenharmony_ci    /// ```
93762306a36Sopenharmony_ci    /// use std::alloc::{alloc, Layout};
93862306a36Sopenharmony_ci    ///
93962306a36Sopenharmony_ci    /// unsafe {
94062306a36Sopenharmony_ci    ///     let ptr = alloc(Layout::new::<i32>()) as *mut i32;
94162306a36Sopenharmony_ci    ///     // In general .write is required to avoid attempting to destruct
94262306a36Sopenharmony_ci    ///     // the (uninitialized) previous contents of `ptr`, though for this
94362306a36Sopenharmony_ci    ///     // simple example `*ptr = 5` would have worked as well.
94462306a36Sopenharmony_ci    ///     ptr.write(5);
94562306a36Sopenharmony_ci    ///     let x = Box::from_raw(ptr);
94662306a36Sopenharmony_ci    /// }
94762306a36Sopenharmony_ci    /// ```
94862306a36Sopenharmony_ci    ///
94962306a36Sopenharmony_ci    /// [memory layout]: self#memory-layout
95062306a36Sopenharmony_ci    /// [`Layout`]: crate::Layout
95162306a36Sopenharmony_ci    #[stable(feature = "box_raw", since = "1.4.0")]
95262306a36Sopenharmony_ci    #[inline]
95362306a36Sopenharmony_ci    #[must_use = "call `drop(Box::from_raw(ptr))` if you intend to drop the `Box`"]
95462306a36Sopenharmony_ci    pub unsafe fn from_raw(raw: *mut T) -> Self {
95562306a36Sopenharmony_ci        unsafe { Self::from_raw_in(raw, Global) }
95662306a36Sopenharmony_ci    }
95762306a36Sopenharmony_ci}
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> Box<T, A> {
96062306a36Sopenharmony_ci    /// Constructs a box from a raw pointer in the given allocator.
96162306a36Sopenharmony_ci    ///
96262306a36Sopenharmony_ci    /// After calling this function, the raw pointer is owned by the
96362306a36Sopenharmony_ci    /// resulting `Box`. Specifically, the `Box` destructor will call
96462306a36Sopenharmony_ci    /// the destructor of `T` and free the allocated memory. For this
96562306a36Sopenharmony_ci    /// to be safe, the memory must have been allocated in accordance
96662306a36Sopenharmony_ci    /// with the [memory layout] used by `Box` .
96762306a36Sopenharmony_ci    ///
96862306a36Sopenharmony_ci    /// # Safety
96962306a36Sopenharmony_ci    ///
97062306a36Sopenharmony_ci    /// This function is unsafe because improper use may lead to
97162306a36Sopenharmony_ci    /// memory problems. For example, a double-free may occur if the
97262306a36Sopenharmony_ci    /// function is called twice on the same raw pointer.
97362306a36Sopenharmony_ci    ///
97462306a36Sopenharmony_ci    ///
97562306a36Sopenharmony_ci    /// # Examples
97662306a36Sopenharmony_ci    ///
97762306a36Sopenharmony_ci    /// Recreate a `Box` which was previously converted to a raw pointer
97862306a36Sopenharmony_ci    /// using [`Box::into_raw_with_allocator`]:
97962306a36Sopenharmony_ci    /// ```
98062306a36Sopenharmony_ci    /// #![feature(allocator_api)]
98162306a36Sopenharmony_ci    ///
98262306a36Sopenharmony_ci    /// use std::alloc::System;
98362306a36Sopenharmony_ci    ///
98462306a36Sopenharmony_ci    /// let x = Box::new_in(5, System);
98562306a36Sopenharmony_ci    /// let (ptr, alloc) = Box::into_raw_with_allocator(x);
98662306a36Sopenharmony_ci    /// let x = unsafe { Box::from_raw_in(ptr, alloc) };
98762306a36Sopenharmony_ci    /// ```
98862306a36Sopenharmony_ci    /// Manually create a `Box` from scratch by using the system allocator:
98962306a36Sopenharmony_ci    /// ```
99062306a36Sopenharmony_ci    /// #![feature(allocator_api, slice_ptr_get)]
99162306a36Sopenharmony_ci    ///
99262306a36Sopenharmony_ci    /// use std::alloc::{Allocator, Layout, System};
99362306a36Sopenharmony_ci    ///
99462306a36Sopenharmony_ci    /// unsafe {
99562306a36Sopenharmony_ci    ///     let ptr = System.allocate(Layout::new::<i32>())?.as_mut_ptr() as *mut i32;
99662306a36Sopenharmony_ci    ///     // In general .write is required to avoid attempting to destruct
99762306a36Sopenharmony_ci    ///     // the (uninitialized) previous contents of `ptr`, though for this
99862306a36Sopenharmony_ci    ///     // simple example `*ptr = 5` would have worked as well.
99962306a36Sopenharmony_ci    ///     ptr.write(5);
100062306a36Sopenharmony_ci    ///     let x = Box::from_raw_in(ptr, System);
100162306a36Sopenharmony_ci    /// }
100262306a36Sopenharmony_ci    /// # Ok::<(), std::alloc::AllocError>(())
100362306a36Sopenharmony_ci    /// ```
100462306a36Sopenharmony_ci    ///
100562306a36Sopenharmony_ci    /// [memory layout]: self#memory-layout
100662306a36Sopenharmony_ci    /// [`Layout`]: crate::Layout
100762306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
100862306a36Sopenharmony_ci    #[rustc_const_unstable(feature = "const_box", issue = "92521")]
100962306a36Sopenharmony_ci    #[inline]
101062306a36Sopenharmony_ci    pub const unsafe fn from_raw_in(raw: *mut T, alloc: A) -> Self {
101162306a36Sopenharmony_ci        Box(unsafe { Unique::new_unchecked(raw) }, alloc)
101262306a36Sopenharmony_ci    }
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_ci    /// Consumes the `Box`, returning a wrapped raw pointer.
101562306a36Sopenharmony_ci    ///
101662306a36Sopenharmony_ci    /// The pointer will be properly aligned and non-null.
101762306a36Sopenharmony_ci    ///
101862306a36Sopenharmony_ci    /// After calling this function, the caller is responsible for the
101962306a36Sopenharmony_ci    /// memory previously managed by the `Box`. In particular, the
102062306a36Sopenharmony_ci    /// caller should properly destroy `T` and release the memory, taking
102162306a36Sopenharmony_ci    /// into account the [memory layout] used by `Box`. The easiest way to
102262306a36Sopenharmony_ci    /// do this is to convert the raw pointer back into a `Box` with the
102362306a36Sopenharmony_ci    /// [`Box::from_raw`] function, allowing the `Box` destructor to perform
102462306a36Sopenharmony_ci    /// the cleanup.
102562306a36Sopenharmony_ci    ///
102662306a36Sopenharmony_ci    /// Note: this is an associated function, which means that you have
102762306a36Sopenharmony_ci    /// to call it as `Box::into_raw(b)` instead of `b.into_raw()`. This
102862306a36Sopenharmony_ci    /// is so that there is no conflict with a method on the inner type.
102962306a36Sopenharmony_ci    ///
103062306a36Sopenharmony_ci    /// # Examples
103162306a36Sopenharmony_ci    /// Converting the raw pointer back into a `Box` with [`Box::from_raw`]
103262306a36Sopenharmony_ci    /// for automatic cleanup:
103362306a36Sopenharmony_ci    /// ```
103462306a36Sopenharmony_ci    /// let x = Box::new(String::from("Hello"));
103562306a36Sopenharmony_ci    /// let ptr = Box::into_raw(x);
103662306a36Sopenharmony_ci    /// let x = unsafe { Box::from_raw(ptr) };
103762306a36Sopenharmony_ci    /// ```
103862306a36Sopenharmony_ci    /// Manual cleanup by explicitly running the destructor and deallocating
103962306a36Sopenharmony_ci    /// the memory:
104062306a36Sopenharmony_ci    /// ```
104162306a36Sopenharmony_ci    /// use std::alloc::{dealloc, Layout};
104262306a36Sopenharmony_ci    /// use std::ptr;
104362306a36Sopenharmony_ci    ///
104462306a36Sopenharmony_ci    /// let x = Box::new(String::from("Hello"));
104562306a36Sopenharmony_ci    /// let p = Box::into_raw(x);
104662306a36Sopenharmony_ci    /// unsafe {
104762306a36Sopenharmony_ci    ///     ptr::drop_in_place(p);
104862306a36Sopenharmony_ci    ///     dealloc(p as *mut u8, Layout::new::<String>());
104962306a36Sopenharmony_ci    /// }
105062306a36Sopenharmony_ci    /// ```
105162306a36Sopenharmony_ci    ///
105262306a36Sopenharmony_ci    /// [memory layout]: self#memory-layout
105362306a36Sopenharmony_ci    #[stable(feature = "box_raw", since = "1.4.0")]
105462306a36Sopenharmony_ci    #[inline]
105562306a36Sopenharmony_ci    pub fn into_raw(b: Self) -> *mut T {
105662306a36Sopenharmony_ci        Self::into_raw_with_allocator(b).0
105762306a36Sopenharmony_ci    }
105862306a36Sopenharmony_ci
105962306a36Sopenharmony_ci    /// Consumes the `Box`, returning a wrapped raw pointer and the allocator.
106062306a36Sopenharmony_ci    ///
106162306a36Sopenharmony_ci    /// The pointer will be properly aligned and non-null.
106262306a36Sopenharmony_ci    ///
106362306a36Sopenharmony_ci    /// After calling this function, the caller is responsible for the
106462306a36Sopenharmony_ci    /// memory previously managed by the `Box`. In particular, the
106562306a36Sopenharmony_ci    /// caller should properly destroy `T` and release the memory, taking
106662306a36Sopenharmony_ci    /// into account the [memory layout] used by `Box`. The easiest way to
106762306a36Sopenharmony_ci    /// do this is to convert the raw pointer back into a `Box` with the
106862306a36Sopenharmony_ci    /// [`Box::from_raw_in`] function, allowing the `Box` destructor to perform
106962306a36Sopenharmony_ci    /// the cleanup.
107062306a36Sopenharmony_ci    ///
107162306a36Sopenharmony_ci    /// Note: this is an associated function, which means that you have
107262306a36Sopenharmony_ci    /// to call it as `Box::into_raw_with_allocator(b)` instead of `b.into_raw_with_allocator()`. This
107362306a36Sopenharmony_ci    /// is so that there is no conflict with a method on the inner type.
107462306a36Sopenharmony_ci    ///
107562306a36Sopenharmony_ci    /// # Examples
107662306a36Sopenharmony_ci    /// Converting the raw pointer back into a `Box` with [`Box::from_raw_in`]
107762306a36Sopenharmony_ci    /// for automatic cleanup:
107862306a36Sopenharmony_ci    /// ```
107962306a36Sopenharmony_ci    /// #![feature(allocator_api)]
108062306a36Sopenharmony_ci    ///
108162306a36Sopenharmony_ci    /// use std::alloc::System;
108262306a36Sopenharmony_ci    ///
108362306a36Sopenharmony_ci    /// let x = Box::new_in(String::from("Hello"), System);
108462306a36Sopenharmony_ci    /// let (ptr, alloc) = Box::into_raw_with_allocator(x);
108562306a36Sopenharmony_ci    /// let x = unsafe { Box::from_raw_in(ptr, alloc) };
108662306a36Sopenharmony_ci    /// ```
108762306a36Sopenharmony_ci    /// Manual cleanup by explicitly running the destructor and deallocating
108862306a36Sopenharmony_ci    /// the memory:
108962306a36Sopenharmony_ci    /// ```
109062306a36Sopenharmony_ci    /// #![feature(allocator_api)]
109162306a36Sopenharmony_ci    ///
109262306a36Sopenharmony_ci    /// use std::alloc::{Allocator, Layout, System};
109362306a36Sopenharmony_ci    /// use std::ptr::{self, NonNull};
109462306a36Sopenharmony_ci    ///
109562306a36Sopenharmony_ci    /// let x = Box::new_in(String::from("Hello"), System);
109662306a36Sopenharmony_ci    /// let (ptr, alloc) = Box::into_raw_with_allocator(x);
109762306a36Sopenharmony_ci    /// unsafe {
109862306a36Sopenharmony_ci    ///     ptr::drop_in_place(ptr);
109962306a36Sopenharmony_ci    ///     let non_null = NonNull::new_unchecked(ptr);
110062306a36Sopenharmony_ci    ///     alloc.deallocate(non_null.cast(), Layout::new::<String>());
110162306a36Sopenharmony_ci    /// }
110262306a36Sopenharmony_ci    /// ```
110362306a36Sopenharmony_ci    ///
110462306a36Sopenharmony_ci    /// [memory layout]: self#memory-layout
110562306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
110662306a36Sopenharmony_ci    #[inline]
110762306a36Sopenharmony_ci    pub fn into_raw_with_allocator(b: Self) -> (*mut T, A) {
110862306a36Sopenharmony_ci        let (leaked, alloc) = Box::into_unique(b);
110962306a36Sopenharmony_ci        (leaked.as_ptr(), alloc)
111062306a36Sopenharmony_ci    }
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_ci    #[unstable(
111362306a36Sopenharmony_ci        feature = "ptr_internals",
111462306a36Sopenharmony_ci        issue = "none",
111562306a36Sopenharmony_ci        reason = "use `Box::leak(b).into()` or `Unique::from(Box::leak(b))` instead"
111662306a36Sopenharmony_ci    )]
111762306a36Sopenharmony_ci    #[inline]
111862306a36Sopenharmony_ci    #[doc(hidden)]
111962306a36Sopenharmony_ci    pub fn into_unique(b: Self) -> (Unique<T>, A) {
112062306a36Sopenharmony_ci        // Box is recognized as a "unique pointer" by Stacked Borrows, but internally it is a
112162306a36Sopenharmony_ci        // raw pointer for the type system. Turning it directly into a raw pointer would not be
112262306a36Sopenharmony_ci        // recognized as "releasing" the unique pointer to permit aliased raw accesses,
112362306a36Sopenharmony_ci        // so all raw pointer methods have to go through `Box::leak`. Turning *that* to a raw pointer
112462306a36Sopenharmony_ci        // behaves correctly.
112562306a36Sopenharmony_ci        let alloc = unsafe { ptr::read(&b.1) };
112662306a36Sopenharmony_ci        (Unique::from(Box::leak(b)), alloc)
112762306a36Sopenharmony_ci    }
112862306a36Sopenharmony_ci
112962306a36Sopenharmony_ci    /// Returns a reference to the underlying allocator.
113062306a36Sopenharmony_ci    ///
113162306a36Sopenharmony_ci    /// Note: this is an associated function, which means that you have
113262306a36Sopenharmony_ci    /// to call it as `Box::allocator(&b)` instead of `b.allocator()`. This
113362306a36Sopenharmony_ci    /// is so that there is no conflict with a method on the inner type.
113462306a36Sopenharmony_ci    #[unstable(feature = "allocator_api", issue = "32838")]
113562306a36Sopenharmony_ci    #[rustc_const_unstable(feature = "const_box", issue = "92521")]
113662306a36Sopenharmony_ci    #[inline]
113762306a36Sopenharmony_ci    pub const fn allocator(b: &Self) -> &A {
113862306a36Sopenharmony_ci        &b.1
113962306a36Sopenharmony_ci    }
114062306a36Sopenharmony_ci
114162306a36Sopenharmony_ci    /// Consumes and leaks the `Box`, returning a mutable reference,
114262306a36Sopenharmony_ci    /// `&'a mut T`. Note that the type `T` must outlive the chosen lifetime
114362306a36Sopenharmony_ci    /// `'a`. If the type has only static references, or none at all, then this
114462306a36Sopenharmony_ci    /// may be chosen to be `'static`.
114562306a36Sopenharmony_ci    ///
114662306a36Sopenharmony_ci    /// This function is mainly useful for data that lives for the remainder of
114762306a36Sopenharmony_ci    /// the program's life. Dropping the returned reference will cause a memory
114862306a36Sopenharmony_ci    /// leak. If this is not acceptable, the reference should first be wrapped
114962306a36Sopenharmony_ci    /// with the [`Box::from_raw`] function producing a `Box`. This `Box` can
115062306a36Sopenharmony_ci    /// then be dropped which will properly destroy `T` and release the
115162306a36Sopenharmony_ci    /// allocated memory.
115262306a36Sopenharmony_ci    ///
115362306a36Sopenharmony_ci    /// Note: this is an associated function, which means that you have
115462306a36Sopenharmony_ci    /// to call it as `Box::leak(b)` instead of `b.leak()`. This
115562306a36Sopenharmony_ci    /// is so that there is no conflict with a method on the inner type.
115662306a36Sopenharmony_ci    ///
115762306a36Sopenharmony_ci    /// # Examples
115862306a36Sopenharmony_ci    ///
115962306a36Sopenharmony_ci    /// Simple usage:
116062306a36Sopenharmony_ci    ///
116162306a36Sopenharmony_ci    /// ```
116262306a36Sopenharmony_ci    /// let x = Box::new(41);
116362306a36Sopenharmony_ci    /// let static_ref: &'static mut usize = Box::leak(x);
116462306a36Sopenharmony_ci    /// *static_ref += 1;
116562306a36Sopenharmony_ci    /// assert_eq!(*static_ref, 42);
116662306a36Sopenharmony_ci    /// ```
116762306a36Sopenharmony_ci    ///
116862306a36Sopenharmony_ci    /// Unsized data:
116962306a36Sopenharmony_ci    ///
117062306a36Sopenharmony_ci    /// ```
117162306a36Sopenharmony_ci    /// let x = vec![1, 2, 3].into_boxed_slice();
117262306a36Sopenharmony_ci    /// let static_ref = Box::leak(x);
117362306a36Sopenharmony_ci    /// static_ref[0] = 4;
117462306a36Sopenharmony_ci    /// assert_eq!(*static_ref, [4, 2, 3]);
117562306a36Sopenharmony_ci    /// ```
117662306a36Sopenharmony_ci    #[stable(feature = "box_leak", since = "1.26.0")]
117762306a36Sopenharmony_ci    #[inline]
117862306a36Sopenharmony_ci    pub fn leak<'a>(b: Self) -> &'a mut T
117962306a36Sopenharmony_ci    where
118062306a36Sopenharmony_ci        A: 'a,
118162306a36Sopenharmony_ci    {
118262306a36Sopenharmony_ci        unsafe { &mut *mem::ManuallyDrop::new(b).0.as_ptr() }
118362306a36Sopenharmony_ci    }
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_ci    /// Converts a `Box<T>` into a `Pin<Box<T>>`. If `T` does not implement [`Unpin`], then
118662306a36Sopenharmony_ci    /// `*boxed` will be pinned in memory and unable to be moved.
118762306a36Sopenharmony_ci    ///
118862306a36Sopenharmony_ci    /// This conversion does not allocate on the heap and happens in place.
118962306a36Sopenharmony_ci    ///
119062306a36Sopenharmony_ci    /// This is also available via [`From`].
119162306a36Sopenharmony_ci    ///
119262306a36Sopenharmony_ci    /// Constructing and pinning a `Box` with <code>Box::into_pin([Box::new]\(x))</code>
119362306a36Sopenharmony_ci    /// can also be written more concisely using <code>[Box::pin]\(x)</code>.
119462306a36Sopenharmony_ci    /// This `into_pin` method is useful if you already have a `Box<T>`, or you are
119562306a36Sopenharmony_ci    /// constructing a (pinned) `Box` in a different way than with [`Box::new`].
119662306a36Sopenharmony_ci    ///
119762306a36Sopenharmony_ci    /// # Notes
119862306a36Sopenharmony_ci    ///
119962306a36Sopenharmony_ci    /// It's not recommended that crates add an impl like `From<Box<T>> for Pin<T>`,
120062306a36Sopenharmony_ci    /// as it'll introduce an ambiguity when calling `Pin::from`.
120162306a36Sopenharmony_ci    /// A demonstration of such a poor impl is shown below.
120262306a36Sopenharmony_ci    ///
120362306a36Sopenharmony_ci    /// ```compile_fail
120462306a36Sopenharmony_ci    /// # use std::pin::Pin;
120562306a36Sopenharmony_ci    /// struct Foo; // A type defined in this crate.
120662306a36Sopenharmony_ci    /// impl From<Box<()>> for Pin<Foo> {
120762306a36Sopenharmony_ci    ///     fn from(_: Box<()>) -> Pin<Foo> {
120862306a36Sopenharmony_ci    ///         Pin::new(Foo)
120962306a36Sopenharmony_ci    ///     }
121062306a36Sopenharmony_ci    /// }
121162306a36Sopenharmony_ci    ///
121262306a36Sopenharmony_ci    /// let foo = Box::new(());
121362306a36Sopenharmony_ci    /// let bar = Pin::from(foo);
121462306a36Sopenharmony_ci    /// ```
121562306a36Sopenharmony_ci    #[stable(feature = "box_into_pin", since = "1.63.0")]
121662306a36Sopenharmony_ci    #[rustc_const_unstable(feature = "const_box", issue = "92521")]
121762306a36Sopenharmony_ci    pub const fn into_pin(boxed: Self) -> Pin<Self>
121862306a36Sopenharmony_ci    where
121962306a36Sopenharmony_ci        A: 'static,
122062306a36Sopenharmony_ci    {
122162306a36Sopenharmony_ci        // It's not possible to move or replace the insides of a `Pin<Box<T>>`
122262306a36Sopenharmony_ci        // when `T: !Unpin`, so it's safe to pin it directly without any
122362306a36Sopenharmony_ci        // additional requirements.
122462306a36Sopenharmony_ci        unsafe { Pin::new_unchecked(boxed) }
122562306a36Sopenharmony_ci    }
122662306a36Sopenharmony_ci}
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
122962306a36Sopenharmony_ciunsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for Box<T, A> {
123062306a36Sopenharmony_ci    #[inline]
123162306a36Sopenharmony_ci    fn drop(&mut self) {
123262306a36Sopenharmony_ci        // the T in the Box is dropped by the compiler before the destructor is run
123362306a36Sopenharmony_ci
123462306a36Sopenharmony_ci        let ptr = self.0;
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_ci        unsafe {
123762306a36Sopenharmony_ci            let layout = Layout::for_value_raw(ptr.as_ptr());
123862306a36Sopenharmony_ci            if layout.size() != 0 {
123962306a36Sopenharmony_ci                self.1.deallocate(From::from(ptr.cast()), layout);
124062306a36Sopenharmony_ci            }
124162306a36Sopenharmony_ci        }
124262306a36Sopenharmony_ci    }
124362306a36Sopenharmony_ci}
124462306a36Sopenharmony_ci
124562306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
124662306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
124762306a36Sopenharmony_ciimpl<T: Default> Default for Box<T> {
124862306a36Sopenharmony_ci    /// Creates a `Box<T>`, with the `Default` value for T.
124962306a36Sopenharmony_ci    #[inline]
125062306a36Sopenharmony_ci    fn default() -> Self {
125162306a36Sopenharmony_ci        Box::new(T::default())
125262306a36Sopenharmony_ci    }
125362306a36Sopenharmony_ci}
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
125662306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
125762306a36Sopenharmony_ciimpl<T> Default for Box<[T]> {
125862306a36Sopenharmony_ci    #[inline]
125962306a36Sopenharmony_ci    fn default() -> Self {
126062306a36Sopenharmony_ci        let ptr: Unique<[T]> = Unique::<[T; 0]>::dangling();
126162306a36Sopenharmony_ci        Box(ptr, Global)
126262306a36Sopenharmony_ci    }
126362306a36Sopenharmony_ci}
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
126662306a36Sopenharmony_ci#[stable(feature = "default_box_extra", since = "1.17.0")]
126762306a36Sopenharmony_ciimpl Default for Box<str> {
126862306a36Sopenharmony_ci    #[inline]
126962306a36Sopenharmony_ci    fn default() -> Self {
127062306a36Sopenharmony_ci        // SAFETY: This is the same as `Unique::cast<U>` but with an unsized `U = str`.
127162306a36Sopenharmony_ci        let ptr: Unique<str> = unsafe {
127262306a36Sopenharmony_ci            let bytes: Unique<[u8]> = Unique::<[u8; 0]>::dangling();
127362306a36Sopenharmony_ci            Unique::new_unchecked(bytes.as_ptr() as *mut str)
127462306a36Sopenharmony_ci        };
127562306a36Sopenharmony_ci        Box(ptr, Global)
127662306a36Sopenharmony_ci    }
127762306a36Sopenharmony_ci}
127862306a36Sopenharmony_ci
127962306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
128062306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
128162306a36Sopenharmony_ciimpl<T: Clone, A: Allocator + Clone> Clone for Box<T, A> {
128262306a36Sopenharmony_ci    /// Returns a new box with a `clone()` of this box's contents.
128362306a36Sopenharmony_ci    ///
128462306a36Sopenharmony_ci    /// # Examples
128562306a36Sopenharmony_ci    ///
128662306a36Sopenharmony_ci    /// ```
128762306a36Sopenharmony_ci    /// let x = Box::new(5);
128862306a36Sopenharmony_ci    /// let y = x.clone();
128962306a36Sopenharmony_ci    ///
129062306a36Sopenharmony_ci    /// // The value is the same
129162306a36Sopenharmony_ci    /// assert_eq!(x, y);
129262306a36Sopenharmony_ci    ///
129362306a36Sopenharmony_ci    /// // But they are unique objects
129462306a36Sopenharmony_ci    /// assert_ne!(&*x as *const i32, &*y as *const i32);
129562306a36Sopenharmony_ci    /// ```
129662306a36Sopenharmony_ci    #[inline]
129762306a36Sopenharmony_ci    fn clone(&self) -> Self {
129862306a36Sopenharmony_ci        // Pre-allocate memory to allow writing the cloned value directly.
129962306a36Sopenharmony_ci        let mut boxed = Self::new_uninit_in(self.1.clone());
130062306a36Sopenharmony_ci        unsafe {
130162306a36Sopenharmony_ci            (**self).write_clone_into_raw(boxed.as_mut_ptr());
130262306a36Sopenharmony_ci            boxed.assume_init()
130362306a36Sopenharmony_ci        }
130462306a36Sopenharmony_ci    }
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_ci    /// Copies `source`'s contents into `self` without creating a new allocation.
130762306a36Sopenharmony_ci    ///
130862306a36Sopenharmony_ci    /// # Examples
130962306a36Sopenharmony_ci    ///
131062306a36Sopenharmony_ci    /// ```
131162306a36Sopenharmony_ci    /// let x = Box::new(5);
131262306a36Sopenharmony_ci    /// let mut y = Box::new(10);
131362306a36Sopenharmony_ci    /// let yp: *const i32 = &*y;
131462306a36Sopenharmony_ci    ///
131562306a36Sopenharmony_ci    /// y.clone_from(&x);
131662306a36Sopenharmony_ci    ///
131762306a36Sopenharmony_ci    /// // The value is the same
131862306a36Sopenharmony_ci    /// assert_eq!(x, y);
131962306a36Sopenharmony_ci    ///
132062306a36Sopenharmony_ci    /// // And no allocation occurred
132162306a36Sopenharmony_ci    /// assert_eq!(yp, &*y);
132262306a36Sopenharmony_ci    /// ```
132362306a36Sopenharmony_ci    #[inline]
132462306a36Sopenharmony_ci    fn clone_from(&mut self, source: &Self) {
132562306a36Sopenharmony_ci        (**self).clone_from(&(**source));
132662306a36Sopenharmony_ci    }
132762306a36Sopenharmony_ci}
132862306a36Sopenharmony_ci
132962306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
133062306a36Sopenharmony_ci#[stable(feature = "box_slice_clone", since = "1.3.0")]
133162306a36Sopenharmony_ciimpl Clone for Box<str> {
133262306a36Sopenharmony_ci    fn clone(&self) -> Self {
133362306a36Sopenharmony_ci        // this makes a copy of the data
133462306a36Sopenharmony_ci        let buf: Box<[u8]> = self.as_bytes().into();
133562306a36Sopenharmony_ci        unsafe { from_boxed_utf8_unchecked(buf) }
133662306a36Sopenharmony_ci    }
133762306a36Sopenharmony_ci}
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
134062306a36Sopenharmony_ciimpl<T: ?Sized + PartialEq, A: Allocator> PartialEq for Box<T, A> {
134162306a36Sopenharmony_ci    #[inline]
134262306a36Sopenharmony_ci    fn eq(&self, other: &Self) -> bool {
134362306a36Sopenharmony_ci        PartialEq::eq(&**self, &**other)
134462306a36Sopenharmony_ci    }
134562306a36Sopenharmony_ci    #[inline]
134662306a36Sopenharmony_ci    fn ne(&self, other: &Self) -> bool {
134762306a36Sopenharmony_ci        PartialEq::ne(&**self, &**other)
134862306a36Sopenharmony_ci    }
134962306a36Sopenharmony_ci}
135062306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
135162306a36Sopenharmony_ciimpl<T: ?Sized + PartialOrd, A: Allocator> PartialOrd for Box<T, A> {
135262306a36Sopenharmony_ci    #[inline]
135362306a36Sopenharmony_ci    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
135462306a36Sopenharmony_ci        PartialOrd::partial_cmp(&**self, &**other)
135562306a36Sopenharmony_ci    }
135662306a36Sopenharmony_ci    #[inline]
135762306a36Sopenharmony_ci    fn lt(&self, other: &Self) -> bool {
135862306a36Sopenharmony_ci        PartialOrd::lt(&**self, &**other)
135962306a36Sopenharmony_ci    }
136062306a36Sopenharmony_ci    #[inline]
136162306a36Sopenharmony_ci    fn le(&self, other: &Self) -> bool {
136262306a36Sopenharmony_ci        PartialOrd::le(&**self, &**other)
136362306a36Sopenharmony_ci    }
136462306a36Sopenharmony_ci    #[inline]
136562306a36Sopenharmony_ci    fn ge(&self, other: &Self) -> bool {
136662306a36Sopenharmony_ci        PartialOrd::ge(&**self, &**other)
136762306a36Sopenharmony_ci    }
136862306a36Sopenharmony_ci    #[inline]
136962306a36Sopenharmony_ci    fn gt(&self, other: &Self) -> bool {
137062306a36Sopenharmony_ci        PartialOrd::gt(&**self, &**other)
137162306a36Sopenharmony_ci    }
137262306a36Sopenharmony_ci}
137362306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
137462306a36Sopenharmony_ciimpl<T: ?Sized + Ord, A: Allocator> Ord for Box<T, A> {
137562306a36Sopenharmony_ci    #[inline]
137662306a36Sopenharmony_ci    fn cmp(&self, other: &Self) -> Ordering {
137762306a36Sopenharmony_ci        Ord::cmp(&**self, &**other)
137862306a36Sopenharmony_ci    }
137962306a36Sopenharmony_ci}
138062306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
138162306a36Sopenharmony_ciimpl<T: ?Sized + Eq, A: Allocator> Eq for Box<T, A> {}
138262306a36Sopenharmony_ci
138362306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
138462306a36Sopenharmony_ciimpl<T: ?Sized + Hash, A: Allocator> Hash for Box<T, A> {
138562306a36Sopenharmony_ci    fn hash<H: Hasher>(&self, state: &mut H) {
138662306a36Sopenharmony_ci        (**self).hash(state);
138762306a36Sopenharmony_ci    }
138862306a36Sopenharmony_ci}
138962306a36Sopenharmony_ci
139062306a36Sopenharmony_ci#[stable(feature = "indirect_hasher_impl", since = "1.22.0")]
139162306a36Sopenharmony_ciimpl<T: ?Sized + Hasher, A: Allocator> Hasher for Box<T, A> {
139262306a36Sopenharmony_ci    fn finish(&self) -> u64 {
139362306a36Sopenharmony_ci        (**self).finish()
139462306a36Sopenharmony_ci    }
139562306a36Sopenharmony_ci    fn write(&mut self, bytes: &[u8]) {
139662306a36Sopenharmony_ci        (**self).write(bytes)
139762306a36Sopenharmony_ci    }
139862306a36Sopenharmony_ci    fn write_u8(&mut self, i: u8) {
139962306a36Sopenharmony_ci        (**self).write_u8(i)
140062306a36Sopenharmony_ci    }
140162306a36Sopenharmony_ci    fn write_u16(&mut self, i: u16) {
140262306a36Sopenharmony_ci        (**self).write_u16(i)
140362306a36Sopenharmony_ci    }
140462306a36Sopenharmony_ci    fn write_u32(&mut self, i: u32) {
140562306a36Sopenharmony_ci        (**self).write_u32(i)
140662306a36Sopenharmony_ci    }
140762306a36Sopenharmony_ci    fn write_u64(&mut self, i: u64) {
140862306a36Sopenharmony_ci        (**self).write_u64(i)
140962306a36Sopenharmony_ci    }
141062306a36Sopenharmony_ci    fn write_u128(&mut self, i: u128) {
141162306a36Sopenharmony_ci        (**self).write_u128(i)
141262306a36Sopenharmony_ci    }
141362306a36Sopenharmony_ci    fn write_usize(&mut self, i: usize) {
141462306a36Sopenharmony_ci        (**self).write_usize(i)
141562306a36Sopenharmony_ci    }
141662306a36Sopenharmony_ci    fn write_i8(&mut self, i: i8) {
141762306a36Sopenharmony_ci        (**self).write_i8(i)
141862306a36Sopenharmony_ci    }
141962306a36Sopenharmony_ci    fn write_i16(&mut self, i: i16) {
142062306a36Sopenharmony_ci        (**self).write_i16(i)
142162306a36Sopenharmony_ci    }
142262306a36Sopenharmony_ci    fn write_i32(&mut self, i: i32) {
142362306a36Sopenharmony_ci        (**self).write_i32(i)
142462306a36Sopenharmony_ci    }
142562306a36Sopenharmony_ci    fn write_i64(&mut self, i: i64) {
142662306a36Sopenharmony_ci        (**self).write_i64(i)
142762306a36Sopenharmony_ci    }
142862306a36Sopenharmony_ci    fn write_i128(&mut self, i: i128) {
142962306a36Sopenharmony_ci        (**self).write_i128(i)
143062306a36Sopenharmony_ci    }
143162306a36Sopenharmony_ci    fn write_isize(&mut self, i: isize) {
143262306a36Sopenharmony_ci        (**self).write_isize(i)
143362306a36Sopenharmony_ci    }
143462306a36Sopenharmony_ci    fn write_length_prefix(&mut self, len: usize) {
143562306a36Sopenharmony_ci        (**self).write_length_prefix(len)
143662306a36Sopenharmony_ci    }
143762306a36Sopenharmony_ci    fn write_str(&mut self, s: &str) {
143862306a36Sopenharmony_ci        (**self).write_str(s)
143962306a36Sopenharmony_ci    }
144062306a36Sopenharmony_ci}
144162306a36Sopenharmony_ci
144262306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
144362306a36Sopenharmony_ci#[stable(feature = "from_for_ptrs", since = "1.6.0")]
144462306a36Sopenharmony_ciimpl<T> From<T> for Box<T> {
144562306a36Sopenharmony_ci    /// Converts a `T` into a `Box<T>`
144662306a36Sopenharmony_ci    ///
144762306a36Sopenharmony_ci    /// The conversion allocates on the heap and moves `t`
144862306a36Sopenharmony_ci    /// from the stack into it.
144962306a36Sopenharmony_ci    ///
145062306a36Sopenharmony_ci    /// # Examples
145162306a36Sopenharmony_ci    ///
145262306a36Sopenharmony_ci    /// ```rust
145362306a36Sopenharmony_ci    /// let x = 5;
145462306a36Sopenharmony_ci    /// let boxed = Box::new(5);
145562306a36Sopenharmony_ci    ///
145662306a36Sopenharmony_ci    /// assert_eq!(Box::from(x), boxed);
145762306a36Sopenharmony_ci    /// ```
145862306a36Sopenharmony_ci    fn from(t: T) -> Self {
145962306a36Sopenharmony_ci        Box::new(t)
146062306a36Sopenharmony_ci    }
146162306a36Sopenharmony_ci}
146262306a36Sopenharmony_ci
146362306a36Sopenharmony_ci#[stable(feature = "pin", since = "1.33.0")]
146462306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> From<Box<T, A>> for Pin<Box<T, A>>
146562306a36Sopenharmony_ciwhere
146662306a36Sopenharmony_ci    A: 'static,
146762306a36Sopenharmony_ci{
146862306a36Sopenharmony_ci    /// Converts a `Box<T>` into a `Pin<Box<T>>`. If `T` does not implement [`Unpin`], then
146962306a36Sopenharmony_ci    /// `*boxed` will be pinned in memory and unable to be moved.
147062306a36Sopenharmony_ci    ///
147162306a36Sopenharmony_ci    /// This conversion does not allocate on the heap and happens in place.
147262306a36Sopenharmony_ci    ///
147362306a36Sopenharmony_ci    /// This is also available via [`Box::into_pin`].
147462306a36Sopenharmony_ci    ///
147562306a36Sopenharmony_ci    /// Constructing and pinning a `Box` with <code><Pin<Box\<T>>>::from([Box::new]\(x))</code>
147662306a36Sopenharmony_ci    /// can also be written more concisely using <code>[Box::pin]\(x)</code>.
147762306a36Sopenharmony_ci    /// This `From` implementation is useful if you already have a `Box<T>`, or you are
147862306a36Sopenharmony_ci    /// constructing a (pinned) `Box` in a different way than with [`Box::new`].
147962306a36Sopenharmony_ci    fn from(boxed: Box<T, A>) -> Self {
148062306a36Sopenharmony_ci        Box::into_pin(boxed)
148162306a36Sopenharmony_ci    }
148262306a36Sopenharmony_ci}
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_ci/// Specialization trait used for `From<&[T]>`.
148562306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
148662306a36Sopenharmony_citrait BoxFromSlice<T> {
148762306a36Sopenharmony_ci    fn from_slice(slice: &[T]) -> Self;
148862306a36Sopenharmony_ci}
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
149162306a36Sopenharmony_ciimpl<T: Clone> BoxFromSlice<T> for Box<[T]> {
149262306a36Sopenharmony_ci    #[inline]
149362306a36Sopenharmony_ci    default fn from_slice(slice: &[T]) -> Self {
149462306a36Sopenharmony_ci        slice.to_vec().into_boxed_slice()
149562306a36Sopenharmony_ci    }
149662306a36Sopenharmony_ci}
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
149962306a36Sopenharmony_ciimpl<T: Copy> BoxFromSlice<T> for Box<[T]> {
150062306a36Sopenharmony_ci    #[inline]
150162306a36Sopenharmony_ci    fn from_slice(slice: &[T]) -> Self {
150262306a36Sopenharmony_ci        let len = slice.len();
150362306a36Sopenharmony_ci        let buf = RawVec::with_capacity(len);
150462306a36Sopenharmony_ci        unsafe {
150562306a36Sopenharmony_ci            ptr::copy_nonoverlapping(slice.as_ptr(), buf.ptr(), len);
150662306a36Sopenharmony_ci            buf.into_box(slice.len()).assume_init()
150762306a36Sopenharmony_ci        }
150862306a36Sopenharmony_ci    }
150962306a36Sopenharmony_ci}
151062306a36Sopenharmony_ci
151162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
151262306a36Sopenharmony_ci#[stable(feature = "box_from_slice", since = "1.17.0")]
151362306a36Sopenharmony_ciimpl<T: Clone> From<&[T]> for Box<[T]> {
151462306a36Sopenharmony_ci    /// Converts a `&[T]` into a `Box<[T]>`
151562306a36Sopenharmony_ci    ///
151662306a36Sopenharmony_ci    /// This conversion allocates on the heap
151762306a36Sopenharmony_ci    /// and performs a copy of `slice` and its contents.
151862306a36Sopenharmony_ci    ///
151962306a36Sopenharmony_ci    /// # Examples
152062306a36Sopenharmony_ci    /// ```rust
152162306a36Sopenharmony_ci    /// // create a &[u8] which will be used to create a Box<[u8]>
152262306a36Sopenharmony_ci    /// let slice: &[u8] = &[104, 101, 108, 108, 111];
152362306a36Sopenharmony_ci    /// let boxed_slice: Box<[u8]> = Box::from(slice);
152462306a36Sopenharmony_ci    ///
152562306a36Sopenharmony_ci    /// println!("{boxed_slice:?}");
152662306a36Sopenharmony_ci    /// ```
152762306a36Sopenharmony_ci    #[inline]
152862306a36Sopenharmony_ci    fn from(slice: &[T]) -> Box<[T]> {
152962306a36Sopenharmony_ci        <Self as BoxFromSlice<T>>::from_slice(slice)
153062306a36Sopenharmony_ci    }
153162306a36Sopenharmony_ci}
153262306a36Sopenharmony_ci
153362306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
153462306a36Sopenharmony_ci#[stable(feature = "box_from_cow", since = "1.45.0")]
153562306a36Sopenharmony_ciimpl<T: Clone> From<Cow<'_, [T]>> for Box<[T]> {
153662306a36Sopenharmony_ci    /// Converts a `Cow<'_, [T]>` into a `Box<[T]>`
153762306a36Sopenharmony_ci    ///
153862306a36Sopenharmony_ci    /// When `cow` is the `Cow::Borrowed` variant, this
153962306a36Sopenharmony_ci    /// conversion allocates on the heap and copies the
154062306a36Sopenharmony_ci    /// underlying slice. Otherwise, it will try to reuse the owned
154162306a36Sopenharmony_ci    /// `Vec`'s allocation.
154262306a36Sopenharmony_ci    #[inline]
154362306a36Sopenharmony_ci    fn from(cow: Cow<'_, [T]>) -> Box<[T]> {
154462306a36Sopenharmony_ci        match cow {
154562306a36Sopenharmony_ci            Cow::Borrowed(slice) => Box::from(slice),
154662306a36Sopenharmony_ci            Cow::Owned(slice) => Box::from(slice),
154762306a36Sopenharmony_ci        }
154862306a36Sopenharmony_ci    }
154962306a36Sopenharmony_ci}
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
155262306a36Sopenharmony_ci#[stable(feature = "box_from_slice", since = "1.17.0")]
155362306a36Sopenharmony_ciimpl From<&str> for Box<str> {
155462306a36Sopenharmony_ci    /// Converts a `&str` into a `Box<str>`
155562306a36Sopenharmony_ci    ///
155662306a36Sopenharmony_ci    /// This conversion allocates on the heap
155762306a36Sopenharmony_ci    /// and performs a copy of `s`.
155862306a36Sopenharmony_ci    ///
155962306a36Sopenharmony_ci    /// # Examples
156062306a36Sopenharmony_ci    ///
156162306a36Sopenharmony_ci    /// ```rust
156262306a36Sopenharmony_ci    /// let boxed: Box<str> = Box::from("hello");
156362306a36Sopenharmony_ci    /// println!("{boxed}");
156462306a36Sopenharmony_ci    /// ```
156562306a36Sopenharmony_ci    #[inline]
156662306a36Sopenharmony_ci    fn from(s: &str) -> Box<str> {
156762306a36Sopenharmony_ci        unsafe { from_boxed_utf8_unchecked(Box::from(s.as_bytes())) }
156862306a36Sopenharmony_ci    }
156962306a36Sopenharmony_ci}
157062306a36Sopenharmony_ci
157162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
157262306a36Sopenharmony_ci#[stable(feature = "box_from_cow", since = "1.45.0")]
157362306a36Sopenharmony_ciimpl From<Cow<'_, str>> for Box<str> {
157462306a36Sopenharmony_ci    /// Converts a `Cow<'_, str>` into a `Box<str>`
157562306a36Sopenharmony_ci    ///
157662306a36Sopenharmony_ci    /// When `cow` is the `Cow::Borrowed` variant, this
157762306a36Sopenharmony_ci    /// conversion allocates on the heap and copies the
157862306a36Sopenharmony_ci    /// underlying `str`. Otherwise, it will try to reuse the owned
157962306a36Sopenharmony_ci    /// `String`'s allocation.
158062306a36Sopenharmony_ci    ///
158162306a36Sopenharmony_ci    /// # Examples
158262306a36Sopenharmony_ci    ///
158362306a36Sopenharmony_ci    /// ```rust
158462306a36Sopenharmony_ci    /// use std::borrow::Cow;
158562306a36Sopenharmony_ci    ///
158662306a36Sopenharmony_ci    /// let unboxed = Cow::Borrowed("hello");
158762306a36Sopenharmony_ci    /// let boxed: Box<str> = Box::from(unboxed);
158862306a36Sopenharmony_ci    /// println!("{boxed}");
158962306a36Sopenharmony_ci    /// ```
159062306a36Sopenharmony_ci    ///
159162306a36Sopenharmony_ci    /// ```rust
159262306a36Sopenharmony_ci    /// # use std::borrow::Cow;
159362306a36Sopenharmony_ci    /// let unboxed = Cow::Owned("hello".to_string());
159462306a36Sopenharmony_ci    /// let boxed: Box<str> = Box::from(unboxed);
159562306a36Sopenharmony_ci    /// println!("{boxed}");
159662306a36Sopenharmony_ci    /// ```
159762306a36Sopenharmony_ci    #[inline]
159862306a36Sopenharmony_ci    fn from(cow: Cow<'_, str>) -> Box<str> {
159962306a36Sopenharmony_ci        match cow {
160062306a36Sopenharmony_ci            Cow::Borrowed(s) => Box::from(s),
160162306a36Sopenharmony_ci            Cow::Owned(s) => Box::from(s),
160262306a36Sopenharmony_ci        }
160362306a36Sopenharmony_ci    }
160462306a36Sopenharmony_ci}
160562306a36Sopenharmony_ci
160662306a36Sopenharmony_ci#[stable(feature = "boxed_str_conv", since = "1.19.0")]
160762306a36Sopenharmony_ciimpl<A: Allocator> From<Box<str, A>> for Box<[u8], A> {
160862306a36Sopenharmony_ci    /// Converts a `Box<str>` into a `Box<[u8]>`
160962306a36Sopenharmony_ci    ///
161062306a36Sopenharmony_ci    /// This conversion does not allocate on the heap and happens in place.
161162306a36Sopenharmony_ci    ///
161262306a36Sopenharmony_ci    /// # Examples
161362306a36Sopenharmony_ci    /// ```rust
161462306a36Sopenharmony_ci    /// // create a Box<str> which will be used to create a Box<[u8]>
161562306a36Sopenharmony_ci    /// let boxed: Box<str> = Box::from("hello");
161662306a36Sopenharmony_ci    /// let boxed_str: Box<[u8]> = Box::from(boxed);
161762306a36Sopenharmony_ci    ///
161862306a36Sopenharmony_ci    /// // create a &[u8] which will be used to create a Box<[u8]>
161962306a36Sopenharmony_ci    /// let slice: &[u8] = &[104, 101, 108, 108, 111];
162062306a36Sopenharmony_ci    /// let boxed_slice = Box::from(slice);
162162306a36Sopenharmony_ci    ///
162262306a36Sopenharmony_ci    /// assert_eq!(boxed_slice, boxed_str);
162362306a36Sopenharmony_ci    /// ```
162462306a36Sopenharmony_ci    #[inline]
162562306a36Sopenharmony_ci    fn from(s: Box<str, A>) -> Self {
162662306a36Sopenharmony_ci        let (raw, alloc) = Box::into_raw_with_allocator(s);
162762306a36Sopenharmony_ci        unsafe { Box::from_raw_in(raw as *mut [u8], alloc) }
162862306a36Sopenharmony_ci    }
162962306a36Sopenharmony_ci}
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
163262306a36Sopenharmony_ci#[stable(feature = "box_from_array", since = "1.45.0")]
163362306a36Sopenharmony_ciimpl<T, const N: usize> From<[T; N]> for Box<[T]> {
163462306a36Sopenharmony_ci    /// Converts a `[T; N]` into a `Box<[T]>`
163562306a36Sopenharmony_ci    ///
163662306a36Sopenharmony_ci    /// This conversion moves the array to newly heap-allocated memory.
163762306a36Sopenharmony_ci    ///
163862306a36Sopenharmony_ci    /// # Examples
163962306a36Sopenharmony_ci    ///
164062306a36Sopenharmony_ci    /// ```rust
164162306a36Sopenharmony_ci    /// let boxed: Box<[u8]> = Box::from([4, 2]);
164262306a36Sopenharmony_ci    /// println!("{boxed:?}");
164362306a36Sopenharmony_ci    /// ```
164462306a36Sopenharmony_ci    fn from(array: [T; N]) -> Box<[T]> {
164562306a36Sopenharmony_ci        Box::new(array)
164662306a36Sopenharmony_ci    }
164762306a36Sopenharmony_ci}
164862306a36Sopenharmony_ci
164962306a36Sopenharmony_ci/// Casts a boxed slice to a boxed array.
165062306a36Sopenharmony_ci///
165162306a36Sopenharmony_ci/// # Safety
165262306a36Sopenharmony_ci///
165362306a36Sopenharmony_ci/// `boxed_slice.len()` must be exactly `N`.
165462306a36Sopenharmony_ciunsafe fn boxed_slice_as_array_unchecked<T, A: Allocator, const N: usize>(
165562306a36Sopenharmony_ci    boxed_slice: Box<[T], A>,
165662306a36Sopenharmony_ci) -> Box<[T; N], A> {
165762306a36Sopenharmony_ci    debug_assert_eq!(boxed_slice.len(), N);
165862306a36Sopenharmony_ci
165962306a36Sopenharmony_ci    let (ptr, alloc) = Box::into_raw_with_allocator(boxed_slice);
166062306a36Sopenharmony_ci    // SAFETY: Pointer and allocator came from an existing box,
166162306a36Sopenharmony_ci    // and our safety condition requires that the length is exactly `N`
166262306a36Sopenharmony_ci    unsafe { Box::from_raw_in(ptr as *mut [T; N], alloc) }
166362306a36Sopenharmony_ci}
166462306a36Sopenharmony_ci
166562306a36Sopenharmony_ci#[stable(feature = "boxed_slice_try_from", since = "1.43.0")]
166662306a36Sopenharmony_ciimpl<T, const N: usize> TryFrom<Box<[T]>> for Box<[T; N]> {
166762306a36Sopenharmony_ci    type Error = Box<[T]>;
166862306a36Sopenharmony_ci
166962306a36Sopenharmony_ci    /// Attempts to convert a `Box<[T]>` into a `Box<[T; N]>`.
167062306a36Sopenharmony_ci    ///
167162306a36Sopenharmony_ci    /// The conversion occurs in-place and does not require a
167262306a36Sopenharmony_ci    /// new memory allocation.
167362306a36Sopenharmony_ci    ///
167462306a36Sopenharmony_ci    /// # Errors
167562306a36Sopenharmony_ci    ///
167662306a36Sopenharmony_ci    /// Returns the old `Box<[T]>` in the `Err` variant if
167762306a36Sopenharmony_ci    /// `boxed_slice.len()` does not equal `N`.
167862306a36Sopenharmony_ci    fn try_from(boxed_slice: Box<[T]>) -> Result<Self, Self::Error> {
167962306a36Sopenharmony_ci        if boxed_slice.len() == N {
168062306a36Sopenharmony_ci            Ok(unsafe { boxed_slice_as_array_unchecked(boxed_slice) })
168162306a36Sopenharmony_ci        } else {
168262306a36Sopenharmony_ci            Err(boxed_slice)
168362306a36Sopenharmony_ci        }
168462306a36Sopenharmony_ci    }
168562306a36Sopenharmony_ci}
168662306a36Sopenharmony_ci
168762306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
168862306a36Sopenharmony_ci#[stable(feature = "boxed_array_try_from_vec", since = "1.66.0")]
168962306a36Sopenharmony_ciimpl<T, const N: usize> TryFrom<Vec<T>> for Box<[T; N]> {
169062306a36Sopenharmony_ci    type Error = Vec<T>;
169162306a36Sopenharmony_ci
169262306a36Sopenharmony_ci    /// Attempts to convert a `Vec<T>` into a `Box<[T; N]>`.
169362306a36Sopenharmony_ci    ///
169462306a36Sopenharmony_ci    /// Like [`Vec::into_boxed_slice`], this is in-place if `vec.capacity() == N`,
169562306a36Sopenharmony_ci    /// but will require a reallocation otherwise.
169662306a36Sopenharmony_ci    ///
169762306a36Sopenharmony_ci    /// # Errors
169862306a36Sopenharmony_ci    ///
169962306a36Sopenharmony_ci    /// Returns the original `Vec<T>` in the `Err` variant if
170062306a36Sopenharmony_ci    /// `boxed_slice.len()` does not equal `N`.
170162306a36Sopenharmony_ci    ///
170262306a36Sopenharmony_ci    /// # Examples
170362306a36Sopenharmony_ci    ///
170462306a36Sopenharmony_ci    /// This can be used with [`vec!`] to create an array on the heap:
170562306a36Sopenharmony_ci    ///
170662306a36Sopenharmony_ci    /// ```
170762306a36Sopenharmony_ci    /// let state: Box<[f32; 100]> = vec![1.0; 100].try_into().unwrap();
170862306a36Sopenharmony_ci    /// assert_eq!(state.len(), 100);
170962306a36Sopenharmony_ci    /// ```
171062306a36Sopenharmony_ci    fn try_from(vec: Vec<T>) -> Result<Self, Self::Error> {
171162306a36Sopenharmony_ci        if vec.len() == N {
171262306a36Sopenharmony_ci            let boxed_slice = vec.into_boxed_slice();
171362306a36Sopenharmony_ci            Ok(unsafe { boxed_slice_as_array_unchecked(boxed_slice) })
171462306a36Sopenharmony_ci        } else {
171562306a36Sopenharmony_ci            Err(vec)
171662306a36Sopenharmony_ci        }
171762306a36Sopenharmony_ci    }
171862306a36Sopenharmony_ci}
171962306a36Sopenharmony_ci
172062306a36Sopenharmony_ciimpl<A: Allocator> Box<dyn Any, A> {
172162306a36Sopenharmony_ci    /// Attempt to downcast the box to a concrete type.
172262306a36Sopenharmony_ci    ///
172362306a36Sopenharmony_ci    /// # Examples
172462306a36Sopenharmony_ci    ///
172562306a36Sopenharmony_ci    /// ```
172662306a36Sopenharmony_ci    /// use std::any::Any;
172762306a36Sopenharmony_ci    ///
172862306a36Sopenharmony_ci    /// fn print_if_string(value: Box<dyn Any>) {
172962306a36Sopenharmony_ci    ///     if let Ok(string) = value.downcast::<String>() {
173062306a36Sopenharmony_ci    ///         println!("String ({}): {}", string.len(), string);
173162306a36Sopenharmony_ci    ///     }
173262306a36Sopenharmony_ci    /// }
173362306a36Sopenharmony_ci    ///
173462306a36Sopenharmony_ci    /// let my_string = "Hello World".to_string();
173562306a36Sopenharmony_ci    /// print_if_string(Box::new(my_string));
173662306a36Sopenharmony_ci    /// print_if_string(Box::new(0i8));
173762306a36Sopenharmony_ci    /// ```
173862306a36Sopenharmony_ci    #[inline]
173962306a36Sopenharmony_ci    #[stable(feature = "rust1", since = "1.0.0")]
174062306a36Sopenharmony_ci    pub fn downcast<T: Any>(self) -> Result<Box<T, A>, Self> {
174162306a36Sopenharmony_ci        if self.is::<T>() { unsafe { Ok(self.downcast_unchecked::<T>()) } } else { Err(self) }
174262306a36Sopenharmony_ci    }
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_ci    /// Downcasts the box to a concrete type.
174562306a36Sopenharmony_ci    ///
174662306a36Sopenharmony_ci    /// For a safe alternative see [`downcast`].
174762306a36Sopenharmony_ci    ///
174862306a36Sopenharmony_ci    /// # Examples
174962306a36Sopenharmony_ci    ///
175062306a36Sopenharmony_ci    /// ```
175162306a36Sopenharmony_ci    /// #![feature(downcast_unchecked)]
175262306a36Sopenharmony_ci    ///
175362306a36Sopenharmony_ci    /// use std::any::Any;
175462306a36Sopenharmony_ci    ///
175562306a36Sopenharmony_ci    /// let x: Box<dyn Any> = Box::new(1_usize);
175662306a36Sopenharmony_ci    ///
175762306a36Sopenharmony_ci    /// unsafe {
175862306a36Sopenharmony_ci    ///     assert_eq!(*x.downcast_unchecked::<usize>(), 1);
175962306a36Sopenharmony_ci    /// }
176062306a36Sopenharmony_ci    /// ```
176162306a36Sopenharmony_ci    ///
176262306a36Sopenharmony_ci    /// # Safety
176362306a36Sopenharmony_ci    ///
176462306a36Sopenharmony_ci    /// The contained value must be of type `T`. Calling this method
176562306a36Sopenharmony_ci    /// with the incorrect type is *undefined behavior*.
176662306a36Sopenharmony_ci    ///
176762306a36Sopenharmony_ci    /// [`downcast`]: Self::downcast
176862306a36Sopenharmony_ci    #[inline]
176962306a36Sopenharmony_ci    #[unstable(feature = "downcast_unchecked", issue = "90850")]
177062306a36Sopenharmony_ci    pub unsafe fn downcast_unchecked<T: Any>(self) -> Box<T, A> {
177162306a36Sopenharmony_ci        debug_assert!(self.is::<T>());
177262306a36Sopenharmony_ci        unsafe {
177362306a36Sopenharmony_ci            let (raw, alloc): (*mut dyn Any, _) = Box::into_raw_with_allocator(self);
177462306a36Sopenharmony_ci            Box::from_raw_in(raw as *mut T, alloc)
177562306a36Sopenharmony_ci        }
177662306a36Sopenharmony_ci    }
177762306a36Sopenharmony_ci}
177862306a36Sopenharmony_ci
177962306a36Sopenharmony_ciimpl<A: Allocator> Box<dyn Any + Send, A> {
178062306a36Sopenharmony_ci    /// Attempt to downcast the box to a concrete type.
178162306a36Sopenharmony_ci    ///
178262306a36Sopenharmony_ci    /// # Examples
178362306a36Sopenharmony_ci    ///
178462306a36Sopenharmony_ci    /// ```
178562306a36Sopenharmony_ci    /// use std::any::Any;
178662306a36Sopenharmony_ci    ///
178762306a36Sopenharmony_ci    /// fn print_if_string(value: Box<dyn Any + Send>) {
178862306a36Sopenharmony_ci    ///     if let Ok(string) = value.downcast::<String>() {
178962306a36Sopenharmony_ci    ///         println!("String ({}): {}", string.len(), string);
179062306a36Sopenharmony_ci    ///     }
179162306a36Sopenharmony_ci    /// }
179262306a36Sopenharmony_ci    ///
179362306a36Sopenharmony_ci    /// let my_string = "Hello World".to_string();
179462306a36Sopenharmony_ci    /// print_if_string(Box::new(my_string));
179562306a36Sopenharmony_ci    /// print_if_string(Box::new(0i8));
179662306a36Sopenharmony_ci    /// ```
179762306a36Sopenharmony_ci    #[inline]
179862306a36Sopenharmony_ci    #[stable(feature = "rust1", since = "1.0.0")]
179962306a36Sopenharmony_ci    pub fn downcast<T: Any>(self) -> Result<Box<T, A>, Self> {
180062306a36Sopenharmony_ci        if self.is::<T>() { unsafe { Ok(self.downcast_unchecked::<T>()) } } else { Err(self) }
180162306a36Sopenharmony_ci    }
180262306a36Sopenharmony_ci
180362306a36Sopenharmony_ci    /// Downcasts the box to a concrete type.
180462306a36Sopenharmony_ci    ///
180562306a36Sopenharmony_ci    /// For a safe alternative see [`downcast`].
180662306a36Sopenharmony_ci    ///
180762306a36Sopenharmony_ci    /// # Examples
180862306a36Sopenharmony_ci    ///
180962306a36Sopenharmony_ci    /// ```
181062306a36Sopenharmony_ci    /// #![feature(downcast_unchecked)]
181162306a36Sopenharmony_ci    ///
181262306a36Sopenharmony_ci    /// use std::any::Any;
181362306a36Sopenharmony_ci    ///
181462306a36Sopenharmony_ci    /// let x: Box<dyn Any + Send> = Box::new(1_usize);
181562306a36Sopenharmony_ci    ///
181662306a36Sopenharmony_ci    /// unsafe {
181762306a36Sopenharmony_ci    ///     assert_eq!(*x.downcast_unchecked::<usize>(), 1);
181862306a36Sopenharmony_ci    /// }
181962306a36Sopenharmony_ci    /// ```
182062306a36Sopenharmony_ci    ///
182162306a36Sopenharmony_ci    /// # Safety
182262306a36Sopenharmony_ci    ///
182362306a36Sopenharmony_ci    /// The contained value must be of type `T`. Calling this method
182462306a36Sopenharmony_ci    /// with the incorrect type is *undefined behavior*.
182562306a36Sopenharmony_ci    ///
182662306a36Sopenharmony_ci    /// [`downcast`]: Self::downcast
182762306a36Sopenharmony_ci    #[inline]
182862306a36Sopenharmony_ci    #[unstable(feature = "downcast_unchecked", issue = "90850")]
182962306a36Sopenharmony_ci    pub unsafe fn downcast_unchecked<T: Any>(self) -> Box<T, A> {
183062306a36Sopenharmony_ci        debug_assert!(self.is::<T>());
183162306a36Sopenharmony_ci        unsafe {
183262306a36Sopenharmony_ci            let (raw, alloc): (*mut (dyn Any + Send), _) = Box::into_raw_with_allocator(self);
183362306a36Sopenharmony_ci            Box::from_raw_in(raw as *mut T, alloc)
183462306a36Sopenharmony_ci        }
183562306a36Sopenharmony_ci    }
183662306a36Sopenharmony_ci}
183762306a36Sopenharmony_ci
183862306a36Sopenharmony_ciimpl<A: Allocator> Box<dyn Any + Send + Sync, A> {
183962306a36Sopenharmony_ci    /// Attempt to downcast the box to a concrete type.
184062306a36Sopenharmony_ci    ///
184162306a36Sopenharmony_ci    /// # Examples
184262306a36Sopenharmony_ci    ///
184362306a36Sopenharmony_ci    /// ```
184462306a36Sopenharmony_ci    /// use std::any::Any;
184562306a36Sopenharmony_ci    ///
184662306a36Sopenharmony_ci    /// fn print_if_string(value: Box<dyn Any + Send + Sync>) {
184762306a36Sopenharmony_ci    ///     if let Ok(string) = value.downcast::<String>() {
184862306a36Sopenharmony_ci    ///         println!("String ({}): {}", string.len(), string);
184962306a36Sopenharmony_ci    ///     }
185062306a36Sopenharmony_ci    /// }
185162306a36Sopenharmony_ci    ///
185262306a36Sopenharmony_ci    /// let my_string = "Hello World".to_string();
185362306a36Sopenharmony_ci    /// print_if_string(Box::new(my_string));
185462306a36Sopenharmony_ci    /// print_if_string(Box::new(0i8));
185562306a36Sopenharmony_ci    /// ```
185662306a36Sopenharmony_ci    #[inline]
185762306a36Sopenharmony_ci    #[stable(feature = "box_send_sync_any_downcast", since = "1.51.0")]
185862306a36Sopenharmony_ci    pub fn downcast<T: Any>(self) -> Result<Box<T, A>, Self> {
185962306a36Sopenharmony_ci        if self.is::<T>() { unsafe { Ok(self.downcast_unchecked::<T>()) } } else { Err(self) }
186062306a36Sopenharmony_ci    }
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_ci    /// Downcasts the box to a concrete type.
186362306a36Sopenharmony_ci    ///
186462306a36Sopenharmony_ci    /// For a safe alternative see [`downcast`].
186562306a36Sopenharmony_ci    ///
186662306a36Sopenharmony_ci    /// # Examples
186762306a36Sopenharmony_ci    ///
186862306a36Sopenharmony_ci    /// ```
186962306a36Sopenharmony_ci    /// #![feature(downcast_unchecked)]
187062306a36Sopenharmony_ci    ///
187162306a36Sopenharmony_ci    /// use std::any::Any;
187262306a36Sopenharmony_ci    ///
187362306a36Sopenharmony_ci    /// let x: Box<dyn Any + Send + Sync> = Box::new(1_usize);
187462306a36Sopenharmony_ci    ///
187562306a36Sopenharmony_ci    /// unsafe {
187662306a36Sopenharmony_ci    ///     assert_eq!(*x.downcast_unchecked::<usize>(), 1);
187762306a36Sopenharmony_ci    /// }
187862306a36Sopenharmony_ci    /// ```
187962306a36Sopenharmony_ci    ///
188062306a36Sopenharmony_ci    /// # Safety
188162306a36Sopenharmony_ci    ///
188262306a36Sopenharmony_ci    /// The contained value must be of type `T`. Calling this method
188362306a36Sopenharmony_ci    /// with the incorrect type is *undefined behavior*.
188462306a36Sopenharmony_ci    ///
188562306a36Sopenharmony_ci    /// [`downcast`]: Self::downcast
188662306a36Sopenharmony_ci    #[inline]
188762306a36Sopenharmony_ci    #[unstable(feature = "downcast_unchecked", issue = "90850")]
188862306a36Sopenharmony_ci    pub unsafe fn downcast_unchecked<T: Any>(self) -> Box<T, A> {
188962306a36Sopenharmony_ci        debug_assert!(self.is::<T>());
189062306a36Sopenharmony_ci        unsafe {
189162306a36Sopenharmony_ci            let (raw, alloc): (*mut (dyn Any + Send + Sync), _) =
189262306a36Sopenharmony_ci                Box::into_raw_with_allocator(self);
189362306a36Sopenharmony_ci            Box::from_raw_in(raw as *mut T, alloc)
189462306a36Sopenharmony_ci        }
189562306a36Sopenharmony_ci    }
189662306a36Sopenharmony_ci}
189762306a36Sopenharmony_ci
189862306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
189962306a36Sopenharmony_ciimpl<T: fmt::Display + ?Sized, A: Allocator> fmt::Display for Box<T, A> {
190062306a36Sopenharmony_ci    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
190162306a36Sopenharmony_ci        fmt::Display::fmt(&**self, f)
190262306a36Sopenharmony_ci    }
190362306a36Sopenharmony_ci}
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
190662306a36Sopenharmony_ciimpl<T: fmt::Debug + ?Sized, A: Allocator> fmt::Debug for Box<T, A> {
190762306a36Sopenharmony_ci    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
190862306a36Sopenharmony_ci        fmt::Debug::fmt(&**self, f)
190962306a36Sopenharmony_ci    }
191062306a36Sopenharmony_ci}
191162306a36Sopenharmony_ci
191262306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
191362306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> fmt::Pointer for Box<T, A> {
191462306a36Sopenharmony_ci    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
191562306a36Sopenharmony_ci        // It's not possible to extract the inner Uniq directly from the Box,
191662306a36Sopenharmony_ci        // instead we cast it to a *const which aliases the Unique
191762306a36Sopenharmony_ci        let ptr: *const T = &**self;
191862306a36Sopenharmony_ci        fmt::Pointer::fmt(&ptr, f)
191962306a36Sopenharmony_ci    }
192062306a36Sopenharmony_ci}
192162306a36Sopenharmony_ci
192262306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
192362306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> Deref for Box<T, A> {
192462306a36Sopenharmony_ci    type Target = T;
192562306a36Sopenharmony_ci
192662306a36Sopenharmony_ci    fn deref(&self) -> &T {
192762306a36Sopenharmony_ci        &**self
192862306a36Sopenharmony_ci    }
192962306a36Sopenharmony_ci}
193062306a36Sopenharmony_ci
193162306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
193262306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> DerefMut for Box<T, A> {
193362306a36Sopenharmony_ci    fn deref_mut(&mut self) -> &mut T {
193462306a36Sopenharmony_ci        &mut **self
193562306a36Sopenharmony_ci    }
193662306a36Sopenharmony_ci}
193762306a36Sopenharmony_ci
193862306a36Sopenharmony_ci#[unstable(feature = "receiver_trait", issue = "none")]
193962306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> Receiver for Box<T, A> {}
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
194262306a36Sopenharmony_ciimpl<I: Iterator + ?Sized, A: Allocator> Iterator for Box<I, A> {
194362306a36Sopenharmony_ci    type Item = I::Item;
194462306a36Sopenharmony_ci    fn next(&mut self) -> Option<I::Item> {
194562306a36Sopenharmony_ci        (**self).next()
194662306a36Sopenharmony_ci    }
194762306a36Sopenharmony_ci    fn size_hint(&self) -> (usize, Option<usize>) {
194862306a36Sopenharmony_ci        (**self).size_hint()
194962306a36Sopenharmony_ci    }
195062306a36Sopenharmony_ci    fn nth(&mut self, n: usize) -> Option<I::Item> {
195162306a36Sopenharmony_ci        (**self).nth(n)
195262306a36Sopenharmony_ci    }
195362306a36Sopenharmony_ci    fn last(self) -> Option<I::Item> {
195462306a36Sopenharmony_ci        BoxIter::last(self)
195562306a36Sopenharmony_ci    }
195662306a36Sopenharmony_ci}
195762306a36Sopenharmony_ci
195862306a36Sopenharmony_citrait BoxIter {
195962306a36Sopenharmony_ci    type Item;
196062306a36Sopenharmony_ci    fn last(self) -> Option<Self::Item>;
196162306a36Sopenharmony_ci}
196262306a36Sopenharmony_ci
196362306a36Sopenharmony_ciimpl<I: Iterator + ?Sized, A: Allocator> BoxIter for Box<I, A> {
196462306a36Sopenharmony_ci    type Item = I::Item;
196562306a36Sopenharmony_ci    default fn last(self) -> Option<I::Item> {
196662306a36Sopenharmony_ci        #[inline]
196762306a36Sopenharmony_ci        fn some<T>(_: Option<T>, x: T) -> Option<T> {
196862306a36Sopenharmony_ci            Some(x)
196962306a36Sopenharmony_ci        }
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_ci        self.fold(None, some)
197262306a36Sopenharmony_ci    }
197362306a36Sopenharmony_ci}
197462306a36Sopenharmony_ci
197562306a36Sopenharmony_ci/// Specialization for sized `I`s that uses `I`s implementation of `last()`
197662306a36Sopenharmony_ci/// instead of the default.
197762306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
197862306a36Sopenharmony_ciimpl<I: Iterator, A: Allocator> BoxIter for Box<I, A> {
197962306a36Sopenharmony_ci    fn last(self) -> Option<I::Item> {
198062306a36Sopenharmony_ci        (*self).last()
198162306a36Sopenharmony_ci    }
198262306a36Sopenharmony_ci}
198362306a36Sopenharmony_ci
198462306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
198562306a36Sopenharmony_ciimpl<I: DoubleEndedIterator + ?Sized, A: Allocator> DoubleEndedIterator for Box<I, A> {
198662306a36Sopenharmony_ci    fn next_back(&mut self) -> Option<I::Item> {
198762306a36Sopenharmony_ci        (**self).next_back()
198862306a36Sopenharmony_ci    }
198962306a36Sopenharmony_ci    fn nth_back(&mut self, n: usize) -> Option<I::Item> {
199062306a36Sopenharmony_ci        (**self).nth_back(n)
199162306a36Sopenharmony_ci    }
199262306a36Sopenharmony_ci}
199362306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
199462306a36Sopenharmony_ciimpl<I: ExactSizeIterator + ?Sized, A: Allocator> ExactSizeIterator for Box<I, A> {
199562306a36Sopenharmony_ci    fn len(&self) -> usize {
199662306a36Sopenharmony_ci        (**self).len()
199762306a36Sopenharmony_ci    }
199862306a36Sopenharmony_ci    fn is_empty(&self) -> bool {
199962306a36Sopenharmony_ci        (**self).is_empty()
200062306a36Sopenharmony_ci    }
200162306a36Sopenharmony_ci}
200262306a36Sopenharmony_ci
200362306a36Sopenharmony_ci#[stable(feature = "fused", since = "1.26.0")]
200462306a36Sopenharmony_ciimpl<I: FusedIterator + ?Sized, A: Allocator> FusedIterator for Box<I, A> {}
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_ci#[stable(feature = "boxed_closure_impls", since = "1.35.0")]
200762306a36Sopenharmony_ciimpl<Args: Tuple, F: FnOnce<Args> + ?Sized, A: Allocator> FnOnce<Args> for Box<F, A> {
200862306a36Sopenharmony_ci    type Output = <F as FnOnce<Args>>::Output;
200962306a36Sopenharmony_ci
201062306a36Sopenharmony_ci    extern "rust-call" fn call_once(self, args: Args) -> Self::Output {
201162306a36Sopenharmony_ci        <F as FnOnce<Args>>::call_once(*self, args)
201262306a36Sopenharmony_ci    }
201362306a36Sopenharmony_ci}
201462306a36Sopenharmony_ci
201562306a36Sopenharmony_ci#[stable(feature = "boxed_closure_impls", since = "1.35.0")]
201662306a36Sopenharmony_ciimpl<Args: Tuple, F: FnMut<Args> + ?Sized, A: Allocator> FnMut<Args> for Box<F, A> {
201762306a36Sopenharmony_ci    extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output {
201862306a36Sopenharmony_ci        <F as FnMut<Args>>::call_mut(self, args)
201962306a36Sopenharmony_ci    }
202062306a36Sopenharmony_ci}
202162306a36Sopenharmony_ci
202262306a36Sopenharmony_ci#[stable(feature = "boxed_closure_impls", since = "1.35.0")]
202362306a36Sopenharmony_ciimpl<Args: Tuple, F: Fn<Args> + ?Sized, A: Allocator> Fn<Args> for Box<F, A> {
202462306a36Sopenharmony_ci    extern "rust-call" fn call(&self, args: Args) -> Self::Output {
202562306a36Sopenharmony_ci        <F as Fn<Args>>::call(self, args)
202662306a36Sopenharmony_ci    }
202762306a36Sopenharmony_ci}
202862306a36Sopenharmony_ci
202962306a36Sopenharmony_ci#[unstable(feature = "coerce_unsized", issue = "18598")]
203062306a36Sopenharmony_ciimpl<T: ?Sized + Unsize<U>, U: ?Sized, A: Allocator> CoerceUnsized<Box<U, A>> for Box<T, A> {}
203162306a36Sopenharmony_ci
203262306a36Sopenharmony_ci#[unstable(feature = "dispatch_from_dyn", issue = "none")]
203362306a36Sopenharmony_ciimpl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Box<U>> for Box<T, Global> {}
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
203662306a36Sopenharmony_ci#[stable(feature = "boxed_slice_from_iter", since = "1.32.0")]
203762306a36Sopenharmony_ciimpl<I> FromIterator<I> for Box<[I]> {
203862306a36Sopenharmony_ci    fn from_iter<T: IntoIterator<Item = I>>(iter: T) -> Self {
203962306a36Sopenharmony_ci        iter.into_iter().collect::<Vec<_>>().into_boxed_slice()
204062306a36Sopenharmony_ci    }
204162306a36Sopenharmony_ci}
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
204462306a36Sopenharmony_ci#[stable(feature = "box_slice_clone", since = "1.3.0")]
204562306a36Sopenharmony_ciimpl<T: Clone, A: Allocator + Clone> Clone for Box<[T], A> {
204662306a36Sopenharmony_ci    fn clone(&self) -> Self {
204762306a36Sopenharmony_ci        let alloc = Box::allocator(self).clone();
204862306a36Sopenharmony_ci        self.to_vec_in(alloc).into_boxed_slice()
204962306a36Sopenharmony_ci    }
205062306a36Sopenharmony_ci
205162306a36Sopenharmony_ci    fn clone_from(&mut self, other: &Self) {
205262306a36Sopenharmony_ci        if self.len() == other.len() {
205362306a36Sopenharmony_ci            self.clone_from_slice(&other);
205462306a36Sopenharmony_ci        } else {
205562306a36Sopenharmony_ci            *self = other.clone();
205662306a36Sopenharmony_ci        }
205762306a36Sopenharmony_ci    }
205862306a36Sopenharmony_ci}
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_ci#[stable(feature = "box_borrow", since = "1.1.0")]
206162306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> borrow::Borrow<T> for Box<T, A> {
206262306a36Sopenharmony_ci    fn borrow(&self) -> &T {
206362306a36Sopenharmony_ci        &**self
206462306a36Sopenharmony_ci    }
206562306a36Sopenharmony_ci}
206662306a36Sopenharmony_ci
206762306a36Sopenharmony_ci#[stable(feature = "box_borrow", since = "1.1.0")]
206862306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> borrow::BorrowMut<T> for Box<T, A> {
206962306a36Sopenharmony_ci    fn borrow_mut(&mut self) -> &mut T {
207062306a36Sopenharmony_ci        &mut **self
207162306a36Sopenharmony_ci    }
207262306a36Sopenharmony_ci}
207362306a36Sopenharmony_ci
207462306a36Sopenharmony_ci#[stable(since = "1.5.0", feature = "smart_ptr_as_ref")]
207562306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> AsRef<T> for Box<T, A> {
207662306a36Sopenharmony_ci    fn as_ref(&self) -> &T {
207762306a36Sopenharmony_ci        &**self
207862306a36Sopenharmony_ci    }
207962306a36Sopenharmony_ci}
208062306a36Sopenharmony_ci
208162306a36Sopenharmony_ci#[stable(since = "1.5.0", feature = "smart_ptr_as_ref")]
208262306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> AsMut<T> for Box<T, A> {
208362306a36Sopenharmony_ci    fn as_mut(&mut self) -> &mut T {
208462306a36Sopenharmony_ci        &mut **self
208562306a36Sopenharmony_ci    }
208662306a36Sopenharmony_ci}
208762306a36Sopenharmony_ci
208862306a36Sopenharmony_ci/* Nota bene
208962306a36Sopenharmony_ci *
209062306a36Sopenharmony_ci *  We could have chosen not to add this impl, and instead have written a
209162306a36Sopenharmony_ci *  function of Pin<Box<T>> to Pin<T>. Such a function would not be sound,
209262306a36Sopenharmony_ci *  because Box<T> implements Unpin even when T does not, as a result of
209362306a36Sopenharmony_ci *  this impl.
209462306a36Sopenharmony_ci *
209562306a36Sopenharmony_ci *  We chose this API instead of the alternative for a few reasons:
209662306a36Sopenharmony_ci *      - Logically, it is helpful to understand pinning in regard to the
209762306a36Sopenharmony_ci *        memory region being pointed to. For this reason none of the
209862306a36Sopenharmony_ci *        standard library pointer types support projecting through a pin
209962306a36Sopenharmony_ci *        (Box<T> is the only pointer type in std for which this would be
210062306a36Sopenharmony_ci *        safe.)
210162306a36Sopenharmony_ci *      - It is in practice very useful to have Box<T> be unconditionally
210262306a36Sopenharmony_ci *        Unpin because of trait objects, for which the structural auto
210362306a36Sopenharmony_ci *        trait functionality does not apply (e.g., Box<dyn Foo> would
210462306a36Sopenharmony_ci *        otherwise not be Unpin).
210562306a36Sopenharmony_ci *
210662306a36Sopenharmony_ci *  Another type with the same semantics as Box but only a conditional
210762306a36Sopenharmony_ci *  implementation of `Unpin` (where `T: Unpin`) would be valid/safe, and
210862306a36Sopenharmony_ci *  could have a method to project a Pin<T> from it.
210962306a36Sopenharmony_ci */
211062306a36Sopenharmony_ci#[stable(feature = "pin", since = "1.33.0")]
211162306a36Sopenharmony_ciimpl<T: ?Sized, A: Allocator> Unpin for Box<T, A> where A: 'static {}
211262306a36Sopenharmony_ci
211362306a36Sopenharmony_ci#[unstable(feature = "generator_trait", issue = "43122")]
211462306a36Sopenharmony_ciimpl<G: ?Sized + Generator<R> + Unpin, R, A: Allocator> Generator<R> for Box<G, A>
211562306a36Sopenharmony_ciwhere
211662306a36Sopenharmony_ci    A: 'static,
211762306a36Sopenharmony_ci{
211862306a36Sopenharmony_ci    type Yield = G::Yield;
211962306a36Sopenharmony_ci    type Return = G::Return;
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_ci    fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState<Self::Yield, Self::Return> {
212262306a36Sopenharmony_ci        G::resume(Pin::new(&mut *self), arg)
212362306a36Sopenharmony_ci    }
212462306a36Sopenharmony_ci}
212562306a36Sopenharmony_ci
212662306a36Sopenharmony_ci#[unstable(feature = "generator_trait", issue = "43122")]
212762306a36Sopenharmony_ciimpl<G: ?Sized + Generator<R>, R, A: Allocator> Generator<R> for Pin<Box<G, A>>
212862306a36Sopenharmony_ciwhere
212962306a36Sopenharmony_ci    A: 'static,
213062306a36Sopenharmony_ci{
213162306a36Sopenharmony_ci    type Yield = G::Yield;
213262306a36Sopenharmony_ci    type Return = G::Return;
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_ci    fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState<Self::Yield, Self::Return> {
213562306a36Sopenharmony_ci        G::resume((*self).as_mut(), arg)
213662306a36Sopenharmony_ci    }
213762306a36Sopenharmony_ci}
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci#[stable(feature = "futures_api", since = "1.36.0")]
214062306a36Sopenharmony_ciimpl<F: ?Sized + Future + Unpin, A: Allocator> Future for Box<F, A>
214162306a36Sopenharmony_ciwhere
214262306a36Sopenharmony_ci    A: 'static,
214362306a36Sopenharmony_ci{
214462306a36Sopenharmony_ci    type Output = F::Output;
214562306a36Sopenharmony_ci
214662306a36Sopenharmony_ci    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
214762306a36Sopenharmony_ci        F::poll(Pin::new(&mut *self), cx)
214862306a36Sopenharmony_ci    }
214962306a36Sopenharmony_ci}
215062306a36Sopenharmony_ci
215162306a36Sopenharmony_ci#[unstable(feature = "async_iterator", issue = "79024")]
215262306a36Sopenharmony_ciimpl<S: ?Sized + AsyncIterator + Unpin> AsyncIterator for Box<S> {
215362306a36Sopenharmony_ci    type Item = S::Item;
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
215662306a36Sopenharmony_ci        Pin::new(&mut **self).poll_next(cx)
215762306a36Sopenharmony_ci    }
215862306a36Sopenharmony_ci
215962306a36Sopenharmony_ci    fn size_hint(&self) -> (usize, Option<usize>) {
216062306a36Sopenharmony_ci        (**self).size_hint()
216162306a36Sopenharmony_ci    }
216262306a36Sopenharmony_ci}
216362306a36Sopenharmony_ci
216462306a36Sopenharmony_ciimpl dyn Error {
216562306a36Sopenharmony_ci    #[inline]
216662306a36Sopenharmony_ci    #[stable(feature = "error_downcast", since = "1.3.0")]
216762306a36Sopenharmony_ci    #[rustc_allow_incoherent_impl]
216862306a36Sopenharmony_ci    /// Attempts to downcast the box to a concrete type.
216962306a36Sopenharmony_ci    pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<dyn Error>> {
217062306a36Sopenharmony_ci        if self.is::<T>() {
217162306a36Sopenharmony_ci            unsafe {
217262306a36Sopenharmony_ci                let raw: *mut dyn Error = Box::into_raw(self);
217362306a36Sopenharmony_ci                Ok(Box::from_raw(raw as *mut T))
217462306a36Sopenharmony_ci            }
217562306a36Sopenharmony_ci        } else {
217662306a36Sopenharmony_ci            Err(self)
217762306a36Sopenharmony_ci        }
217862306a36Sopenharmony_ci    }
217962306a36Sopenharmony_ci}
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ciimpl dyn Error + Send {
218262306a36Sopenharmony_ci    #[inline]
218362306a36Sopenharmony_ci    #[stable(feature = "error_downcast", since = "1.3.0")]
218462306a36Sopenharmony_ci    #[rustc_allow_incoherent_impl]
218562306a36Sopenharmony_ci    /// Attempts to downcast the box to a concrete type.
218662306a36Sopenharmony_ci    pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<dyn Error + Send>> {
218762306a36Sopenharmony_ci        let err: Box<dyn Error> = self;
218862306a36Sopenharmony_ci        <dyn Error>::downcast(err).map_err(|s| unsafe {
218962306a36Sopenharmony_ci            // Reapply the `Send` marker.
219062306a36Sopenharmony_ci            Box::from_raw(Box::into_raw(s) as *mut (dyn Error + Send))
219162306a36Sopenharmony_ci        })
219262306a36Sopenharmony_ci    }
219362306a36Sopenharmony_ci}
219462306a36Sopenharmony_ci
219562306a36Sopenharmony_ciimpl dyn Error + Send + Sync {
219662306a36Sopenharmony_ci    #[inline]
219762306a36Sopenharmony_ci    #[stable(feature = "error_downcast", since = "1.3.0")]
219862306a36Sopenharmony_ci    #[rustc_allow_incoherent_impl]
219962306a36Sopenharmony_ci    /// Attempts to downcast the box to a concrete type.
220062306a36Sopenharmony_ci    pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<Self>> {
220162306a36Sopenharmony_ci        let err: Box<dyn Error> = self;
220262306a36Sopenharmony_ci        <dyn Error>::downcast(err).map_err(|s| unsafe {
220362306a36Sopenharmony_ci            // Reapply the `Send + Sync` marker.
220462306a36Sopenharmony_ci            Box::from_raw(Box::into_raw(s) as *mut (dyn Error + Send + Sync))
220562306a36Sopenharmony_ci        })
220662306a36Sopenharmony_ci    }
220762306a36Sopenharmony_ci}
220862306a36Sopenharmony_ci
220962306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
221062306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
221162306a36Sopenharmony_ciimpl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a> {
221262306a36Sopenharmony_ci    /// Converts a type of [`Error`] into a box of dyn [`Error`].
221362306a36Sopenharmony_ci    ///
221462306a36Sopenharmony_ci    /// # Examples
221562306a36Sopenharmony_ci    ///
221662306a36Sopenharmony_ci    /// ```
221762306a36Sopenharmony_ci    /// use std::error::Error;
221862306a36Sopenharmony_ci    /// use std::fmt;
221962306a36Sopenharmony_ci    /// use std::mem;
222062306a36Sopenharmony_ci    ///
222162306a36Sopenharmony_ci    /// #[derive(Debug)]
222262306a36Sopenharmony_ci    /// struct AnError;
222362306a36Sopenharmony_ci    ///
222462306a36Sopenharmony_ci    /// impl fmt::Display for AnError {
222562306a36Sopenharmony_ci    ///     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
222662306a36Sopenharmony_ci    ///         write!(f, "An error")
222762306a36Sopenharmony_ci    ///     }
222862306a36Sopenharmony_ci    /// }
222962306a36Sopenharmony_ci    ///
223062306a36Sopenharmony_ci    /// impl Error for AnError {}
223162306a36Sopenharmony_ci    ///
223262306a36Sopenharmony_ci    /// let an_error = AnError;
223362306a36Sopenharmony_ci    /// assert!(0 == mem::size_of_val(&an_error));
223462306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error>::from(an_error);
223562306a36Sopenharmony_ci    /// assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
223662306a36Sopenharmony_ci    /// ```
223762306a36Sopenharmony_ci    fn from(err: E) -> Box<dyn Error + 'a> {
223862306a36Sopenharmony_ci        Box::new(err)
223962306a36Sopenharmony_ci    }
224062306a36Sopenharmony_ci}
224162306a36Sopenharmony_ci
224262306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
224362306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
224462306a36Sopenharmony_ciimpl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a> {
224562306a36Sopenharmony_ci    /// Converts a type of [`Error`] + [`Send`] + [`Sync`] into a box of
224662306a36Sopenharmony_ci    /// dyn [`Error`] + [`Send`] + [`Sync`].
224762306a36Sopenharmony_ci    ///
224862306a36Sopenharmony_ci    /// # Examples
224962306a36Sopenharmony_ci    ///
225062306a36Sopenharmony_ci    /// ```
225162306a36Sopenharmony_ci    /// use std::error::Error;
225262306a36Sopenharmony_ci    /// use std::fmt;
225362306a36Sopenharmony_ci    /// use std::mem;
225462306a36Sopenharmony_ci    ///
225562306a36Sopenharmony_ci    /// #[derive(Debug)]
225662306a36Sopenharmony_ci    /// struct AnError;
225762306a36Sopenharmony_ci    ///
225862306a36Sopenharmony_ci    /// impl fmt::Display for AnError {
225962306a36Sopenharmony_ci    ///     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
226062306a36Sopenharmony_ci    ///         write!(f, "An error")
226162306a36Sopenharmony_ci    ///     }
226262306a36Sopenharmony_ci    /// }
226362306a36Sopenharmony_ci    ///
226462306a36Sopenharmony_ci    /// impl Error for AnError {}
226562306a36Sopenharmony_ci    ///
226662306a36Sopenharmony_ci    /// unsafe impl Send for AnError {}
226762306a36Sopenharmony_ci    ///
226862306a36Sopenharmony_ci    /// unsafe impl Sync for AnError {}
226962306a36Sopenharmony_ci    ///
227062306a36Sopenharmony_ci    /// let an_error = AnError;
227162306a36Sopenharmony_ci    /// assert!(0 == mem::size_of_val(&an_error));
227262306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error + Send + Sync>::from(an_error);
227362306a36Sopenharmony_ci    /// assert!(
227462306a36Sopenharmony_ci    ///     mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
227562306a36Sopenharmony_ci    /// ```
227662306a36Sopenharmony_ci    fn from(err: E) -> Box<dyn Error + Send + Sync + 'a> {
227762306a36Sopenharmony_ci        Box::new(err)
227862306a36Sopenharmony_ci    }
227962306a36Sopenharmony_ci}
228062306a36Sopenharmony_ci
228162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
228262306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
228362306a36Sopenharmony_ciimpl From<String> for Box<dyn Error + Send + Sync> {
228462306a36Sopenharmony_ci    /// Converts a [`String`] into a box of dyn [`Error`] + [`Send`] + [`Sync`].
228562306a36Sopenharmony_ci    ///
228662306a36Sopenharmony_ci    /// # Examples
228762306a36Sopenharmony_ci    ///
228862306a36Sopenharmony_ci    /// ```
228962306a36Sopenharmony_ci    /// use std::error::Error;
229062306a36Sopenharmony_ci    /// use std::mem;
229162306a36Sopenharmony_ci    ///
229262306a36Sopenharmony_ci    /// let a_string_error = "a string error".to_string();
229362306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_string_error);
229462306a36Sopenharmony_ci    /// assert!(
229562306a36Sopenharmony_ci    ///     mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
229662306a36Sopenharmony_ci    /// ```
229762306a36Sopenharmony_ci    #[inline]
229862306a36Sopenharmony_ci    fn from(err: String) -> Box<dyn Error + Send + Sync> {
229962306a36Sopenharmony_ci        struct StringError(String);
230062306a36Sopenharmony_ci
230162306a36Sopenharmony_ci        impl Error for StringError {
230262306a36Sopenharmony_ci            #[allow(deprecated)]
230362306a36Sopenharmony_ci            fn description(&self) -> &str {
230462306a36Sopenharmony_ci                &self.0
230562306a36Sopenharmony_ci            }
230662306a36Sopenharmony_ci        }
230762306a36Sopenharmony_ci
230862306a36Sopenharmony_ci        impl fmt::Display for StringError {
230962306a36Sopenharmony_ci            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
231062306a36Sopenharmony_ci                fmt::Display::fmt(&self.0, f)
231162306a36Sopenharmony_ci            }
231262306a36Sopenharmony_ci        }
231362306a36Sopenharmony_ci
231462306a36Sopenharmony_ci        // Purposefully skip printing "StringError(..)"
231562306a36Sopenharmony_ci        impl fmt::Debug for StringError {
231662306a36Sopenharmony_ci            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
231762306a36Sopenharmony_ci                fmt::Debug::fmt(&self.0, f)
231862306a36Sopenharmony_ci            }
231962306a36Sopenharmony_ci        }
232062306a36Sopenharmony_ci
232162306a36Sopenharmony_ci        Box::new(StringError(err))
232262306a36Sopenharmony_ci    }
232362306a36Sopenharmony_ci}
232462306a36Sopenharmony_ci
232562306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
232662306a36Sopenharmony_ci#[stable(feature = "string_box_error", since = "1.6.0")]
232762306a36Sopenharmony_ciimpl From<String> for Box<dyn Error> {
232862306a36Sopenharmony_ci    /// Converts a [`String`] into a box of dyn [`Error`].
232962306a36Sopenharmony_ci    ///
233062306a36Sopenharmony_ci    /// # Examples
233162306a36Sopenharmony_ci    ///
233262306a36Sopenharmony_ci    /// ```
233362306a36Sopenharmony_ci    /// use std::error::Error;
233462306a36Sopenharmony_ci    /// use std::mem;
233562306a36Sopenharmony_ci    ///
233662306a36Sopenharmony_ci    /// let a_string_error = "a string error".to_string();
233762306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error>::from(a_string_error);
233862306a36Sopenharmony_ci    /// assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
233962306a36Sopenharmony_ci    /// ```
234062306a36Sopenharmony_ci    fn from(str_err: String) -> Box<dyn Error> {
234162306a36Sopenharmony_ci        let err1: Box<dyn Error + Send + Sync> = From::from(str_err);
234262306a36Sopenharmony_ci        let err2: Box<dyn Error> = err1;
234362306a36Sopenharmony_ci        err2
234462306a36Sopenharmony_ci    }
234562306a36Sopenharmony_ci}
234662306a36Sopenharmony_ci
234762306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
234862306a36Sopenharmony_ci#[stable(feature = "rust1", since = "1.0.0")]
234962306a36Sopenharmony_ciimpl<'a> From<&str> for Box<dyn Error + Send + Sync + 'a> {
235062306a36Sopenharmony_ci    /// Converts a [`str`] into a box of dyn [`Error`] + [`Send`] + [`Sync`].
235162306a36Sopenharmony_ci    ///
235262306a36Sopenharmony_ci    /// [`str`]: prim@str
235362306a36Sopenharmony_ci    ///
235462306a36Sopenharmony_ci    /// # Examples
235562306a36Sopenharmony_ci    ///
235662306a36Sopenharmony_ci    /// ```
235762306a36Sopenharmony_ci    /// use std::error::Error;
235862306a36Sopenharmony_ci    /// use std::mem;
235962306a36Sopenharmony_ci    ///
236062306a36Sopenharmony_ci    /// let a_str_error = "a str error";
236162306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_str_error);
236262306a36Sopenharmony_ci    /// assert!(
236362306a36Sopenharmony_ci    ///     mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
236462306a36Sopenharmony_ci    /// ```
236562306a36Sopenharmony_ci    #[inline]
236662306a36Sopenharmony_ci    fn from(err: &str) -> Box<dyn Error + Send + Sync + 'a> {
236762306a36Sopenharmony_ci        From::from(String::from(err))
236862306a36Sopenharmony_ci    }
236962306a36Sopenharmony_ci}
237062306a36Sopenharmony_ci
237162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
237262306a36Sopenharmony_ci#[stable(feature = "string_box_error", since = "1.6.0")]
237362306a36Sopenharmony_ciimpl From<&str> for Box<dyn Error> {
237462306a36Sopenharmony_ci    /// Converts a [`str`] into a box of dyn [`Error`].
237562306a36Sopenharmony_ci    ///
237662306a36Sopenharmony_ci    /// [`str`]: prim@str
237762306a36Sopenharmony_ci    ///
237862306a36Sopenharmony_ci    /// # Examples
237962306a36Sopenharmony_ci    ///
238062306a36Sopenharmony_ci    /// ```
238162306a36Sopenharmony_ci    /// use std::error::Error;
238262306a36Sopenharmony_ci    /// use std::mem;
238362306a36Sopenharmony_ci    ///
238462306a36Sopenharmony_ci    /// let a_str_error = "a str error";
238562306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error>::from(a_str_error);
238662306a36Sopenharmony_ci    /// assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
238762306a36Sopenharmony_ci    /// ```
238862306a36Sopenharmony_ci    fn from(err: &str) -> Box<dyn Error> {
238962306a36Sopenharmony_ci        From::from(String::from(err))
239062306a36Sopenharmony_ci    }
239162306a36Sopenharmony_ci}
239262306a36Sopenharmony_ci
239362306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
239462306a36Sopenharmony_ci#[stable(feature = "cow_box_error", since = "1.22.0")]
239562306a36Sopenharmony_ciimpl<'a, 'b> From<Cow<'b, str>> for Box<dyn Error + Send + Sync + 'a> {
239662306a36Sopenharmony_ci    /// Converts a [`Cow`] into a box of dyn [`Error`] + [`Send`] + [`Sync`].
239762306a36Sopenharmony_ci    ///
239862306a36Sopenharmony_ci    /// # Examples
239962306a36Sopenharmony_ci    ///
240062306a36Sopenharmony_ci    /// ```
240162306a36Sopenharmony_ci    /// use std::error::Error;
240262306a36Sopenharmony_ci    /// use std::mem;
240362306a36Sopenharmony_ci    /// use std::borrow::Cow;
240462306a36Sopenharmony_ci    ///
240562306a36Sopenharmony_ci    /// let a_cow_str_error = Cow::from("a str error");
240662306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_cow_str_error);
240762306a36Sopenharmony_ci    /// assert!(
240862306a36Sopenharmony_ci    ///     mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
240962306a36Sopenharmony_ci    /// ```
241062306a36Sopenharmony_ci    fn from(err: Cow<'b, str>) -> Box<dyn Error + Send + Sync + 'a> {
241162306a36Sopenharmony_ci        From::from(String::from(err))
241262306a36Sopenharmony_ci    }
241362306a36Sopenharmony_ci}
241462306a36Sopenharmony_ci
241562306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
241662306a36Sopenharmony_ci#[stable(feature = "cow_box_error", since = "1.22.0")]
241762306a36Sopenharmony_ciimpl<'a> From<Cow<'a, str>> for Box<dyn Error> {
241862306a36Sopenharmony_ci    /// Converts a [`Cow`] into a box of dyn [`Error`].
241962306a36Sopenharmony_ci    ///
242062306a36Sopenharmony_ci    /// # Examples
242162306a36Sopenharmony_ci    ///
242262306a36Sopenharmony_ci    /// ```
242362306a36Sopenharmony_ci    /// use std::error::Error;
242462306a36Sopenharmony_ci    /// use std::mem;
242562306a36Sopenharmony_ci    /// use std::borrow::Cow;
242662306a36Sopenharmony_ci    ///
242762306a36Sopenharmony_ci    /// let a_cow_str_error = Cow::from("a str error");
242862306a36Sopenharmony_ci    /// let a_boxed_error = Box::<dyn Error>::from(a_cow_str_error);
242962306a36Sopenharmony_ci    /// assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
243062306a36Sopenharmony_ci    /// ```
243162306a36Sopenharmony_ci    fn from(err: Cow<'a, str>) -> Box<dyn Error> {
243262306a36Sopenharmony_ci        From::from(String::from(err))
243362306a36Sopenharmony_ci    }
243462306a36Sopenharmony_ci}
243562306a36Sopenharmony_ci
243662306a36Sopenharmony_ci#[stable(feature = "box_error", since = "1.8.0")]
243762306a36Sopenharmony_ciimpl<T: core::error::Error> core::error::Error for Box<T> {
243862306a36Sopenharmony_ci    #[allow(deprecated, deprecated_in_future)]
243962306a36Sopenharmony_ci    fn description(&self) -> &str {
244062306a36Sopenharmony_ci        core::error::Error::description(&**self)
244162306a36Sopenharmony_ci    }
244262306a36Sopenharmony_ci
244362306a36Sopenharmony_ci    #[allow(deprecated)]
244462306a36Sopenharmony_ci    fn cause(&self) -> Option<&dyn core::error::Error> {
244562306a36Sopenharmony_ci        core::error::Error::cause(&**self)
244662306a36Sopenharmony_ci    }
244762306a36Sopenharmony_ci
244862306a36Sopenharmony_ci    fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
244962306a36Sopenharmony_ci        core::error::Error::source(&**self)
245062306a36Sopenharmony_ci    }
245162306a36Sopenharmony_ci}
2452