diff --git a/src/output/cell.rs b/src/output/cell.rs index 653f1a868bbcc7ed7fd0b6f82d7a243364e5f0ba..ef06b6ed5e2b21164ce8d5f638ce89bfd1fb0708 100644 --- a/src/output/cell.rs +++ b/src/output/cell.rs @@ -1,5 +1,6 @@ //! The `TextCell` type for the details and lines views. +use std::iter::Sum; use std::ops::{Add, Deref, DerefMut}; use ansi_term::{Style, ANSIString, ANSIStrings}; @@ -163,11 +164,9 @@ impl TextCellContents { /// Calculates the width that a cell with these contents would take up, by /// counting the number of characters in each unformatted ANSI string. pub fn width(&self) -> DisplayWidth { - let sum = self.0.iter() - .map(|anstr| anstr.chars().count()) - .sum(); - - DisplayWidth(sum) + self.0.iter() + .map(|anstr| DisplayWidth::from(anstr.deref())) + .sum() } /// Promotes these contents to a full cell containing them alongside @@ -239,6 +238,12 @@ impl Add for DisplayWidth { } } +impl Sum for DisplayWidth { + fn sum(iter: I) -> Self where I: Iterator { + iter.fold(DisplayWidth(0), Add::add) + } +} + #[cfg(test)] mod width_unit_test { diff --git a/src/output/grid_details.rs b/src/output/grid_details.rs index a32336b94e8226ad174c61e5bb7cbd64635c9500..2b241d0fac110ac46aa362a1558d95a703d567b1 100644 --- a/src/output/grid_details.rs +++ b/src/output/grid_details.rs @@ -158,4 +158,4 @@ fn divide_rounding_up(a: usize, b: usize) -> usize { let mut result = a / b; if a % b != 0 { result += 1; } result -} \ No newline at end of file +}