|
1 | | -macro_rules! make_table_column { |
2 | | - ($name: ident, $index: ident) => { |
3 | | - /// Immutable view of a (non-ragged) column |
4 | | - #[derive(Clone, Debug)] |
5 | | - #[repr(transparent)] |
6 | | - pub struct $name<'table, T>(&'table [T]); |
| 1 | +#[repr(transparent)] |
| 2 | +#[derive(Clone)] |
| 3 | +pub(crate) struct OpaqueTableColumn<'table, T>(pub(crate) &'table [T]); |
7 | 4 |
|
8 | | - impl<'table, T> $name<'table, T> { |
9 | | - pub(crate) fn new(column: &'table [T]) -> $name<'table, T> { |
10 | | - Self(column) |
11 | | - } |
| 5 | +impl<T> std::ops::Index<usize> for OpaqueTableColumn<'_, T> { |
| 6 | + type Output = T; |
12 | 7 |
|
13 | | - /// View the underlying slice |
14 | | - pub fn as_slice(&self) -> &[T] { |
15 | | - self.0 |
16 | | - } |
17 | | - |
18 | | - pub fn get_with_id(&self, index: crate::$index) -> Option<&T> { |
19 | | - self.get_with_usize(usize::try_from(index).ok()?) |
20 | | - } |
21 | | - |
22 | | - pub fn get_with_size_type(&self, index: crate::SizeType) -> Option<&T> { |
23 | | - self.get_with_usize(usize::try_from(index).ok()?) |
24 | | - } |
25 | | - |
26 | | - pub fn get_with_usize(&self, index: usize) -> Option<&T> { |
27 | | - self.0.get(index) |
28 | | - } |
29 | | - } |
30 | | - |
31 | | - impl<'table, T> $name<'table, T> |
32 | | - where |
33 | | - T: Copy, |
34 | | - { |
35 | | - pub fn iter(&self) -> impl Iterator<Item = T> + '_ { |
36 | | - self.0.iter().map(|&value| value) |
37 | | - } |
38 | | - } |
39 | | - |
40 | | - impl<T> std::ops::Index<usize> for $name<'_, T> { |
41 | | - type Output = T; |
42 | | - fn index(&self, index: usize) -> &Self::Output { |
43 | | - &self.0[index] |
44 | | - } |
45 | | - } |
46 | | - |
47 | | - impl<T> std::ops::Index<crate::$index> for $name<'_, T> { |
48 | | - type Output = T; |
49 | | - fn index(&self, index: crate::$index) -> &Self::Output { |
50 | | - &self.0[usize::try_from(index).unwrap()] |
51 | | - } |
52 | | - } |
53 | | - |
54 | | - impl<T> std::ops::Index<crate::SizeType> for $name<'_, T> { |
55 | | - type Output = T; |
56 | | - fn index(&self, index: crate::SizeType) -> &Self::Output { |
57 | | - &self.0[usize::try_from(index).unwrap()] |
58 | | - } |
59 | | - } |
60 | | - |
61 | | - impl<T> std::convert::AsRef<[T]> for $name<'_, T> { |
62 | | - fn as_ref(&self) -> &[T] { |
63 | | - self.as_slice() |
64 | | - } |
65 | | - } |
66 | | - }; |
| 8 | + fn index(&self, index: usize) -> &Self::Output { |
| 9 | + &self.0[index] |
| 10 | + } |
67 | 11 | } |
68 | 12 |
|
69 | | -make_table_column!(NodeTableColumn, NodeId); |
70 | | -make_table_column!(EdgeTableColumn, EdgeId); |
71 | | -make_table_column!(SiteTableColumn, SiteId); |
72 | | -make_table_column!(MutationTableColumn, MutationId); |
73 | | -make_table_column!(PopulationTableColumn, PopulationId); |
74 | | -make_table_column!(IndividualTableColumn, IndividualId); |
75 | | -make_table_column!(MigrationTableColumn, MigrationId); |
76 | | - |
77 | | -#[cfg(test)] |
78 | | -make_table_column!(TestTableColumn, NodeId); |
79 | | - |
80 | | -#[test] |
81 | | -fn test_table_column_get_usize() { |
82 | | - let v = vec![1, 2, 3]; |
83 | | - let c = TestTableColumn::new(&v); |
84 | | - assert_eq!(c.get_with_usize(1), Some(&2)) |
85 | | -} |
| 13 | +impl<T> std::ops::Index<crate::SizeType> for OpaqueTableColumn<'_, T> { |
| 14 | + type Output = T; |
86 | 15 |
|
87 | | -#[test] |
88 | | -fn test_table_column_get_size_type() { |
89 | | - let v = vec![1, 2, 3]; |
90 | | - let c = TestTableColumn(&v); |
91 | | - assert_eq!(c.get_with_size_type(crate::SizeType::from(1)), Some(&2)) |
| 16 | + fn index(&self, index: crate::SizeType) -> &Self::Output { |
| 17 | + &self.0[usize::try_from(index).unwrap()] |
| 18 | + } |
92 | 19 | } |
93 | 20 |
|
94 | | -#[test] |
95 | | -fn test_table_column_get_id() { |
96 | | - let v = vec![1, 2, 3]; |
97 | | - let c = TestTableColumn::new(&v); |
98 | | - assert_eq!(c.get_with_id(1.into()), Some(&2)) |
| 21 | +impl<T> std::ops::Index<crate::EdgeId> for OpaqueTableColumn<'_, T> { |
| 22 | + type Output = T; |
| 23 | + fn index(&self, index: crate::EdgeId) -> &Self::Output { |
| 24 | + &self.0[usize::try_from(index).unwrap()] |
| 25 | + } |
99 | 26 | } |
100 | 27 |
|
101 | | -#[test] |
102 | | -fn test_table_column_as_ref() { |
103 | | - let v = vec![1, 2, 3]; |
104 | | - let c = TestTableColumn::new(&v); |
105 | | - assert_eq!(c.as_ref(), v.as_slice()) |
| 28 | +pub trait TableColumn<I, T>: |
| 29 | + std::ops::Index<I, Output = T> |
| 30 | + + std::ops::Index<usize, Output = T> |
| 31 | + + std::ops::Index<crate::SizeType, Output = T> |
| 32 | +{ |
| 33 | + fn as_slice(&self) -> &[T]; |
106 | 34 | } |
107 | 35 |
|
108 | | -#[test] |
109 | | -fn test_table_column_iter() { |
110 | | - let v = vec![1, 2, 3]; |
111 | | - let c = TestTableColumn::new(&v); |
112 | | - assert_eq!(c.iter().collect::<Vec::<_>>(), [1, 2, 3]); |
| 36 | +impl TableColumn<crate::EdgeId, crate::NodeId> for OpaqueTableColumn<'_, crate::NodeId> { |
| 37 | + fn as_slice(&self) -> &[crate::NodeId] { |
| 38 | + self.0 |
| 39 | + } |
113 | 40 | } |
| 41 | +// macro_rules! make_table_column { |
| 42 | +// ($name: ident, $index: ident) => { |
| 43 | +// /// Immutable view of a (non-ragged) column |
| 44 | +// #[derive(Clone, Debug)] |
| 45 | +// #[repr(transparent)] |
| 46 | +// pub struct $name<'table, T>(&'table [T]); |
| 47 | +// |
| 48 | +// impl<'table, T> $name<'table, T> { |
| 49 | +// pub(crate) fn new(column: &'table [T]) -> $name<'table, T> { |
| 50 | +// Self(column) |
| 51 | +// } |
| 52 | +// |
| 53 | +// /// View the underlying slice |
| 54 | +// pub fn as_slice(&self) -> &[T] { |
| 55 | +// self.0 |
| 56 | +// } |
| 57 | +// |
| 58 | +// pub fn get_with_id(&self, index: crate::$index) -> Option<&T> { |
| 59 | +// self.get_with_usize(usize::try_from(index).ok()?) |
| 60 | +// } |
| 61 | +// |
| 62 | +// pub fn get_with_size_type(&self, index: crate::SizeType) -> Option<&T> { |
| 63 | +// self.get_with_usize(usize::try_from(index).ok()?) |
| 64 | +// } |
| 65 | +// |
| 66 | +// pub fn get_with_usize(&self, index: usize) -> Option<&T> { |
| 67 | +// self.0.get(index) |
| 68 | +// } |
| 69 | +// } |
| 70 | +// |
| 71 | +// impl<'table, T> $name<'table, T> |
| 72 | +// where |
| 73 | +// T: Copy, |
| 74 | +// { |
| 75 | +// pub fn iter(&self) -> impl Iterator<Item = T> + '_ { |
| 76 | +// self.0.iter().map(|&value| value) |
| 77 | +// } |
| 78 | +// } |
| 79 | +// |
| 80 | +// impl<T> std::ops::Index<usize> for $name<'_, T> { |
| 81 | +// type Output = T; |
| 82 | +// fn index(&self, index: usize) -> &Self::Output { |
| 83 | +// &self.0[index] |
| 84 | +// } |
| 85 | +// } |
| 86 | +// |
| 87 | +// impl<T> std::ops::Index<crate::$index> for $name<'_, T> { |
| 88 | +// type Output = T; |
| 89 | +// fn index(&self, index: crate::$index) -> &Self::Output { |
| 90 | +// &self.0[usize::try_from(index).unwrap()] |
| 91 | +// } |
| 92 | +// } |
| 93 | +// |
| 94 | +// impl<T> std::ops::Index<crate::SizeType> for $name<'_, T> { |
| 95 | +// type Output = T; |
| 96 | +// fn index(&self, index: crate::SizeType) -> &Self::Output { |
| 97 | +// &self.0[usize::try_from(index).unwrap()] |
| 98 | +// } |
| 99 | +// } |
| 100 | +// |
| 101 | +// impl<T> std::convert::AsRef<[T]> for $name<'_, T> { |
| 102 | +// fn as_ref(&self) -> &[T] { |
| 103 | +// self.as_slice() |
| 104 | +// } |
| 105 | +// } |
| 106 | +// }; |
| 107 | +// } |
| 108 | +// |
| 109 | +// make_table_column!(NodeTableColumn, NodeId); |
| 110 | +// make_table_column!(EdgeTableColumn, EdgeId); |
| 111 | +// make_table_column!(SiteTableColumn, SiteId); |
| 112 | +// make_table_column!(MutationTableColumn, MutationId); |
| 113 | +// make_table_column!(PopulationTableColumn, PopulationId); |
| 114 | +// make_table_column!(IndividualTableColumn, IndividualId); |
| 115 | +// make_table_column!(MigrationTableColumn, MigrationId); |
| 116 | +// |
| 117 | +// #[cfg(test)] |
| 118 | +// make_table_column!(TestTableColumn, NodeId); |
| 119 | +// |
| 120 | +// #[test] |
| 121 | +// fn test_table_column_get_usize() { |
| 122 | +// let v = vec![1, 2, 3]; |
| 123 | +// let c = TestTableColumn::new(&v); |
| 124 | +// assert_eq!(c.get_with_usize(1), Some(&2)) |
| 125 | +// } |
| 126 | +// |
| 127 | +// #[test] |
| 128 | +// fn test_table_column_get_size_type() { |
| 129 | +// let v = vec![1, 2, 3]; |
| 130 | +// let c = TestTableColumn(&v); |
| 131 | +// assert_eq!(c.get_with_size_type(crate::SizeType::from(1)), Some(&2)) |
| 132 | +// } |
| 133 | +// |
| 134 | +// #[test] |
| 135 | +// fn test_table_column_get_id() { |
| 136 | +// let v = vec![1, 2, 3]; |
| 137 | +// let c = TestTableColumn::new(&v); |
| 138 | +// assert_eq!(c.get_with_id(1.into()), Some(&2)) |
| 139 | +// } |
| 140 | +// |
| 141 | +// #[test] |
| 142 | +// fn test_table_column_as_ref() { |
| 143 | +// let v = vec![1, 2, 3]; |
| 144 | +// let c = TestTableColumn::new(&v); |
| 145 | +// assert_eq!(c.as_ref(), v.as_slice()) |
| 146 | +// } |
| 147 | +// |
| 148 | +// #[test] |
| 149 | +// fn test_table_column_iter() { |
| 150 | +// let v = vec![1, 2, 3]; |
| 151 | +// let c = TestTableColumn::new(&v); |
| 152 | +// assert_eq!(c.iter().collect::<Vec::<_>>(), [1, 2, 3]); |
| 153 | +// } |
0 commit comments