pub struct GString { /* private fields */ }
Expand description
String with support for Unicode graphemes
Implementations§
Source§impl GString
impl GString
Sourcepub fn graphemes(&self) -> &[String]
pub fn graphemes(&self) -> &[String]
Return a slice reference to the internal graphemes
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
const G: &[&str] = &["a\u{310}", "e\u{301}", "o\u{308}\u{332}"];
let s = GString::from(S);
let g = s.graphemes();
assert_eq!(g, G);
assert_eq!(g.len(), G.len());
Sourcepub fn into_graphemes(self) -> Vec<String>
pub fn into_graphemes(self) -> Vec<String>
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Return the count of graphemes
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let s = GString::from(S);
assert_eq!(s.len(), 3);
let s = GString::from("");
assert_eq!(s.len(), 0);
Sourcepub fn insert(&mut self, idx: usize, string: &str)
pub fn insert(&mut self, idx: usize, string: &str)
Insert a string at an index
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let mut s = GString::from("a\u{310}o\u{308}\u{332}");
s.insert(1, "e\u{301}");
assert_eq!(s, S);
Sourcepub fn remove(&mut self, idx: usize) -> GString
pub fn remove(&mut self, idx: usize) -> GString
Remove a grapheme at an index
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let mut s = GString::from(S);
assert_eq!(s.remove(1), "e\u{301}");
assert_eq!(s, "a\u{310}o\u{308}\u{332}");
Sourcepub fn push(&mut self, string: &str)
pub fn push(&mut self, string: &str)
Append a &str
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let mut s = GString::from("a\u{310}e\u{301}");
s.push("o\u{308}\u{332}");
assert_eq!(s, S);
Sourcepub fn pop(&mut self) -> Option<GString>
pub fn pop(&mut self) -> Option<GString>
Remove the last grapheme and return it as a new GString
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let mut s = GString::from(S);
assert_eq!(s.pop().unwrap(), "o\u{308}\u{332}");
assert_eq!(s, "a\u{310}e\u{301}");
assert_eq!(s.pop().unwrap(), "e\u{301}");
assert_eq!(s, "a\u{310}");
assert_eq!(s.pop().unwrap(), "a\u{310}");
assert_eq!(s, "");
assert_eq!(s.pop(), None);
assert_eq!(s, "");
Sourcepub fn splice<R: RangeBounds<usize>>(
&mut self,
range: R,
replace_with: &str,
) -> GString
pub fn splice<R: RangeBounds<usize>>( &mut self, range: R, replace_with: &str, ) -> GString
Replace a range with a &str
The range can be a a..b
Range<usize>
, a..
RangeFrom<usize>
, ..b
RangeTo<usize>
, or ..
RangeFull
.
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let mut s = GString::from(S);
s.splice(0..2, "e\u{301}a\u{310}");
assert_eq!(s, "e\u{301}a\u{310}o\u{308}\u{332}");
s.splice(1.., "o\u{308}\u{332}a\u{310}");
assert_eq!(s, "e\u{301}o\u{308}\u{332}a\u{310}");
s.splice(..1, "");
assert_eq!(s, "o\u{308}\u{332}a\u{310}");
s.splice(.., "");
assert_eq!(s, "");
Sourcepub fn drain<R: RangeBounds<usize>>(&mut self, range: R) -> GString
pub fn drain<R: RangeBounds<usize>>(&mut self, range: R) -> GString
Remove and return a range of graphemes
The range can be a a..b
Range<usize>
, a..
RangeFrom<usize>
, ..b
RangeTo<usize>
, or ..
RangeFull
.
use gstring::*;
let mut s = GString::from("a\u{310}e\u{301}o\u{308}\u{332}a\u{310}e\u{301}");
assert_eq!(s.drain(0..2), "a\u{310}e\u{301}");
assert_eq!(s, "o\u{308}\u{332}a\u{310}e\u{301}");
assert_eq!(s.drain(2..), "e\u{301}");
assert_eq!(s, "o\u{308}\u{332}a\u{310}");
assert_eq!(s.drain(..1), "o\u{308}\u{332}");
assert_eq!(s, "a\u{310}");
assert_eq!(s.drain(..), "a\u{310}");
assert_eq!(s, "");
Sourcepub fn slice(&self, range: Range<usize>) -> GString
pub fn slice(&self, range: Range<usize>) -> GString
Create a new GString
from an a..b
Range<usize>
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let s = GString::from(S);
assert_eq!(s.slice(0..1), "a\u{310}");
assert_eq!(s.slice(1..2), "e\u{301}");
assert_eq!(s.slice(2..3), "o\u{308}\u{332}");
assert_eq!(s.slice(0..2), "a\u{310}e\u{301}");
assert_eq!(s.slice(1..3), "e\u{301}o\u{308}\u{332}");
assert_eq!(s.slice(0..3), S);
See also the GString::index
method.
Sourcepub fn iter(&self) -> GStringRefIter<'_> ⓘ
pub fn iter(&self) -> GStringRefIter<'_> ⓘ
Create a GStringRefIter
for iterating graphemes by reference
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let s = GString::from(S);
let mut i = s.iter();
assert_eq!(i.next().unwrap(), "a\u{310}");
assert_eq!(i.next().unwrap(), "e\u{301}");
assert_eq!(i.next().unwrap(), "o\u{308}\u{332}");
assert_eq!(i.next(), None);
See also the GString::into_iter
method.
Sourcepub fn into_iter(self) -> GStringIter ⓘ
pub fn into_iter(self) -> GStringIter ⓘ
Consume the GString
and convert into a GStringIter
for iterating graphemes
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let s = GString::from(S);
let mut i = s.into_iter();
assert_eq!(i.next().unwrap(), "a\u{310}");
assert_eq!(i.next().unwrap(), "e\u{301}");
assert_eq!(i.next().unwrap(), "o\u{308}\u{332}");
assert_eq!(i.next(), None);
See also the GString::iter
method.
Trait Implementations§
Source§impl<I> Index<I> for GStringwhere
I: SliceIndex<[String]>,
impl<I> Index<I> for GStringwhere
I: SliceIndex<[String]>,
Source§fn index(&self, index: I) -> &Self::Output
fn index(&self, index: I) -> &Self::Output
Index a slice of GString
’s graphemes with a usize
index, a..b
Range<usize>
, a..
RangeFrom<usize>
, ..b
RangeTo<usize>
, or ..
RangeFull
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
const G: &[&str] = &["a\u{310}", "e\u{301}", "o\u{308}\u{332}"];
let s = GString::from(S);
assert_eq!(&s[0], G[0]);
assert_eq!(&s[1], G[1]);
assert_eq!(&s[2], G[2]);
for start in 0..3 {
for stop in 1..4 {
if stop > start {
assert_eq!(&s[start..stop], G[start..stop].to_vec());
assert_eq!(&s[..stop], G[..stop].to_vec());
}
}
assert_eq!(&s[start..], G[start..].to_vec());
}
assert_eq!(&s[..], G);
See also the GString::slice
method.