ospf_rust_multiarray/
map_vector.rs1use 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
98macro_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}