// 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 or the MIT license // , 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 { iter: I, // At this time, the longest replacement sequence has length 2, so we just // need buffer space for 1 codepoint. buffer: Option, } #[inline] pub fn new_cjk_compat_variants>(iter: I) -> Replacements { Replacements { iter, buffer: None } } impl> Iterator for Replacements { type Item = char; #[inline] fn next(&mut self) -> Option { 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) { let (lower, _) = self.iter.size_hint(); (lower, None) } } impl + Clone> fmt::Display for Replacements { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { for c in self.clone() { f.write_char(c)?; } Ok(()) } }