strings: CappedString to FixedString conversion methods
This patch adds `CappedString::into_fixed` and `CappedString::into_fixed_max_capacity` to allow for checked conversions from `CappedString` to `FixedString`.
This commit is contained in:
1 parent
96daa5ca00
commit
7253d95010
1 file changed
+28
@@ -20,6 +20,8 @@ use alloc::{
|
|||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
|
use super::fixed::{FixedString, LengthError};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct CapacityError;
|
pub struct CapacityError;
|
||||||
|
|
||||||
@@ -45,7 +47,11 @@ impl std::error::Error for CapacityError {}
|
|||||||
/// ```
|
/// ```
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct CappedString<const N: usize> {
|
pub struct CappedString<const N: usize> {
|
||||||
|
/// The buffer storing the string data. It is an invariant of this type that the first `len`
|
||||||
|
/// elements of this buffer is initialised, valid UTF-8 string data.
|
||||||
buf: [MaybeUninit<u8>; N],
|
buf: [MaybeUninit<u8>; N],
|
||||||
|
|
||||||
|
/// The length of the string stored in `buf`.
|
||||||
len: u8,
|
len: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,6 +76,10 @@ impl<const N: usize> CappedString<N> {
|
|||||||
Self { buf, len }
|
Self { buf, len }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the raw buffer and length backing this `CappedString`; the first element of the
|
||||||
|
/// tuple is the buffer `buf` and the second is the length `len`. The first `len` elements of
|
||||||
|
/// `buf` (i.e. `&buf[..usize::from(len)]`) is guaranteed to be initialised, valid UTF-8 string
|
||||||
|
/// data.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub const fn into_raw_parts(self) -> ([MaybeUninit<u8>; N], u8) {
|
pub const fn into_raw_parts(self) -> ([MaybeUninit<u8>; N], u8) {
|
||||||
@@ -476,6 +486,24 @@ impl<const N: usize> CappedString<N> {
|
|||||||
pub fn is_empty(&self) -> bool {
|
pub fn is_empty(&self) -> bool {
|
||||||
self.len == 0
|
self.len == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn into_fixed<const M: usize>(self) -> Result<FixedString<M>, LengthError> {
|
||||||
|
let buf: [u8; M] = self
|
||||||
|
.as_bytes()
|
||||||
|
.try_into()
|
||||||
|
.map_err(|_| LengthError)?;
|
||||||
|
|
||||||
|
// SAFETY:
|
||||||
|
// It is an invariant of `CappedString` that the first `self.len` bytes of `self.buf` is
|
||||||
|
// valid UTF-8, so the bytes returned by `Self::as_bytes` are valid UTF-8.
|
||||||
|
unsafe { Ok(FixedString::from_raw_array(buf)) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn into_fixed_max_capacity(self) -> Result<FixedString<N>, LengthError> {
|
||||||
|
self.into_fixed()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
|
|||||||
Reference in new issue
Block a user