Guest User

Untitled

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