1use dashmap::RwLock;
2use instant::Instant;
3use rayon::prelude::{IntoParallelRefIterator, ParallelIterator};
4
5use crate::internal::{
6 CRelIndexRead, CRelIndexReadAll, CRelIndexWrite, Freezable, RelIndexMerge, RelIndexRead, RelIndexReadAll,
7 RelIndexWrite,
8};
9
10pub struct CRelNoIndex<V> {
11 pub vec: Vec<RwLock<Vec<V>>>,
13 frozen: bool,
15}
16
17impl<V> Default for CRelNoIndex<V> {
18 #[inline]
19 fn default() -> Self {
20 let threads = rayon::current_num_threads().max(1);
21 let mut vec = Vec::with_capacity(threads);
22 for _ in 0..threads {
23 vec.push(RwLock::new(vec![]));
24 }
25 Self { vec, frozen: false }
26
27 }
29}
30
31impl<V> CRelNoIndex<V> {
32 pub fn hash_usize(&self, _key: &()) -> usize { 0 }
33}
34
35impl<V> Freezable for CRelNoIndex<V> {
36 fn freeze(&mut self) { self.frozen = true; }
37 fn unfreeze(&mut self) { self.frozen = false; }
38}
39
40impl<'a, V: 'a> RelIndexRead<'a> for CRelNoIndex<V> {
41 type Key = ();
42 type Value = &'a V;
43
44 type IteratorType = std::iter::FlatMap<
45 std::slice::Iter<'a, RwLock<Vec<V>>>,
46 std::slice::Iter<'a, V>,
47 fn(&RwLock<Vec<V>>) -> std::slice::Iter<V>,
48 >;
49
50 fn index_get(&'a self, _key: &Self::Key) -> Option<Self::IteratorType> {
51 assert!(self.frozen);
52 let res: Self::IteratorType = self.vec.iter().flat_map(|v| {
53 let data = unsafe { &*v.data_ptr() };
54 data.iter()
55 });
56 Some(res)
57 }
58
59 #[inline(always)]
60 fn len_estimate(&self) -> usize { 1 }
61
62 fn is_empty(&'a self) -> bool { false }
63}
64
65impl<'a, V: 'a + Sync + Send> CRelIndexRead<'a> for CRelNoIndex<V> {
66 type Key = ();
67 type Value = &'a V;
68
69 type IteratorType =
70 rayon::iter::FlatMap<rayon::slice::Iter<'a, RwLock<Vec<V>>>, fn(&RwLock<Vec<V>>) -> rayon::slice::Iter<V>>;
71
72 fn c_index_get(&'a self, _key: &Self::Key) -> Option<Self::IteratorType> {
73 assert!(self.frozen);
74 let res: Self::IteratorType = self.vec.par_iter().flat_map(|v| {
75 let data = unsafe { &*v.data_ptr() };
76 data.par_iter()
77 });
78 Some(res)
79 }
80}
81
82impl<V> RelIndexWrite for CRelNoIndex<V> {
83 type Key = ();
84 type Value = V;
85
86 fn index_insert(&mut self, _key: Self::Key, value: Self::Value) {
87 let shard_idx = rayon::current_thread_index().unwrap_or(0) % self.vec.len();
90 self.vec[shard_idx].get_mut().push(value);
91 }
92}
93
94impl<V> RelIndexMerge for CRelNoIndex<V> {
95 fn move_index_contents(from: &mut Self, to: &mut Self) {
96 let before = Instant::now();
97 assert_eq!(from.len_estimate(), to.len_estimate());
98 from.vec.iter_mut().zip(to.vec.iter_mut()).for_each(|(from, to)| {
103 let from = from.get_mut();
104 let to = to.get_mut();
105
106 if from.len() > to.len() {
107 std::mem::swap(from, to);
108 }
109 to.append(from);
110 });
111 unsafe {
112 crate::internal::MOVE_NO_INDEX_CONTENTS_TOTAL_TIME += before.elapsed();
113 }
114 }
115}
116
117impl<V> CRelIndexWrite for CRelNoIndex<V> {
118 type Key = ();
119 type Value = V;
120
121 fn index_insert(&self, _key: Self::Key, value: Self::Value) {
122 assert!(!self.frozen);
123 let shard_idx = rayon::current_thread_index().unwrap_or(0) % self.vec.len();
124 self.vec[shard_idx].write().push(value);
125 }
126}
127
128impl<'a, V: 'a> RelIndexReadAll<'a> for CRelNoIndex<V> {
129 type Key = &'a ();
130 type Value = &'a V;
131
132 type ValueIteratorType = <Self as RelIndexRead<'a>>::IteratorType;
133
134 type AllIteratorType = std::iter::Once<(&'a (), Self::ValueIteratorType)>;
135
136 fn iter_all(&'a self) -> Self::AllIteratorType { std::iter::once((&(), self.index_get(&()).unwrap())) }
137}
138
139impl<'a, V: 'a + Sync + Send> CRelIndexReadAll<'a> for CRelNoIndex<V> {
140 type Key = &'a ();
141 type Value = &'a V;
142
143 type ValueIteratorType = <Self as CRelIndexRead<'a>>::IteratorType;
144
145 type AllIteratorType = rayon::iter::Once<(&'a (), Self::ValueIteratorType)>;
146
147 fn c_iter_all(&'a self) -> Self::AllIteratorType { rayon::iter::once((&(), self.c_index_get(&()).unwrap())) }
148}