summaryrefslogtreecommitdiff
path: root/vendor/arrayvec/src/array_string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/arrayvec/src/array_string.rs')
-rw-r--r--vendor/arrayvec/src/array_string.rs582
1 files changed, 0 insertions, 582 deletions
diff --git a/vendor/arrayvec/src/array_string.rs b/vendor/arrayvec/src/array_string.rs
deleted file mode 100644
index 1aae59ea..00000000
--- a/vendor/arrayvec/src/array_string.rs
+++ /dev/null
@@ -1,582 +0,0 @@
-use std::borrow::Borrow;
-use std::cmp;
-use std::fmt;
-use std::hash::{Hash, Hasher};
-use std::ptr;
-use std::ops::{Deref, DerefMut};
-use std::str;
-use std::str::FromStr;
-use std::str::Utf8Error;
-use std::slice;
-
-use crate::array::Array;
-use crate::array::Index;
-use crate::CapacityError;
-use crate::char::encode_utf8;
-
-#[cfg(feature="serde")]
-use serde::{Serialize, Deserialize, Serializer, Deserializer};
-
-use super::MaybeUninit as MaybeUninitCopy;
-
-/// A string with a fixed capacity.
-///
-/// The `ArrayString` is a string backed by a fixed size array. It keeps track
-/// of its length.
-///
-/// The string is a contiguous value that you can store directly on the stack
-/// if needed.
-#[derive(Copy)]
-pub struct ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- xs: MaybeUninitCopy<A>,
- len: A::Index,
-}
-
-impl<A> Default for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- /// Return an empty `ArrayString`
- fn default() -> ArrayString<A> {
- ArrayString::new()
- }
-}
-
-impl<A> ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- /// Create a new empty `ArrayString`.
- ///
- /// Capacity is inferred from the type parameter.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 16]>::new();
- /// string.push_str("foo");
- /// assert_eq!(&string[..], "foo");
- /// assert_eq!(string.capacity(), 16);
- /// ```
- #[cfg(not(feature="unstable-const-fn"))]
- pub fn new() -> ArrayString<A> {
- unsafe {
- ArrayString {
- xs: MaybeUninitCopy::uninitialized(),
- len: Index::ZERO,
- }
- }
- }
-
- #[cfg(feature="unstable-const-fn")]
- pub const fn new() -> ArrayString<A> {
- unsafe {
- ArrayString {
- xs: MaybeUninitCopy::uninitialized(),
- len: Index::ZERO,
- }
- }
- }
-
- /// Return the length of the string.
- #[inline]
- pub fn len(&self) -> usize { self.len.to_usize() }
-
- /// Returns whether the string is empty.
- #[inline]
- pub fn is_empty(&self) -> bool { self.len() == 0 }
-
- /// Create a new `ArrayString` from a `str`.
- ///
- /// Capacity is inferred from the type parameter.
- ///
- /// **Errors** if the backing array is not large enough to fit the string.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 3]>::from("foo").unwrap();
- /// assert_eq!(&string[..], "foo");
- /// assert_eq!(string.len(), 3);
- /// assert_eq!(string.capacity(), 3);
- /// ```
- pub fn from(s: &str) -> Result<Self, CapacityError<&str>> {
- let mut arraystr = Self::new();
- arraystr.try_push_str(s)?;
- Ok(arraystr)
- }
-
- /// Create a new `ArrayString` from a byte string literal.
- ///
- /// **Errors** if the byte string literal is not valid UTF-8.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let string = ArrayString::from_byte_string(b"hello world").unwrap();
- /// ```
- pub fn from_byte_string(b: &A) -> Result<Self, Utf8Error> {
- let len = str::from_utf8(b.as_slice())?.len();
- debug_assert_eq!(len, A::CAPACITY);
- Ok(ArrayString {
- xs: MaybeUninitCopy::from(*b),
- len: Index::from(A::CAPACITY),
- })
- }
-
- /// Return the capacity of the `ArrayString`.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let string = ArrayString::<[_; 3]>::new();
- /// assert_eq!(string.capacity(), 3);
- /// ```
- #[inline(always)]
- pub fn capacity(&self) -> usize { A::CAPACITY }
-
- /// Return if the `ArrayString` is completely filled.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 1]>::new();
- /// assert!(!string.is_full());
- /// string.push_str("A");
- /// assert!(string.is_full());
- /// ```
- pub fn is_full(&self) -> bool { self.len() == self.capacity() }
-
- /// Adds the given char to the end of the string.
- ///
- /// ***Panics*** if the backing array is not large enough to fit the additional char.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 2]>::new();
- ///
- /// string.push('a');
- /// string.push('b');
- ///
- /// assert_eq!(&string[..], "ab");
- /// ```
- pub fn push(&mut self, c: char) {
- self.try_push(c).unwrap();
- }
-
- /// Adds the given char to the end of the string.
- ///
- /// Returns `Ok` if the push succeeds.
- ///
- /// **Errors** if the backing array is not large enough to fit the additional char.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 2]>::new();
- ///
- /// string.try_push('a').unwrap();
- /// string.try_push('b').unwrap();
- /// let overflow = string.try_push('c');
- ///
- /// assert_eq!(&string[..], "ab");
- /// assert_eq!(overflow.unwrap_err().element(), 'c');
- /// ```
- pub fn try_push(&mut self, c: char) -> Result<(), CapacityError<char>> {
- let len = self.len();
- unsafe {
- let ptr = self.xs.ptr_mut().add(len);
- let remaining_cap = self.capacity() - len;
- match encode_utf8(c, ptr, remaining_cap) {
- Ok(n) => {
- self.set_len(len + n);
- Ok(())
- }
- Err(_) => Err(CapacityError::new(c)),
- }
- }
- }
-
- /// Adds the given string slice to the end of the string.
- ///
- /// ***Panics*** if the backing array is not large enough to fit the string.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 2]>::new();
- ///
- /// string.push_str("a");
- /// string.push_str("d");
- ///
- /// assert_eq!(&string[..], "ad");
- /// ```
- pub fn push_str(&mut self, s: &str) {
- self.try_push_str(s).unwrap()
- }
-
- /// Adds the given string slice to the end of the string.
- ///
- /// Returns `Ok` if the push succeeds.
- ///
- /// **Errors** if the backing array is not large enough to fit the string.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 2]>::new();
- ///
- /// string.try_push_str("a").unwrap();
- /// let overflow1 = string.try_push_str("bc");
- /// string.try_push_str("d").unwrap();
- /// let overflow2 = string.try_push_str("ef");
- ///
- /// assert_eq!(&string[..], "ad");
- /// assert_eq!(overflow1.unwrap_err().element(), "bc");
- /// assert_eq!(overflow2.unwrap_err().element(), "ef");
- /// ```
- pub fn try_push_str<'a>(&mut self, s: &'a str) -> Result<(), CapacityError<&'a str>> {
- if s.len() > self.capacity() - self.len() {
- return Err(CapacityError::new(s));
- }
- unsafe {
- let dst = self.xs.ptr_mut().add(self.len());
- let src = s.as_ptr();
- ptr::copy_nonoverlapping(src, dst, s.len());
- let newl = self.len() + s.len();
- self.set_len(newl);
- }
- Ok(())
- }
-
- /// Removes the last character from the string and returns it.
- ///
- /// Returns `None` if this `ArrayString` is empty.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut s = ArrayString::<[_; 3]>::from("foo").unwrap();
- ///
- /// assert_eq!(s.pop(), Some('o'));
- /// assert_eq!(s.pop(), Some('o'));
- /// assert_eq!(s.pop(), Some('f'));
- ///
- /// assert_eq!(s.pop(), None);
- /// ```
- pub fn pop(&mut self) -> Option<char> {
- let ch = match self.chars().rev().next() {
- Some(ch) => ch,
- None => return None,
- };
- let new_len = self.len() - ch.len_utf8();
- unsafe {
- self.set_len(new_len);
- }
- Some(ch)
- }
-
- /// Shortens this `ArrayString` to the specified length.
- ///
- /// If `new_len` is greater than the string’s current length, this has no
- /// effect.
- ///
- /// ***Panics*** if `new_len` does not lie on a `char` boundary.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut string = ArrayString::<[_; 6]>::from("foobar").unwrap();
- /// string.truncate(3);
- /// assert_eq!(&string[..], "foo");
- /// string.truncate(4);
- /// assert_eq!(&string[..], "foo");
- /// ```
- pub fn truncate(&mut self, new_len: usize) {
- if new_len <= self.len() {
- assert!(self.is_char_boundary(new_len));
- unsafe {
- // In libstd truncate is called on the underlying vector,
- // which in turns drops each element.
- // As we know we don't have to worry about Drop,
- // we can just set the length (a la clear.)
- self.set_len(new_len);
- }
- }
- }
-
- /// Removes a `char` from this `ArrayString` at a byte position and returns it.
- ///
- /// This is an `O(n)` operation, as it requires copying every element in the
- /// array.
- ///
- /// ***Panics*** if `idx` is larger than or equal to the `ArrayString`’s length,
- /// or if it does not lie on a `char` boundary.
- ///
- /// ```
- /// use arrayvec::ArrayString;
- ///
- /// let mut s = ArrayString::<[_; 3]>::from("foo").unwrap();
- ///
- /// assert_eq!(s.remove(0), 'f');
- /// assert_eq!(s.remove(1), 'o');
- /// assert_eq!(s.remove(0), 'o');
- /// ```
- pub fn remove(&mut self, idx: usize) -> char {
- let ch = match self[idx..].chars().next() {
- Some(ch) => ch,
- None => panic!("cannot remove a char from the end of a string"),
- };
-
- let next = idx + ch.len_utf8();
- let len = self.len();
- unsafe {
- ptr::copy(self.xs.ptr().add(next),
- self.xs.ptr_mut().add(idx),
- len - next);
- self.set_len(len - (next - idx));
- }
- ch
- }
-
- /// Make the string empty.
- pub fn clear(&mut self) {
- unsafe {
- self.set_len(0);
- }
- }
-
- /// Set the strings’s length.
- ///
- /// This function is `unsafe` because it changes the notion of the
- /// number of “valid” bytes in the string. Use with care.
- ///
- /// This method uses *debug assertions* to check the validity of `length`
- /// and may use other debug assertions.
- pub unsafe fn set_len(&mut self, length: usize) {
- debug_assert!(length <= self.capacity());
- self.len = Index::from(length);
- }
-
- /// Return a string slice of the whole `ArrayString`.
- pub fn as_str(&self) -> &str {
- self
- }
-}
-
-impl<A> Deref for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- type Target = str;
- #[inline]
- fn deref(&self) -> &str {
- unsafe {
- let sl = slice::from_raw_parts(self.xs.ptr(), self.len.to_usize());
- str::from_utf8_unchecked(sl)
- }
- }
-}
-
-impl<A> DerefMut for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- #[inline]
- fn deref_mut(&mut self) -> &mut str {
- unsafe {
- let sl = slice::from_raw_parts_mut(self.xs.ptr_mut(), self.len.to_usize());
- str::from_utf8_unchecked_mut(sl)
- }
- }
-}
-
-impl<A> PartialEq for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn eq(&self, rhs: &Self) -> bool {
- **self == **rhs
- }
-}
-
-impl<A> PartialEq<str> for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn eq(&self, rhs: &str) -> bool {
- &**self == rhs
- }
-}
-
-impl<A> PartialEq<ArrayString<A>> for str
- where A: Array<Item=u8> + Copy
-{
- fn eq(&self, rhs: &ArrayString<A>) -> bool {
- self == &**rhs
- }
-}
-
-impl<A> Eq for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{ }
-
-impl<A> Hash for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn hash<H: Hasher>(&self, h: &mut H) {
- (**self).hash(h)
- }
-}
-
-impl<A> Borrow<str> for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn borrow(&self) -> &str { self }
-}
-
-impl<A> AsRef<str> for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn as_ref(&self) -> &str { self }
-}
-
-impl<A> fmt::Debug for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { (**self).fmt(f) }
-}
-
-impl<A> fmt::Display for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { (**self).fmt(f) }
-}
-
-/// `Write` appends written data to the end of the string.
-impl<A> fmt::Write for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn write_char(&mut self, c: char) -> fmt::Result {
- self.try_push(c).map_err(|_| fmt::Error)
- }
-
- fn write_str(&mut self, s: &str) -> fmt::Result {
- self.try_push_str(s).map_err(|_| fmt::Error)
- }
-}
-
-impl<A> Clone for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn clone(&self) -> ArrayString<A> {
- *self
- }
- fn clone_from(&mut self, rhs: &Self) {
- // guaranteed to fit due to types matching.
- self.clear();
- self.try_push_str(rhs).ok();
- }
-}
-
-impl<A> PartialOrd for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn partial_cmp(&self, rhs: &Self) -> Option<cmp::Ordering> {
- (**self).partial_cmp(&**rhs)
- }
- fn lt(&self, rhs: &Self) -> bool { **self < **rhs }
- fn le(&self, rhs: &Self) -> bool { **self <= **rhs }
- fn gt(&self, rhs: &Self) -> bool { **self > **rhs }
- fn ge(&self, rhs: &Self) -> bool { **self >= **rhs }
-}
-
-impl<A> PartialOrd<str> for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn partial_cmp(&self, rhs: &str) -> Option<cmp::Ordering> {
- (**self).partial_cmp(rhs)
- }
- fn lt(&self, rhs: &str) -> bool { &**self < rhs }
- fn le(&self, rhs: &str) -> bool { &**self <= rhs }
- fn gt(&self, rhs: &str) -> bool { &**self > rhs }
- fn ge(&self, rhs: &str) -> bool { &**self >= rhs }
-}
-
-impl<A> PartialOrd<ArrayString<A>> for str
- where A: Array<Item=u8> + Copy
-{
- fn partial_cmp(&self, rhs: &ArrayString<A>) -> Option<cmp::Ordering> {
- self.partial_cmp(&**rhs)
- }
- fn lt(&self, rhs: &ArrayString<A>) -> bool { self < &**rhs }
- fn le(&self, rhs: &ArrayString<A>) -> bool { self <= &**rhs }
- fn gt(&self, rhs: &ArrayString<A>) -> bool { self > &**rhs }
- fn ge(&self, rhs: &ArrayString<A>) -> bool { self >= &**rhs }
-}
-
-impl<A> Ord for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn cmp(&self, rhs: &Self) -> cmp::Ordering {
- (**self).cmp(&**rhs)
- }
-}
-
-impl<A> FromStr for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- type Err = CapacityError;
-
- fn from_str(s: &str) -> Result<Self, Self::Err> {
- Self::from(s).map_err(CapacityError::simplify)
- }
-}
-
-#[cfg(feature="serde")]
-/// Requires crate feature `"serde"`
-impl<A> Serialize for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where S: Serializer
- {
- serializer.serialize_str(&*self)
- }
-}
-
-#[cfg(feature="serde")]
-/// Requires crate feature `"serde"`
-impl<'de, A> Deserialize<'de> for ArrayString<A>
- where A: Array<Item=u8> + Copy
-{
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
- where D: Deserializer<'de>
- {
- use serde::de::{self, Visitor};
- use std::marker::PhantomData;
-
- struct ArrayStringVisitor<A: Array<Item=u8>>(PhantomData<A>);
-
- impl<'de, A: Copy + Array<Item=u8>> Visitor<'de> for ArrayStringVisitor<A> {
- type Value = ArrayString<A>;
-
- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- write!(formatter, "a string no more than {} bytes long", A::CAPACITY)
- }
-
- fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
- where E: de::Error,
- {
- ArrayString::from(v).map_err(|_| E::invalid_length(v.len(), &self))
- }
-
- fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
- where E: de::Error,
- {
- let s = str::from_utf8(v).map_err(|_| E::invalid_value(de::Unexpected::Bytes(v), &self))?;
-
- ArrayString::from(s).map_err(|_| E::invalid_length(s.len(), &self))
- }
- }
-
- deserializer.deserialize_str(ArrayStringVisitor::<A>(PhantomData))
- }
-}