diff options
Diffstat (limited to 'third_party/rust/unicode-normalization/src/replace.rs')
-rw-r--r-- | third_party/rust/unicode-normalization/src/replace.rs | 61 |
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(()) + } +} |