@@ -119,3 +119,56 @@ impl_individual_parents!(
119119) ;
120120impl_individual_parents ! ( N , usize , & [ crate :: IndividualId ; N ] , self , self . as_slice( ) ) ;
121121impl_individual_parents ! ( N , usize , [ crate :: IndividualId ; N ] , self , self . as_slice( ) ) ;
122+
123+ mod private {
124+ pub trait NewTypeMarker : TryInto < usize , Error = crate :: TskitError > { }
125+ pub trait TableColumnMarker { }
126+ }
127+
128+ impl private:: NewTypeMarker for crate :: EdgeId { }
129+ impl private:: NewTypeMarker for crate :: NodeId { }
130+
131+ pub trait TableColumn < I , T > :
132+ std:: ops:: Index < I , Output = T >
133+ + std:: ops:: Index < usize , Output = T >
134+ + std:: ops:: Index < crate :: SizeType , Output = T >
135+ + private:: TableColumnMarker
136+ {
137+ fn as_slice ( & self ) -> & [ T ] ;
138+ fn get ( & self , at : usize ) -> Option < & T > ;
139+ fn get_with_id ( & self , at : I ) -> Option < & T > ;
140+ fn get_with_size_type ( & self , at : crate :: SizeType ) -> Option < & T > ;
141+ }
142+
143+ impl < T > private:: TableColumnMarker for crate :: table_column:: OpaqueTableColumn < ' _ , T > { }
144+
145+ impl < I , T > std:: ops:: Index < I > for crate :: table_column:: OpaqueTableColumn < ' _ , T >
146+ where
147+ I : private:: NewTypeMarker ,
148+ {
149+ type Output = T ;
150+ fn index ( & self , index : I ) -> & Self :: Output {
151+ & self . 0 [ index. try_into ( ) . unwrap ( ) ]
152+ }
153+ }
154+
155+ impl < I , T > TableColumn < I , T > for crate :: table_column:: OpaqueTableColumn < ' _ , T >
156+ where
157+ I : private:: NewTypeMarker ,
158+ {
159+ fn as_slice ( & self ) -> & [ T ] {
160+ self . 0
161+ }
162+
163+ fn get ( & self , at : usize ) -> Option < & T > {
164+ self . 0 . get ( at)
165+ }
166+
167+ fn get_with_id ( & self , at : I ) -> Option < & T > {
168+ self . 0 . get ( at. try_into ( ) . unwrap ( ) )
169+ }
170+
171+ fn get_with_size_type ( & self , at : crate :: SizeType ) -> Option < & T > {
172+ self . 0 . get ( usize:: try_from ( at) . unwrap ( ) )
173+ }
174+ }
0 commit comments