ospf_rust_multiarray/
map_vector.rs

1use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
2
3use crate::dummy_vector::DummyIndexRange;
4
5pub struct PlaceHolder {
6    index: usize,
7}
8
9const _0: PlaceHolder = PlaceHolder { index: 0 };
10const _1: PlaceHolder = PlaceHolder { index: 1 };
11const _2: PlaceHolder = PlaceHolder { index: 2 };
12const _3: PlaceHolder = PlaceHolder { index: 3 };
13const _4: PlaceHolder = PlaceHolder { index: 4 };
14const _5: PlaceHolder = PlaceHolder { index: 5 };
15const _6: PlaceHolder = PlaceHolder { index: 6 };
16const _7: PlaceHolder = PlaceHolder { index: 7 };
17const _8: PlaceHolder = PlaceHolder { index: 8 };
18const _9: PlaceHolder = PlaceHolder { index: 9 };
19const _10: PlaceHolder = PlaceHolder { index: 10 };
20const _11: PlaceHolder = PlaceHolder { index: 11 };
21const _12: PlaceHolder = PlaceHolder { index: 12 };
22const _13: PlaceHolder = PlaceHolder { index: 13 };
23const _14: PlaceHolder = PlaceHolder { index: 14 };
24const _15: PlaceHolder = PlaceHolder { index: 15 };
25const _16: PlaceHolder = PlaceHolder { index: 16 };
26const _17: PlaceHolder = PlaceHolder { index: 17 };
27const _18: PlaceHolder = PlaceHolder { index: 18 };
28const _19: PlaceHolder = PlaceHolder { index: 19 };
29const _20: PlaceHolder = PlaceHolder { index: 20 };
30
31pub(super) enum MapIndex<'a> {
32    Index(isize),
33    Range(Box<dyn DummyIndexRange>),
34    IndexArray(Box<dyn Iterator<Item = isize> + 'a>),
35    Map(PlaceHolder),
36}
37
38impl<'a> From<isize> for MapIndex<'a> {
39    fn from(value: isize) -> Self {
40        Self::Index(value)
41    }
42}
43
44impl<'a> From<usize> for MapIndex<'a> {
45    fn from(value: usize) -> Self {
46        Self::Index(value as isize)
47    }
48}
49
50impl<'a> From<Range<isize>> for MapIndex<'a> {
51    fn from(range: Range<isize>) -> Self {
52        Self::Range(Box::new(range))
53    }
54}
55
56impl<'a> From<RangeFrom<isize>> for MapIndex<'a> {
57    fn from(range: RangeFrom<isize>) -> Self {
58        Self::Range(Box::new(range))
59    }
60}
61
62impl<'a> From<RangeInclusive<isize>> for MapIndex<'a> {
63    fn from(range: RangeInclusive<isize>) -> Self {
64        Self::Range(Box::new(range))
65    }
66}
67
68impl<'a> From<RangeTo<isize>> for MapIndex<'a> {
69    fn from(range: RangeTo<isize>) -> Self {
70        Self::Range(Box::new(range))
71    }
72}
73
74impl<'a> From<RangeToInclusive<isize>> for MapIndex<'a> {
75    fn from(range: RangeToInclusive<isize>) -> Self {
76        Self::Range(Box::new(range))
77    }
78}
79
80impl<'a> From<RangeFull> for MapIndex<'a> {
81    fn from(range: RangeFull) -> Self {
82        Self::Range(Box::new(range))
83    }
84}
85
86impl<'a> From<&'a [isize]> for MapIndex<'a> {
87    fn from(indexes: &'a [isize]) -> Self {
88        Self::IndexArray(Box::new(indexes.iter().map(|index| *index)))
89    }
90}
91
92impl<'a> From<PlaceHolder> for MapIndex<'a> {
93    fn from(holder: PlaceHolder) -> Self {
94        Self::Map(holder)
95    }
96}
97
98// pub(super) struct MapAccessPolicy<'a, S: Shape> {
99//     vector: &'a S::MapVectorType,
100//     shape: S,
101//     now: RefCell<S::VectorType>,
102// }
103
104macro_rules! map_index {
105    ($x:literal) => {
106        MapIndex::from($x as isize)
107    };
108    ($x:expr) => {
109        MapIndex::from($x)
110    };
111}
112
113#[macro_export]
114macro_rules! map {
115    ($($x:expr),*) => {
116        &[$(map_index!($x),)*]
117    };
118}
119
120#[macro_export]
121macro_rules! dyn_map {
122    ($($x:expr),*) => {
123        &vec!($(map_index!($x),)*)
124    };
125}