Sha256: b24c904f3e00851a78820e30ddfa4ff10c795f8925fd0ee7f5870f31fdfa770b
Contents?: true
Size: 1.91 KB
Versions: 34
Compression:
Stored size: 1.91 KB
Contents
// 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(()) } }
Version data entries
34 entries across 34 versions & 1 rubygems