Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn find_end(s: &str, start: usize) -> Option<usize> {
- if s.len() <= start {
- return None;
- }
- let mut index = start + 1;
- while !s.is_char_boundary(index) {
- index += 1;
- }
- Some(index)
- }
- fn resolve_indexes(s: &str, with: char) -> Option<Vec<(usize, usize)>> {
- let mut indexi = Vec::new();
- for (index, _) in s.char_indices().filter(|(_, c)| *c == with) {
- let end = find_end(s, index)?;
- indexi.push((index, end));
- }
- Some(indexi)
- }
- struct Args<'a> {
- message: &'a str,
- delim: char,
- offset: usize,
- offsets: Vec<(usize, usize)>,
- // Used for rewinding
- prev: Option<(usize, (usize, usize))>,
- }
- impl<'a> Args<'a> {
- fn new(msg: &'a str, delim: char) -> Self {
- Args {
- message: msg,
- delim: delim,
- offset: 0,
- offsets: resolve_indexes(msg, delim).unwrap(),
- prev: None,
- }
- }
- fn until_internal(&mut self, change: bool) -> Option<&'a str> {
- if self.offset >= self.message.len() {
- return None;
- }
- if self.offsets.is_empty() {
- let s = &self.message[self.offset..];
- // We've reached the end; invalidate the offset.
- self.offset = self.message.len();
- return Some(s);
- }
- let (start, end) = if change {
- self.offsets.remove(0)
- } else {
- self.offsets[0]
- };
- let string = &self.message[self.offset..start];
- if change {
- self.prev = Some((self.offset, (start, end)));
- self.offset = end;
- }
- if string.is_empty() || string.chars().all(|c| c == self.delim) {
- return self.until_internal(true);
- }
- Some(string)
- }
- #[inline]
- fn single(&mut self) -> Option<&'a str> {
- self.until_internal(true)
- }
- #[inline]
- fn single_s(&mut self) -> Option<&'a str> {
- self.until_internal(false)
- }
- fn rewind(&mut self) {
- match self.prev {
- Some((off, offsets)) => {
- self.offset = off;
- self.offsets.insert(0, offsets);
- },
- None => {
- self.offset = 0;
- },
- }
- }
- }
- fn main() {
- let mut args = Args::new("42 fd88 π π εε ±εε ±ε γ©γγγ ζΌ’ε μ‘°μ κΈμ‘°μ κΈμ‘°μ κΈμ‘°μ κΈμ‘°μ κΈγ γ΄λ°μ γ γ γ γ γ γ γ μ λ² γ γ γ γ μλ€μμ!γ ???γ γ λ 체[γΉ γ΄μλ μΌγ γ λ€γ ‘μΆννμΉγ γ γ΄μγ γΉ 99", ' ');
- // `single_s` should not alter the internal offset whatsoever.
- assert_eq!(args.single_s(), Some("42"));
- assert_eq!(args.single(), Some("42"));
- args.rewind();
- while let Some(s) = args.single() {
- println!("{:?}", s);
- }
- }
Add Comment
Please, Sign In to add comment