| 1 | //! Module contains a dimension estimator for [`CompactTable`] |
| 2 | //! |
| 3 | //! [`CompactTable`]: crate::tables::CompactTable |
| 4 | |
| 5 | use crate::grid::dimension::{Dimension, Estimate}; |
| 6 | |
| 7 | /// A constant size dimension or a value dimension. |
| 8 | #[derive (Debug, Clone, Copy)] |
| 9 | pub struct ConstDimension<const COLUMNS: usize, const ROWS: usize> { |
| 10 | height: ConstSize<ROWS>, |
| 11 | width: ConstSize<COLUMNS>, |
| 12 | } |
| 13 | |
| 14 | impl<const COLUMNS: usize, const ROWS: usize> ConstDimension<COLUMNS, ROWS> { |
| 15 | /// Returns a new dimension object with a given estimates. |
| 16 | pub const fn new(width: ConstSize<COLUMNS>, height: ConstSize<ROWS>) -> Self { |
| 17 | Self { width, height } |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | impl<const COLUMNS: usize, const ROWS: usize> Dimension for ConstDimension<COLUMNS, ROWS> { |
| 22 | fn get_width(&self, column: usize) -> usize { |
| 23 | match self.width { |
| 24 | ConstSize::List(list: [usize; COLUMNS]) => list[column], |
| 25 | ConstSize::Value(val: usize) => val, |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | fn get_height(&self, row: usize) -> usize { |
| 30 | match self.height { |
| 31 | ConstSize::List(list: [usize; ROWS]) => list[row], |
| 32 | ConstSize::Value(val: usize) => val, |
| 33 | } |
| 34 | } |
| 35 | } |
| 36 | |
| 37 | impl<const COLUMNS: usize, const ROWS: usize> From<ConstDimension<COLUMNS, ROWS>> |
| 38 | for (ConstSize<COLUMNS>, ConstSize<ROWS>) |
| 39 | { |
| 40 | fn from(value: ConstDimension<COLUMNS, ROWS>) -> Self { |
| 41 | (value.width, value.height) |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | impl<R, D, const COLUMNS: usize, const ROWS: usize> Estimate<R, D> |
| 46 | for ConstDimension<COLUMNS, ROWS> |
| 47 | { |
| 48 | fn estimate(&mut self, _: R, _: &D) {} |
| 49 | } |
| 50 | |
| 51 | /// Const size represents either a const array values or a single value which responsible for the whole list. |
| 52 | #[derive (Debug, Clone, Copy)] |
| 53 | pub enum ConstSize<const N: usize> { |
| 54 | /// A constant array of estimates. |
| 55 | List([usize; N]), |
| 56 | /// A value which act as a single estimate for all entries. |
| 57 | Value(usize), |
| 58 | } |
| 59 | |
| 60 | impl From<usize> for ConstSize<0> { |
| 61 | fn from(value: usize) -> Self { |
| 62 | ConstSize::Value(value) |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | impl<const N: usize> From<[usize; N]> for ConstSize<N> { |
| 67 | fn from(value: [usize; N]) -> Self { |
| 68 | ConstSize::List(value) |
| 69 | } |
| 70 | } |
| 71 | |