diff options
| author | Guillaume Boisseau <Nadrieril@users.noreply.github.com> | 2024-03-09 21:40:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-09 21:40:06 +0100 |
| commit | e3c0158788dffbd62c3e7f69ac61e5f03ad614c6 (patch) | |
| tree | 49764503764d108892743736e6d95108a39b0989 /library/alloc/src/string.rs | |
| parent | 5b6d30a4a9cff36380504716c992c4f5847c4342 (diff) | |
| parent | 784e6a1e080e5ba18e5c246e744e2d20525d1c3d (diff) | |
| download | rust-e3c0158788dffbd62c3e7f69ac61e5f03ad614c6.tar.gz rust-e3c0158788dffbd62c3e7f69ac61e5f03ad614c6.zip | |
Rollup merge of #120504 - kornelski:try_with_capacity, r=Amanieu
Vec::try_with_capacity Related to #91913 Implements try_with_capacity for `Vec`, `VecDeque`, and `String`. I can follow it up with more collections if desired. `Vec::try_with_capacity()` is functionally equivalent to the current stable: ```rust let mut v = Vec::new(); v.try_reserve_exact(n)? ``` However, `try_reserve` calls non-inlined `finish_grow`, which requires old and new `Layout`, and is designed to reallocate memory. There is benefit to using `try_with_capacity`, besides syntax convenience, because it generates much smaller code at the call site with a direct call to the allocator. There's codegen test included. It's also a very desirable functionality for users of `no_global_oom_handling` (Rust-for-Linux), since it makes a very commonly used function available in that environment (`with_capacity` is used much more frequently than all `(try_)reserve(_exact)`).
Diffstat (limited to 'library/alloc/src/string.rs')
| -rw-r--r-- | library/alloc/src/string.rs | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 98ded7f6cdf..c4dcff1b1c4 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -492,6 +492,19 @@ impl String { String { vec: Vec::with_capacity(capacity) } } + /// Creates a new empty `String` with at least the specified capacity. + /// + /// # Errors + /// + /// Returns [`Err`] if the capacity exceeds `isize::MAX` bytes, + /// or if the memory allocator reports failure. + /// + #[inline] + #[unstable(feature = "try_with_capacity", issue = "91913")] + pub fn try_with_capacity(capacity: usize) -> Result<String, TryReserveError> { + Ok(String { vec: Vec::try_with_capacity(capacity)? }) + } + // HACK(japaric): with cfg(test) the inherent `[T]::to_vec` method, which is // required for this method definition, is not available. Since we don't // require this method for testing purposes, I'll just stub it |
