summaryrefslogtreecommitdiffstats
path: root/vendor/bstr/src/impls.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/bstr/src/impls.rs')
-rw-r--r--vendor/bstr/src/impls.rs987
1 files changed, 0 insertions, 987 deletions
diff --git a/vendor/bstr/src/impls.rs b/vendor/bstr/src/impls.rs
deleted file mode 100644
index 85a27ba77..000000000
--- a/vendor/bstr/src/impls.rs
+++ /dev/null
@@ -1,987 +0,0 @@
-macro_rules! impl_partial_eq {
- ($lhs:ty, $rhs:ty) => {
- impl<'a, 'b> PartialEq<$rhs> for $lhs {
- #[inline]
- fn eq(&self, other: &$rhs) -> bool {
- let other: &[u8] = other.as_ref();
- PartialEq::eq(self.as_bytes(), other)
- }
- }
-
- impl<'a, 'b> PartialEq<$lhs> for $rhs {
- #[inline]
- fn eq(&self, other: &$lhs) -> bool {
- let this: &[u8] = self.as_ref();
- PartialEq::eq(this, other.as_bytes())
- }
- }
- };
-}
-
-#[cfg(feature = "std")]
-macro_rules! impl_partial_eq_cow {
- ($lhs:ty, $rhs:ty) => {
- impl<'a, 'b> PartialEq<$rhs> for $lhs {
- #[inline]
- fn eq(&self, other: &$rhs) -> bool {
- let other: &[u8] = (&**other).as_ref();
- PartialEq::eq(self.as_bytes(), other)
- }
- }
-
- impl<'a, 'b> PartialEq<$lhs> for $rhs {
- #[inline]
- fn eq(&self, other: &$lhs) -> bool {
- let this: &[u8] = (&**other).as_ref();
- PartialEq::eq(this, self.as_bytes())
- }
- }
- };
-}
-
-macro_rules! impl_partial_ord {
- ($lhs:ty, $rhs:ty) => {
- impl<'a, 'b> PartialOrd<$rhs> for $lhs {
- #[inline]
- fn partial_cmp(&self, other: &$rhs) -> Option<Ordering> {
- let other: &[u8] = other.as_ref();
- PartialOrd::partial_cmp(self.as_bytes(), other)
- }
- }
-
- impl<'a, 'b> PartialOrd<$lhs> for $rhs {
- #[inline]
- fn partial_cmp(&self, other: &$lhs) -> Option<Ordering> {
- let this: &[u8] = self.as_ref();
- PartialOrd::partial_cmp(this, other.as_bytes())
- }
- }
- };
-}
-
-#[cfg(feature = "std")]
-mod bstring {
- use std::borrow::{Borrow, Cow, ToOwned};
- use std::cmp::Ordering;
- use std::fmt;
- use std::iter::FromIterator;
- use std::ops;
-
- use crate::bstr::BStr;
- use crate::bstring::BString;
- use crate::ext_vec::ByteVec;
-
- impl fmt::Display for BString {
- #[inline]
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- fmt::Display::fmt(self.as_bstr(), f)
- }
- }
-
- impl fmt::Debug for BString {
- #[inline]
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- fmt::Debug::fmt(self.as_bstr(), f)
- }
- }
-
- impl ops::Deref for BString {
- type Target = Vec<u8>;
-
- #[inline]
- fn deref(&self) -> &Vec<u8> {
- &self.bytes
- }
- }
-
- impl ops::DerefMut for BString {
- #[inline]
- fn deref_mut(&mut self) -> &mut Vec<u8> {
- &mut self.bytes
- }
- }
-
- impl AsRef<[u8]> for BString {
- #[inline]
- fn as_ref(&self) -> &[u8] {
- &self.bytes
- }
- }
-
- impl AsRef<BStr> for BString {
- #[inline]
- fn as_ref(&self) -> &BStr {
- self.as_bstr()
- }
- }
-
- impl AsMut<[u8]> for BString {
- #[inline]
- fn as_mut(&mut self) -> &mut [u8] {
- &mut self.bytes
- }
- }
-
- impl AsMut<BStr> for BString {
- #[inline]
- fn as_mut(&mut self) -> &mut BStr {
- self.as_mut_bstr()
- }
- }
-
- impl Borrow<BStr> for BString {
- #[inline]
- fn borrow(&self) -> &BStr {
- self.as_bstr()
- }
- }
-
- impl ToOwned for BStr {
- type Owned = BString;
-
- #[inline]
- fn to_owned(&self) -> BString {
- BString::from(self)
- }
- }
-
- impl Default for BString {
- fn default() -> BString {
- BString::from(vec![])
- }
- }
-
- impl<'a> From<&'a [u8]> for BString {
- #[inline]
- fn from(s: &'a [u8]) -> BString {
- BString::from(s.to_vec())
- }
- }
-
- impl From<Vec<u8>> for BString {
- #[inline]
- fn from(s: Vec<u8>) -> BString {
- BString { bytes: s }
- }
- }
-
- impl From<BString> for Vec<u8> {
- #[inline]
- fn from(s: BString) -> Vec<u8> {
- s.bytes
- }
- }
-
- impl<'a> From<&'a str> for BString {
- #[inline]
- fn from(s: &'a str) -> BString {
- BString::from(s.as_bytes().to_vec())
- }
- }
-
- impl From<String> for BString {
- #[inline]
- fn from(s: String) -> BString {
- BString::from(s.into_bytes())
- }
- }
-
- impl<'a> From<&'a BStr> for BString {
- #[inline]
- fn from(s: &'a BStr) -> BString {
- BString::from(s.bytes.to_vec())
- }
- }
-
- impl<'a> From<BString> for Cow<'a, BStr> {
- #[inline]
- fn from(s: BString) -> Cow<'a, BStr> {
- Cow::Owned(s)
- }
- }
-
- impl FromIterator<char> for BString {
- #[inline]
- fn from_iter<T: IntoIterator<Item = char>>(iter: T) -> BString {
- BString::from(iter.into_iter().collect::<String>())
- }
- }
-
- impl FromIterator<u8> for BString {
- #[inline]
- fn from_iter<T: IntoIterator<Item = u8>>(iter: T) -> BString {
- BString::from(iter.into_iter().collect::<Vec<u8>>())
- }
- }
-
- impl<'a> FromIterator<&'a str> for BString {
- #[inline]
- fn from_iter<T: IntoIterator<Item = &'a str>>(iter: T) -> BString {
- let mut buf = vec![];
- for b in iter {
- buf.push_str(b);
- }
- BString::from(buf)
- }
- }
-
- impl<'a> FromIterator<&'a [u8]> for BString {
- #[inline]
- fn from_iter<T: IntoIterator<Item = &'a [u8]>>(iter: T) -> BString {
- let mut buf = vec![];
- for b in iter {
- buf.push_str(b);
- }
- BString::from(buf)
- }
- }
-
- impl<'a> FromIterator<&'a BStr> for BString {
- #[inline]
- fn from_iter<T: IntoIterator<Item = &'a BStr>>(iter: T) -> BString {
- let mut buf = vec![];
- for b in iter {
- buf.push_str(b);
- }
- BString::from(buf)
- }
- }
-
- impl FromIterator<BString> for BString {
- #[inline]
- fn from_iter<T: IntoIterator<Item = BString>>(iter: T) -> BString {
- let mut buf = vec![];
- for b in iter {
- buf.push_str(b);
- }
- BString::from(buf)
- }
- }
-
- impl Eq for BString {}
-
- impl PartialEq for BString {
- #[inline]
- fn eq(&self, other: &BString) -> bool {
- &self[..] == &other[..]
- }
- }
-
- impl_partial_eq!(BString, Vec<u8>);
- impl_partial_eq!(BString, [u8]);
- impl_partial_eq!(BString, &'a [u8]);
- impl_partial_eq!(BString, String);
- impl_partial_eq!(BString, str);
- impl_partial_eq!(BString, &'a str);
- impl_partial_eq!(BString, BStr);
- impl_partial_eq!(BString, &'a BStr);
-
- impl PartialOrd for BString {
- #[inline]
- fn partial_cmp(&self, other: &BString) -> Option<Ordering> {
- PartialOrd::partial_cmp(&self.bytes, &other.bytes)
- }
- }
-
- impl Ord for BString {
- #[inline]
- fn cmp(&self, other: &BString) -> Ordering {
- self.partial_cmp(other).unwrap()
- }
- }
-
- impl_partial_ord!(BString, Vec<u8>);
- impl_partial_ord!(BString, [u8]);
- impl_partial_ord!(BString, &'a [u8]);
- impl_partial_ord!(BString, String);
- impl_partial_ord!(BString, str);
- impl_partial_ord!(BString, &'a str);
- impl_partial_ord!(BString, BStr);
- impl_partial_ord!(BString, &'a BStr);
-}
-
-mod bstr {
- #[cfg(feature = "std")]
- use std::borrow::Cow;
-
- use core::cmp::Ordering;
- use core::fmt;
- use core::ops;
-
- use crate::bstr::BStr;
- use crate::ext_slice::ByteSlice;
-
- impl fmt::Display for BStr {
- #[inline]
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- /// Write the given bstr (lossily) to the given formatter.
- fn write_bstr(
- f: &mut fmt::Formatter<'_>,
- bstr: &BStr,
- ) -> Result<(), fmt::Error> {
- for chunk in bstr.utf8_chunks() {
- f.write_str(chunk.valid())?;
- if !chunk.invalid().is_empty() {
- f.write_str("\u{FFFD}")?;
- }
- }
- Ok(())
- }
-
- /// Write 'num' fill characters to the given formatter.
- fn write_pads(
- f: &mut fmt::Formatter<'_>,
- num: usize,
- ) -> fmt::Result {
- let fill = f.fill();
- for _ in 0..num {
- f.write_fmt(format_args!("{}", fill))?;
- }
- Ok(())
- }
-
- if let Some(align) = f.align() {
- let width = f.width().unwrap_or(0);
- let nchars = self.chars().count();
- let remaining_pads = width.saturating_sub(nchars);
- match align {
- fmt::Alignment::Left => {
- write_bstr(f, self)?;
- write_pads(f, remaining_pads)?;
- }
- fmt::Alignment::Right => {
- write_pads(f, remaining_pads)?;
- write_bstr(f, self)?;
- }
- fmt::Alignment::Center => {
- let half = remaining_pads / 2;
- let second_half = if remaining_pads % 2 == 0 {
- half
- } else {
- half + 1
- };
- write_pads(f, half)?;
- write_bstr(f, self)?;
- write_pads(f, second_half)?;
- }
- }
- Ok(())
- } else {
- write_bstr(f, self)?;
- Ok(())
- }
- }
- }
-
- impl fmt::Debug for BStr {
- #[inline]
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "\"")?;
- for (s, e, ch) in self.char_indices() {
- match ch {
- '\0' => write!(f, "\\0")?,
- '\u{FFFD}' => {
- let bytes = self[s..e].as_bytes();
- if bytes == b"\xEF\xBF\xBD" {
- write!(f, "{}", ch.escape_debug())?;
- } else {
- for &b in self[s..e].as_bytes() {
- write!(f, r"\x{:02X}", b)?;
- }
- }
- }
- // ASCII control characters except \0, \n, \r, \t
- '\x01'..='\x08'
- | '\x0b'
- | '\x0c'
- | '\x0e'..='\x19'
- | '\x7f' => {
- write!(f, "\\x{:02x}", ch as u32)?;
- }
- '\n' | '\r' | '\t' | _ => {
- write!(f, "{}", ch.escape_debug())?;
- }
- }
- }
- write!(f, "\"")?;
- Ok(())
- }
- }
-
- impl ops::Deref for BStr {
- type Target = [u8];
-
- #[inline]
- fn deref(&self) -> &[u8] {
- &self.bytes
- }
- }
-
- impl ops::DerefMut for BStr {
- #[inline]
- fn deref_mut(&mut self) -> &mut [u8] {
- &mut self.bytes
- }
- }
-
- impl ops::Index<usize> for BStr {
- type Output = u8;
-
- #[inline]
- fn index(&self, idx: usize) -> &u8 {
- &self.as_bytes()[idx]
- }
- }
-
- impl ops::Index<ops::RangeFull> for BStr {
- type Output = BStr;
-
- #[inline]
- fn index(&self, _: ops::RangeFull) -> &BStr {
- self
- }
- }
-
- impl ops::Index<ops::Range<usize>> for BStr {
- type Output = BStr;
-
- #[inline]
- fn index(&self, r: ops::Range<usize>) -> &BStr {
- BStr::new(&self.as_bytes()[r.start..r.end])
- }
- }
-
- impl ops::Index<ops::RangeInclusive<usize>> for BStr {
- type Output = BStr;
-
- #[inline]
- fn index(&self, r: ops::RangeInclusive<usize>) -> &BStr {
- BStr::new(&self.as_bytes()[*r.start()..=*r.end()])
- }
- }
-
- impl ops::Index<ops::RangeFrom<usize>> for BStr {
- type Output = BStr;
-
- #[inline]
- fn index(&self, r: ops::RangeFrom<usize>) -> &BStr {
- BStr::new(&self.as_bytes()[r.start..])
- }
- }
-
- impl ops::Index<ops::RangeTo<usize>> for BStr {
- type Output = BStr;
-
- #[inline]
- fn index(&self, r: ops::RangeTo<usize>) -> &BStr {
- BStr::new(&self.as_bytes()[..r.end])
- }
- }
-
- impl ops::Index<ops::RangeToInclusive<usize>> for BStr {
- type Output = BStr;
-
- #[inline]
- fn index(&self, r: ops::RangeToInclusive<usize>) -> &BStr {
- BStr::new(&self.as_bytes()[..=r.end])
- }
- }
-
- impl ops::IndexMut<usize> for BStr {
- #[inline]
- fn index_mut(&mut self, idx: usize) -> &mut u8 {
- &mut self.bytes[idx]
- }
- }
-
- impl ops::IndexMut<ops::RangeFull> for BStr {
- #[inline]
- fn index_mut(&mut self, _: ops::RangeFull) -> &mut BStr {
- self
- }
- }
-
- impl ops::IndexMut<ops::Range<usize>> for BStr {
- #[inline]
- fn index_mut(&mut self, r: ops::Range<usize>) -> &mut BStr {
- BStr::from_bytes_mut(&mut self.bytes[r.start..r.end])
- }
- }
-
- impl ops::IndexMut<ops::RangeInclusive<usize>> for BStr {
- #[inline]
- fn index_mut(&mut self, r: ops::RangeInclusive<usize>) -> &mut BStr {
- BStr::from_bytes_mut(&mut self.bytes[*r.start()..=*r.end()])
- }
- }
-
- impl ops::IndexMut<ops::RangeFrom<usize>> for BStr {
- #[inline]
- fn index_mut(&mut self, r: ops::RangeFrom<usize>) -> &mut BStr {
- BStr::from_bytes_mut(&mut self.bytes[r.start..])
- }
- }
-
- impl ops::IndexMut<ops::RangeTo<usize>> for BStr {
- #[inline]
- fn index_mut(&mut self, r: ops::RangeTo<usize>) -> &mut BStr {
- BStr::from_bytes_mut(&mut self.bytes[..r.end])
- }
- }
-
- impl ops::IndexMut<ops::RangeToInclusive<usize>> for BStr {
- #[inline]
- fn index_mut(&mut self, r: ops::RangeToInclusive<usize>) -> &mut BStr {
- BStr::from_bytes_mut(&mut self.bytes[..=r.end])
- }
- }
-
- impl AsRef<[u8]> for BStr {
- #[inline]
- fn as_ref(&self) -> &[u8] {
- self.as_bytes()
- }
- }
-
- impl AsRef<BStr> for [u8] {
- #[inline]
- fn as_ref(&self) -> &BStr {
- BStr::new(self)
- }
- }
-
- impl AsRef<BStr> for str {
- #[inline]
- fn as_ref(&self) -> &BStr {
- BStr::new(self)
- }
- }
-
- impl AsMut<[u8]> for BStr {
- #[inline]
- fn as_mut(&mut self) -> &mut [u8] {
- &mut self.bytes
- }
- }
-
- impl AsMut<BStr> for [u8] {
- #[inline]
- fn as_mut(&mut self) -> &mut BStr {
- BStr::new_mut(self)
- }
- }
-
- impl<'a> Default for &'a BStr {
- fn default() -> &'a BStr {
- BStr::from_bytes(b"")
- }
- }
-
- impl<'a> Default for &'a mut BStr {
- fn default() -> &'a mut BStr {
- BStr::from_bytes_mut(&mut [])
- }
- }
-
- impl<'a> From<&'a [u8]> for &'a BStr {
- #[inline]
- fn from(s: &'a [u8]) -> &'a BStr {
- BStr::from_bytes(s)
- }
- }
-
- impl<'a> From<&'a str> for &'a BStr {
- #[inline]
- fn from(s: &'a str) -> &'a BStr {
- BStr::from_bytes(s.as_bytes())
- }
- }
-
- #[cfg(feature = "std")]
- impl<'a> From<&'a BStr> for Cow<'a, BStr> {
- #[inline]
- fn from(s: &'a BStr) -> Cow<'a, BStr> {
- Cow::Borrowed(s)
- }
- }
-
- #[cfg(feature = "std")]
- impl From<Box<[u8]>> for Box<BStr> {
- #[inline]
- fn from(s: Box<[u8]>) -> Box<BStr> {
- BStr::from_boxed_bytes(s)
- }
- }
-
- #[cfg(feature = "std")]
- impl From<Box<BStr>> for Box<[u8]> {
- #[inline]
- fn from(s: Box<BStr>) -> Box<[u8]> {
- BStr::into_boxed_bytes(s)
- }
- }
-
- impl Eq for BStr {}
-
- impl PartialEq<BStr> for BStr {
- #[inline]
- fn eq(&self, other: &BStr) -> bool {
- self.as_bytes() == other.as_bytes()
- }
- }
-
- impl_partial_eq!(BStr, [u8]);
- impl_partial_eq!(BStr, &'a [u8]);
- impl_partial_eq!(BStr, str);
- impl_partial_eq!(BStr, &'a str);
-
- #[cfg(feature = "std")]
- impl_partial_eq!(BStr, Vec<u8>);
- #[cfg(feature = "std")]
- impl_partial_eq!(&'a BStr, Vec<u8>);
- #[cfg(feature = "std")]
- impl_partial_eq!(BStr, String);
- #[cfg(feature = "std")]
- impl_partial_eq!(&'a BStr, String);
- #[cfg(feature = "std")]
- impl_partial_eq_cow!(&'a BStr, Cow<'a, BStr>);
- #[cfg(feature = "std")]
- impl_partial_eq_cow!(&'a BStr, Cow<'a, str>);
- #[cfg(feature = "std")]
- impl_partial_eq_cow!(&'a BStr, Cow<'a, [u8]>);
-
- impl PartialOrd for BStr {
- #[inline]
- fn partial_cmp(&self, other: &BStr) -> Option<Ordering> {
- PartialOrd::partial_cmp(self.as_bytes(), other.as_bytes())
- }
- }
-
- impl Ord for BStr {
- #[inline]
- fn cmp(&self, other: &BStr) -> Ordering {
- self.partial_cmp(other).unwrap()
- }
- }
-
- impl_partial_ord!(BStr, [u8]);
- impl_partial_ord!(BStr, &'a [u8]);
- impl_partial_ord!(BStr, str);
- impl_partial_ord!(BStr, &'a str);
-
- #[cfg(feature = "std")]
- impl_partial_ord!(BStr, Vec<u8>);
- #[cfg(feature = "std")]
- impl_partial_ord!(&'a BStr, Vec<u8>);
- #[cfg(feature = "std")]
- impl_partial_ord!(BStr, String);
- #[cfg(feature = "std")]
- impl_partial_ord!(&'a BStr, String);
-}
-
-#[cfg(feature = "serde1-nostd")]
-mod bstr_serde {
- use core::fmt;
-
- use serde::{
- de::Error, de::Visitor, Deserialize, Deserializer, Serialize,
- Serializer,
- };
-
- use crate::bstr::BStr;
-
- impl Serialize for BStr {
- #[inline]
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- serializer.serialize_bytes(self.as_bytes())
- }
- }
-
- impl<'a, 'de: 'a> Deserialize<'de> for &'a BStr {
- #[inline]
- fn deserialize<D>(deserializer: D) -> Result<&'a BStr, D::Error>
- where
- D: Deserializer<'de>,
- {
- struct BStrVisitor;
-
- impl<'de> Visitor<'de> for BStrVisitor {
- type Value = &'de BStr;
-
- fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
- f.write_str("a borrowed byte string")
- }
-
- #[inline]
- fn visit_borrowed_bytes<E: Error>(
- self,
- value: &'de [u8],
- ) -> Result<&'de BStr, E> {
- Ok(BStr::new(value))
- }
-
- #[inline]
- fn visit_borrowed_str<E: Error>(
- self,
- value: &'de str,
- ) -> Result<&'de BStr, E> {
- Ok(BStr::new(value))
- }
- }
-
- deserializer.deserialize_bytes(BStrVisitor)
- }
- }
-}
-
-#[cfg(feature = "serde1")]
-mod bstring_serde {
- use std::cmp;
- use std::fmt;
-
- use serde::{
- de::Error, de::SeqAccess, de::Visitor, Deserialize, Deserializer,
- Serialize, Serializer,
- };
-
- use crate::bstring::BString;
-
- impl Serialize for BString {
- #[inline]
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- serializer.serialize_bytes(self.as_bytes())
- }
- }
-
- impl<'de> Deserialize<'de> for BString {
- #[inline]
- fn deserialize<D>(deserializer: D) -> Result<BString, D::Error>
- where
- D: Deserializer<'de>,
- {
- struct BStringVisitor;
-
- impl<'de> Visitor<'de> for BStringVisitor {
- type Value = BString;
-
- fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
- f.write_str("a byte string")
- }
-
- #[inline]
- fn visit_seq<V: SeqAccess<'de>>(
- self,
- mut visitor: V,
- ) -> Result<BString, V::Error> {
- let len = cmp::min(visitor.size_hint().unwrap_or(0), 256);
- let mut bytes = Vec::with_capacity(len);
- while let Some(v) = visitor.next_element()? {
- bytes.push(v);
- }
- Ok(BString::from(bytes))
- }
-
- #[inline]
- fn visit_bytes<E: Error>(
- self,
- value: &[u8],
- ) -> Result<BString, E> {
- Ok(BString::from(value))
- }
-
- #[inline]
- fn visit_byte_buf<E: Error>(
- self,
- value: Vec<u8>,
- ) -> Result<BString, E> {
- Ok(BString::from(value))
- }
-
- #[inline]
- fn visit_str<E: Error>(
- self,
- value: &str,
- ) -> Result<BString, E> {
- Ok(BString::from(value))
- }
-
- #[inline]
- fn visit_string<E: Error>(
- self,
- value: String,
- ) -> Result<BString, E> {
- Ok(BString::from(value))
- }
- }
-
- deserializer.deserialize_byte_buf(BStringVisitor)
- }
- }
-}
-
-#[cfg(test)]
-mod display {
- use crate::bstring::BString;
- use crate::ByteSlice;
-
- #[test]
- fn clean() {
- assert_eq!(&format!("{}", &b"abc".as_bstr()), "abc");
- assert_eq!(&format!("{}", &b"\xf0\x28\x8c\xbc".as_bstr()), "�(��");
- }
-
- #[test]
- fn width_bigger_than_bstr() {
- assert_eq!(&format!("{:<7}!", &b"abc".as_bstr()), "abc !");
- assert_eq!(&format!("{:>7}!", &b"abc".as_bstr()), " abc!");
- assert_eq!(&format!("{:^7}!", &b"abc".as_bstr()), " abc !");
- assert_eq!(&format!("{:^6}!", &b"abc".as_bstr()), " abc !");
- assert_eq!(&format!("{:-<7}!", &b"abc".as_bstr()), "abc----!");
- assert_eq!(&format!("{:->7}!", &b"abc".as_bstr()), "----abc!");
- assert_eq!(&format!("{:-^7}!", &b"abc".as_bstr()), "--abc--!");
- assert_eq!(&format!("{:-^6}!", &b"abc".as_bstr()), "-abc--!");
-
- assert_eq!(
- &format!("{:<7}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(�� !"
- );
- assert_eq!(
- &format!("{:>7}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- " �(��!"
- );
- assert_eq!(
- &format!("{:^7}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- " �(�� !"
- );
- assert_eq!(
- &format!("{:^6}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- " �(�� !"
- );
-
- assert_eq!(
- &format!("{:-<7}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��---!"
- );
- assert_eq!(
- &format!("{:->7}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "---�(��!"
- );
- assert_eq!(
- &format!("{:-^7}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "-�(��--!"
- );
- assert_eq!(
- &format!("{:-^6}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "-�(��-!"
- );
- }
-
- #[test]
- fn width_lesser_than_bstr() {
- assert_eq!(&format!("{:<2}!", &b"abc".as_bstr()), "abc!");
- assert_eq!(&format!("{:>2}!", &b"abc".as_bstr()), "abc!");
- assert_eq!(&format!("{:^2}!", &b"abc".as_bstr()), "abc!");
- assert_eq!(&format!("{:-<2}!", &b"abc".as_bstr()), "abc!");
- assert_eq!(&format!("{:->2}!", &b"abc".as_bstr()), "abc!");
- assert_eq!(&format!("{:-^2}!", &b"abc".as_bstr()), "abc!");
-
- assert_eq!(
- &format!("{:<3}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
- assert_eq!(
- &format!("{:>3}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
- assert_eq!(
- &format!("{:^3}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
- assert_eq!(
- &format!("{:^2}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
-
- assert_eq!(
- &format!("{:-<3}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
- assert_eq!(
- &format!("{:->3}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
- assert_eq!(
- &format!("{:-^3}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
- assert_eq!(
- &format!("{:-^2}!", &b"\xf0\x28\x8c\xbc".as_bstr()),
- "�(��!"
- );
- }
-
- quickcheck::quickcheck! {
- fn total_length(bstr: BString) -> bool {
- let size = bstr.chars().count();
- format!("{:<1$}", bstr.as_bstr(), size).chars().count() >= size
- }
- }
-}
-
-#[cfg(test)]
-mod bstring_arbitrary {
- use crate::bstring::BString;
-
- use quickcheck::{Arbitrary, Gen};
-
- impl Arbitrary for BString {
- fn arbitrary(g: &mut Gen) -> BString {
- BString::from(Vec::<u8>::arbitrary(g))
- }
-
- fn shrink(&self) -> Box<dyn Iterator<Item = BString>> {
- Box::new(self.bytes.shrink().map(BString::from))
- }
- }
-}
-
-#[test]
-fn test_debug() {
- use crate::{ByteSlice, B};
-
- assert_eq!(
- r#""\0\0\0 ftypisom\0\0\x02\0isomiso2avc1mp""#,
- format!("{:?}", b"\0\0\0 ftypisom\0\0\x02\0isomiso2avc1mp".as_bstr()),
- );
-
- // Tests that if the underlying bytes contain the UTF-8 encoding of the
- // replacement codepoint, then we emit the codepoint just like other
- // non-printable Unicode characters.
- assert_eq!(
- b"\"\\xFF\xEF\xBF\xBD\\xFF\"".as_bstr(),
- // Before fixing #72, the output here would be:
- // \\xFF\\xEF\\xBF\\xBD\\xFF
- B(&format!("{:?}", b"\xFF\xEF\xBF\xBD\xFF".as_bstr())).as_bstr(),
- );
-}
-
-// See: https://github.com/BurntSushi/bstr/issues/82
-#[test]
-fn test_cows_regression() {
- use crate::ByteSlice;
- use std::borrow::Cow;
-
- let c1 = Cow::from(b"hello bstr".as_bstr());
- let c2 = b"goodbye bstr".as_bstr();
- assert_ne!(c1, c2);
-
- let c3 = Cow::from("hello str");
- let c4 = "goodbye str";
- assert_ne!(c3, c4);
-}