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