diff options
author | Jonas Schievink <[email protected]> | 2021-04-01 21:24:40 +0100 |
---|---|---|
committer | Jonas Schievink <[email protected]> | 2021-04-01 21:24:40 +0100 |
commit | afd83e0686512ad2678a2b0bad3b1421692a28bf (patch) | |
tree | b3c34e9c041821acbad8d2d4518d719165268bd7 /crates | |
parent | 39d992ef559c9cd67551819a9d63ef52ef7b725f (diff) |
Remove unnecessary region, relax `Sized` bounds
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir_def/src/intern.rs | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/crates/hir_def/src/intern.rs b/crates/hir_def/src/intern.rs index 4d8fbd324..18c8ab246 100644 --- a/crates/hir_def/src/intern.rs +++ b/crates/hir_def/src/intern.rs | |||
@@ -16,7 +16,7 @@ use rustc_hash::FxHasher; | |||
16 | type InternMap<T> = DashMap<Arc<T>, (), BuildHasherDefault<FxHasher>>; | 16 | type InternMap<T> = DashMap<Arc<T>, (), BuildHasherDefault<FxHasher>>; |
17 | 17 | ||
18 | #[derive(Hash)] | 18 | #[derive(Hash)] |
19 | pub struct Interned<T: Internable> { | 19 | pub struct Interned<T: Internable + ?Sized> { |
20 | arc: Arc<T>, | 20 | arc: Arc<T>, |
21 | } | 21 | } |
22 | 22 | ||
@@ -52,7 +52,7 @@ impl<T: Internable> Interned<T> { | |||
52 | } | 52 | } |
53 | } | 53 | } |
54 | 54 | ||
55 | impl<T: Internable> Drop for Interned<T> { | 55 | impl<T: Internable + ?Sized> Drop for Interned<T> { |
56 | fn drop(&mut self) { | 56 | fn drop(&mut self) { |
57 | // When the last `Ref` is dropped, remove the object from the global map. | 57 | // When the last `Ref` is dropped, remove the object from the global map. |
58 | if Arc::strong_count(&self.arc) == 2 { | 58 | if Arc::strong_count(&self.arc) == 2 { |
@@ -83,23 +83,23 @@ impl<T: Internable> Drop for Interned<T> { | |||
83 | } | 83 | } |
84 | 84 | ||
85 | /// Compares interned `Ref`s using pointer equality. | 85 | /// Compares interned `Ref`s using pointer equality. |
86 | impl<T: Internable> PartialEq for Interned<T> { | 86 | impl<T: Internable + ?Sized> PartialEq for Interned<T> { |
87 | #[inline] | 87 | #[inline] |
88 | fn eq(&self, other: &Self) -> bool { | 88 | fn eq(&self, other: &Self) -> bool { |
89 | Arc::ptr_eq(&self.arc, &other.arc) | 89 | Arc::ptr_eq(&self.arc, &other.arc) |
90 | } | 90 | } |
91 | } | 91 | } |
92 | 92 | ||
93 | impl<T: Internable> Eq for Interned<T> {} | 93 | impl<T: Internable + ?Sized> Eq for Interned<T> {} |
94 | 94 | ||
95 | impl<T: Internable> AsRef<T> for Interned<T> { | 95 | impl<T: Internable + ?Sized> AsRef<T> for Interned<T> { |
96 | #[inline] | 96 | #[inline] |
97 | fn as_ref(&self) -> &T { | 97 | fn as_ref(&self) -> &T { |
98 | &self.arc | 98 | &self.arc |
99 | } | 99 | } |
100 | } | 100 | } |
101 | 101 | ||
102 | impl<T: Internable> Deref for Interned<T> { | 102 | impl<T: Internable + ?Sized> Deref for Interned<T> { |
103 | type Target = T; | 103 | type Target = T; |
104 | 104 | ||
105 | #[inline] | 105 | #[inline] |
@@ -108,40 +108,38 @@ impl<T: Internable> Deref for Interned<T> { | |||
108 | } | 108 | } |
109 | } | 109 | } |
110 | 110 | ||
111 | impl<T: Internable> Clone for Interned<T> { | 111 | impl<T: Internable + ?Sized> Clone for Interned<T> { |
112 | fn clone(&self) -> Self { | 112 | fn clone(&self) -> Self { |
113 | Self { arc: self.arc.clone() } | 113 | Self { arc: self.arc.clone() } |
114 | } | 114 | } |
115 | } | 115 | } |
116 | 116 | ||
117 | impl<T: Debug + Internable> Debug for Interned<T> { | 117 | impl<T: Debug + Internable + ?Sized> Debug for Interned<T> { |
118 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 118 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
119 | (*self.arc).fmt(f) | 119 | (*self.arc).fmt(f) |
120 | } | 120 | } |
121 | } | 121 | } |
122 | 122 | ||
123 | pub struct InternStorage<T> { | 123 | pub struct InternStorage<T: ?Sized> { |
124 | map: OnceCell<InternMap<T>>, | 124 | map: OnceCell<InternMap<T>>, |
125 | } | 125 | } |
126 | 126 | ||
127 | impl<T> InternStorage<T> { | 127 | impl<T: ?Sized> InternStorage<T> { |
128 | pub const fn new() -> Self { | 128 | pub const fn new() -> Self { |
129 | Self { map: OnceCell::new() } | 129 | Self { map: OnceCell::new() } |
130 | } | 130 | } |
131 | } | 131 | } |
132 | 132 | ||
133 | impl<T: Internable> InternStorage<T> { | 133 | impl<T: Internable + ?Sized> InternStorage<T> { |
134 | fn get(&self) -> &InternMap<T> { | 134 | fn get(&self) -> &InternMap<T> { |
135 | self.map.get_or_init(DashMap::default) | 135 | self.map.get_or_init(DashMap::default) |
136 | } | 136 | } |
137 | } | 137 | } |
138 | 138 | ||
139 | pub trait Internable: Hash + Eq + Sized + 'static { | 139 | pub trait Internable: Hash + Eq + 'static { |
140 | fn storage() -> &'static InternStorage<Self>; | 140 | fn storage() -> &'static InternStorage<Self>; |
141 | } | 141 | } |
142 | 142 | ||
143 | // region:`Internable` implementations | ||
144 | |||
145 | macro_rules! impl_internable { | 143 | macro_rules! impl_internable { |
146 | ( $($t:ty),+ $(,)? ) => { $( | 144 | ( $($t:ty),+ $(,)? ) => { $( |
147 | impl Internable for $t { | 145 | impl Internable for $t { |
@@ -154,5 +152,3 @@ macro_rules! impl_internable { | |||
154 | } | 152 | } |
155 | 153 | ||
156 | impl_internable!(crate::type_ref::TypeRef, crate::type_ref::TraitRef, crate::path::ModPath); | 154 | impl_internable!(crate::type_ref::TypeRef, crate::type_ref::TraitRef, crate::path::ModPath); |
157 | |||
158 | // endregion | ||