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 | |