1use crate::{funvec_ref::FunVecRef, funvec_val::FunVec, index::IntoIndex};
2use std::collections::{BTreeMap, HashMap};
3
4const DIM: usize = 3;
5const LOW_DIM: usize = DIM - 1;
6
7impl<T: Clone + Copy, V1: FunVec<LOW_DIM, T>> FunVec<DIM, T> for Vec<V1> {
9 #[inline(always)]
10 fn at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<T> {
11 let [i, j, k] = index.into_index();
12 self.get(i).and_then(|x| x.at([j, k]))
13 }
14}
15impl<const N: usize, T: Clone + Copy, V1: FunVec<LOW_DIM, T>> FunVec<DIM, T> for [V1; N] {
16 #[inline(always)]
17 fn at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<T> {
18 let [i, j, k] = index.into_index();
19 self.get(i).and_then(|x| x.at([j, k]))
20 }
21}
22
23impl<T: Clone + Copy, V1: FunVec<LOW_DIM, T>> FunVec<DIM, T> for HashMap<usize, V1> {
24 #[inline(always)]
25 fn at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<T> {
26 let [i, j, k] = index.into_index();
27 self.get(&i).and_then(|x| x.at([j, k]))
28 }
29}
30impl<T: Clone + Copy, V1: FunVec<LOW_DIM, T>> FunVec<DIM, T> for BTreeMap<usize, V1> {
31 #[inline(always)]
32 fn at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<T> {
33 let [i, j, k] = index.into_index();
34 self.get(&i).and_then(|x| x.at([j, k]))
35 }
36}
37
38impl<T: Clone + Copy, V1: FunVecRef<LOW_DIM, T>> FunVecRef<DIM, T> for Vec<V1> {
40 #[inline(always)]
41 fn ref_at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<&T> {
42 let [i, j, k] = index.into_index();
43 self.get(i).and_then(|x| x.ref_at([j, k]))
44 }
45}
46impl<const N: usize, T, V1: FunVecRef<LOW_DIM, T>> FunVecRef<DIM, T> for [V1; N] {
47 #[inline(always)]
48 fn ref_at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<&T> {
49 let [i, j, k] = index.into_index();
50 self.get(i).and_then(|x| x.ref_at([j, k]))
51 }
52}
53
54impl<T, V1: FunVecRef<LOW_DIM, T>> FunVecRef<DIM, T> for HashMap<usize, V1> {
55 #[inline(always)]
56 fn ref_at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<&T> {
57 let [i, j, k] = index.into_index();
58 self.get(&i).and_then(|x| x.ref_at([j, k]))
59 }
60}
61impl<T, V1: FunVecRef<LOW_DIM, T>> FunVecRef<DIM, T> for BTreeMap<usize, V1> {
62 #[inline(always)]
63 fn ref_at<Idx: IntoIndex<DIM>>(&self, index: Idx) -> Option<&T> {
64 let [i, j, k] = index.into_index();
65 self.get(&i).and_then(|x| x.ref_at([j, k]))
66 }
67}