Guest User

Untitled

a guest
May 24th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. fn find_end(s: &str, start: usize) -> Option<usize> {
  2. if s.len() <= start {
  3. return None;
  4. }
  5.  
  6. let mut index = start + 1;
  7.  
  8. while !s.is_char_boundary(index) {
  9. index += 1;
  10. }
  11.  
  12. Some(index)
  13. }
  14.  
  15. fn resolve_indexes(s: &str, delims: &[char]) -> Option<Vec<(usize, usize)>> {
  16. let mut indexi = Vec::new();
  17. for (index, c) in s.char_indices() {
  18. if !delims.contains(&c) {
  19. continue;
  20. }
  21.  
  22. let end = find_end(s, index)?;
  23.  
  24. indexi.push((index, end));
  25. }
  26.  
  27. indexi.sort();
  28. Some(indexi)
  29. }
  30.  
  31. struct Args<'a> {
  32. message: &'a str,
  33. delims: &'a [char],
  34. offset: usize,
  35. offsets: Vec<(usize, usize)>,
  36. // Used for rewinding
  37. prev: Option<(usize, (usize, usize))>,
  38. }
  39.  
  40. impl<'a> Args<'a> {
  41. fn new(msg: &'a str, delims: &'a [char]) -> Self {
  42. Args {
  43. message: msg,
  44. delims: delims,
  45. offset: 0,
  46. offsets: resolve_indexes(msg, delims).unwrap(),
  47. prev: None,
  48. }
  49. }
  50.  
  51. fn until_internal(&mut self, change: bool) -> Option<&'a str> {
  52. if self.offset >= self.message.len() {
  53. return None;
  54. }
  55.  
  56. if self.offsets.is_empty() {
  57. let s = &self.message[self.offset..];
  58.  
  59. // We've reached the end; invalidate the offset.
  60. self.offset = self.message.len();
  61. return Some(s);
  62. }
  63.  
  64. let (start, end) = if change {
  65. self.offsets.remove(0)
  66. } else {
  67. self.offsets[0]
  68. };
  69.  
  70. let string = &self.message[self.offset..start];
  71.  
  72. if change {
  73. self.prev = Some((self.offset, (start, end)));
  74. self.offset = end;
  75. }
  76.  
  77. if string.is_empty() {
  78. return self.until_internal(true);
  79. } else {
  80. for delim in self.delims {
  81. if string.chars().all(|c| c == *delim) {
  82. return self.until_internal(true);
  83. }
  84. }
  85. }
  86.  
  87. Some(string)
  88. }
  89.  
  90. #[inline]
  91. fn single(&mut self) -> Option<&'a str> {
  92. self.until_internal(true)
  93. }
  94.  
  95. #[inline]
  96. fn single_s(&mut self) -> Option<&'a str> {
  97. self.until_internal(false)
  98. }
  99.  
  100. fn rewind(&mut self) {
  101. match self.prev {
  102. Some((off, offsets)) => {
  103. self.offset = off;
  104. self.offsets.insert(0, offsets);
  105. },
  106. None => {
  107. self.offset = 0;
  108. },
  109. }
  110. }
  111. }
  112.  
  113. fn main() {
  114. const MESSAGE: &str = "42 fd88 πŸ˜‚!πŸ›‘ a ! s ! εŒε…±εŒε…±εŒ どうしゃ ζΌ’ε­— μ‘°μ„ κΈ€μ‘°μ„  κΈ€μ‘°μ„ κΈ€μ‘°μ„ κΈ€μ‘°μ„ κΈ€γ…γ„΄λŸ°μ• γ…— ㅕㅑㅑㅛㅐㅂ μ œλ² γ…”γ…”γ…‘γ…μ—λ„€μ—μ—!γ…”???γ…”γ…“λ ˆμ²΄[γ„Ή γ„΄μ—λ Œμ•Όγ…γ…”λ‹€γ…‘μΆ”νƒ€νŽ•μΉ˜γ…“γ…γ„΄μ•ˆγ…‡γ„Ή 99";
  115. let mut args = Args::new(MESSAGE, &[' ', '!']);
  116.  
  117. // `single_s` should not alter the internal offset whatsoever.
  118. assert_eq!(args.single_s(), Some("42"));
  119. assert_eq!(args.single(), Some("42"));
  120. args.rewind();
  121. while let Some(s) = args.single() {
  122. println!("{:?}", s);
  123. }
  124. }
Add Comment
Please, Sign In to add comment