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