summaryrefslogtreecommitdiffstats
path: root/third_party/rust/unicode-normalization/src/replace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/unicode-normalization/src/replace.rs')
-rw-r--r--third_party/rust/unicode-normalization/src/replace.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/third_party/rust/unicode-normalization/src/replace.rs b/third_party/rust/unicode-normalization/src/replace.rs
new file mode 100644
index 0000000000..8d8cb423fc
--- /dev/null
+++ b/third_party/rust/unicode-normalization/src/replace.rs
@@ -0,0 +1,61 @@
+// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+use core::fmt::{self, Write};
+use tinyvec::ArrayVec;
+
+/// External iterator for replacements for a string's characters.
+#[derive(Clone)]
+pub struct Replacements<I> {
+ iter: I,
+ // At this time, the longest replacement sequence has length 2, so we just
+ // need buffer space for 1 codepoint.
+ buffer: Option<char>,
+}
+
+#[inline]
+pub fn new_cjk_compat_variants<I: Iterator<Item = char>>(iter: I) -> Replacements<I> {
+ Replacements { iter, buffer: None }
+}
+
+impl<I: Iterator<Item = char>> Iterator for Replacements<I> {
+ type Item = char;
+
+ #[inline]
+ fn next(&mut self) -> Option<char> {
+ if let Some(c) = self.buffer.take() {
+ return Some(c);
+ }
+
+ match self.iter.next() {
+ Some(ch) => {
+ // At this time, the longest replacement sequence has length 2.
+ let mut buffer = ArrayVec::<[char; 2]>::new();
+ super::char::decompose_cjk_compat_variants(ch, |d| buffer.push(d));
+ self.buffer = buffer.get(1).copied();
+ Some(buffer[0])
+ }
+ None => None,
+ }
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ let (lower, _) = self.iter.size_hint();
+ (lower, None)
+ }
+}
+
+impl<I: Iterator<Item = char> + Clone> fmt::Display for Replacements<I> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ for c in self.clone() {
+ f.write_char(c)?;
+ }
+ Ok(())
+ }
+}