1pub use inner::*;
4
5#[cfg(feature = "sync")]
6mod inner {
7 #![allow(
8 clippy::disallowed_types,
9 reason = "implementation the rule says to use"
10 )]
11
12 pub use core::marker::Send as MaybeSend;
13 pub use core::marker::Sync as MaybeSync;
14 pub use std::sync::Arc as MaybeArc;
15 pub use std::sync::OnceLock as MaybeOnceLock;
16
17 pub use dashmap::DashMap as MaybeDashMap;
18 pub use dashmap::DashSet as MaybeDashSet;
19}
20
21#[cfg(not(feature = "sync"))]
22mod inner {
23 pub use std::cell::OnceCell as MaybeOnceLock;
24 use std::cell::Ref;
25 use std::cell::RefCell;
26 use std::collections::HashMap;
27 use std::hash::BuildHasher;
28 use std::hash::Hash;
29 use std::hash::RandomState;
30 pub use std::rc::Rc as MaybeArc;
31
32 pub trait MaybeSync {}
33 impl<T> MaybeSync for T where T: ?Sized {}
34 pub trait MaybeSend {}
35 impl<T> MaybeSend for T where T: ?Sized {}
36
37 #[derive(Debug)]
39 pub struct MaybeDashMap<K, V, S = RandomState>(RefCell<HashMap<K, V, S>>);
40
41 impl<K, V, S> Default for MaybeDashMap<K, V, S>
42 where
43 K: Eq + Hash,
44 S: Default + BuildHasher + Clone,
45 {
46 fn default() -> Self {
47 Self(RefCell::new(Default::default()))
48 }
49 }
50
51 impl<K: Eq + Hash, V, S: BuildHasher> MaybeDashMap<K, V, S> {
52 pub fn get<'a, Q: Eq + Hash + ?Sized>(
53 &'a self,
54 key: &Q,
55 ) -> Option<Ref<'a, V>>
56 where
57 K: std::borrow::Borrow<Q>,
58 {
59 Ref::filter_map(self.0.borrow(), |map| map.get(key)).ok()
60 }
61
62 pub fn insert(&self, key: K, value: V) -> Option<V> {
63 let mut inner = self.0.borrow_mut();
64 inner.insert(key, value)
65 }
66
67 pub fn clear(&self) {
68 self.0.borrow_mut().clear();
69 }
70
71 pub fn remove(&self, key: &K) -> Option<(K, V)> {
72 self.0.borrow_mut().remove_entry(key)
73 }
74
75 #[allow(clippy::len_without_is_empty)]
76 pub fn len(&self) -> usize {
77 self.0.borrow().len()
78 }
79 }
80
81 #[derive(Debug)]
83 pub struct MaybeDashSet<V, S = RandomState>(
84 RefCell<std::collections::HashSet<V, S>>,
85 );
86
87 impl<V, S> Default for MaybeDashSet<V, S>
88 where
89 V: Eq + Hash,
90 S: Default + BuildHasher + Clone,
91 {
92 fn default() -> Self {
93 Self(RefCell::new(Default::default()))
94 }
95 }
96
97 impl<V: Eq + Hash, S: BuildHasher> MaybeDashSet<V, S> {
98 pub fn insert(&self, value: V) -> bool {
99 let mut inner = self.0.borrow_mut();
100 inner.insert(value)
101 }
102 }
103}
104
105#[allow(
106 clippy::disallowed_types,
107 reason = "implementation the rule says to use"
108)]
109#[inline]
110pub fn new_rc<T>(value: T) -> MaybeArc<T> {
111 MaybeArc::new(value)
112}
113
114#[allow(
115 clippy::disallowed_types,
116 reason = "implementation the rule says to use"
117)]
118#[inline]
119pub fn new_arc<T>(value: T) -> std::sync::Arc<T> {
120 std::sync::Arc::new(value)
121}