highlight_map.rs

 1use std::{num::NonZeroU32, sync::Arc};
 2
 3#[derive(Clone, Debug)]
 4pub struct HighlightMap(Arc<[Option<HighlightId>]>);
 5
 6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
 7pub struct HighlightId(NonZeroU32);
 8
 9impl HighlightId {
10    pub const TABSTOP_INSERT_ID: HighlightId = HighlightId(NonZeroU32::new(u32::MAX - 1).unwrap());
11    pub const TABSTOP_REPLACE_ID: HighlightId = HighlightId(NonZeroU32::new(u32::MAX - 2).unwrap());
12
13    pub fn new(capture_id: u32) -> Self {
14        Self(NonZeroU32::new(capture_id + 1).unwrap_or(NonZeroU32::MAX))
15    }
16}
17
18impl From<HighlightId> for usize {
19    fn from(value: HighlightId) -> Self {
20        value.0.get() as usize - 1
21    }
22}
23
24impl HighlightMap {
25    #[inline]
26    pub fn from_ids(highlight_ids: impl IntoIterator<Item = Option<HighlightId>>) -> Self {
27        Self(highlight_ids.into_iter().collect())
28    }
29
30    #[inline]
31    pub fn get(&self, capture_id: u32) -> Option<HighlightId> {
32        self.0.get(capture_id as usize).copied().flatten()
33    }
34}
35
36impl Default for HighlightMap {
37    fn default() -> Self {
38        Self(Arc::new([]))
39    }
40}