xref: /aosp_15_r20/external/mesa3d/src/compiler/rust/as_slice.rs (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker // Copyright © 2024 Collabora, Ltd.
2*61046927SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker 
4*61046927SAndroid Build Coastguard Worker use std::ops::Index;
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker pub enum AttrList<T: 'static> {
7*61046927SAndroid Build Coastguard Worker     Array(&'static [T]),
8*61046927SAndroid Build Coastguard Worker     Uniform(T),
9*61046927SAndroid Build Coastguard Worker }
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker impl<T: 'static> Index<usize> for AttrList<T> {
12*61046927SAndroid Build Coastguard Worker     type Output = T;
13*61046927SAndroid Build Coastguard Worker 
index(&self, idx: usize) -> &T14*61046927SAndroid Build Coastguard Worker     fn index(&self, idx: usize) -> &T {
15*61046927SAndroid Build Coastguard Worker         match self {
16*61046927SAndroid Build Coastguard Worker             AttrList::Array(arr) => &arr[idx],
17*61046927SAndroid Build Coastguard Worker             AttrList::Uniform(typ) => typ,
18*61046927SAndroid Build Coastguard Worker         }
19*61046927SAndroid Build Coastguard Worker     }
20*61046927SAndroid Build Coastguard Worker }
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker pub trait AsSlice<T> {
23*61046927SAndroid Build Coastguard Worker     type Attr;
24*61046927SAndroid Build Coastguard Worker 
as_slice(&self) -> &[T]25*61046927SAndroid Build Coastguard Worker     fn as_slice(&self) -> &[T];
as_mut_slice(&mut self) -> &mut [T]26*61046927SAndroid Build Coastguard Worker     fn as_mut_slice(&mut self) -> &mut [T];
attrs(&self) -> AttrList<Self::Attr>27*61046927SAndroid Build Coastguard Worker     fn attrs(&self) -> AttrList<Self::Attr>;
28*61046927SAndroid Build Coastguard Worker }
29