Skip to content

Commit 8d017a1

Browse files
joseph-giogeieredgar
authored andcommitted
remove Borrow from Leak
1 parent 7443a31 commit 8d017a1

File tree

3 files changed

+33
-66
lines changed

3 files changed

+33
-66
lines changed

crates/bevy_ecs/src/schedule/set.rs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::any::TypeId;
2-
use std::borrow::Borrow;
32
use std::fmt::Debug;
43
use std::hash::{Hash, Hasher};
54
use std::marker::PhantomData;
@@ -79,21 +78,7 @@ pub trait SystemSet: DynHash + Debug + Send + Sync + 'static {
7978

8079
impl From<&dyn SystemSet> for Interned<dyn SystemSet> {
8180
fn from(value: &dyn SystemSet) -> Interned<dyn SystemSet> {
82-
struct LeakHelper<'a>(&'a dyn SystemSet);
83-
84-
impl<'a> Borrow<dyn SystemSet> for LeakHelper<'a> {
85-
fn borrow(&self) -> &dyn SystemSet {
86-
self.0
87-
}
88-
}
89-
90-
impl<'a> Leak<dyn SystemSet> for LeakHelper<'a> {
91-
fn leak(self) -> &'static dyn SystemSet {
92-
Box::leak(self.0.dyn_clone())
93-
}
94-
}
95-
96-
SYSTEM_SET_INTERNER.intern(LeakHelper(value))
81+
SYSTEM_SET_INTERNER.intern(value)
9782
}
9883
}
9984

@@ -111,6 +96,12 @@ impl Hash for dyn SystemSet {
11196
}
11297
}
11398

99+
impl Leak for dyn SystemSet {
100+
fn leak(&self) -> &'static Self {
101+
Box::leak(self.dyn_clone())
102+
}
103+
}
104+
114105
impl StaticRef for dyn SystemSet {
115106
fn static_ref(&self) -> Option<&'static dyn SystemSet> {
116107
self.dyn_static_ref()

crates/bevy_utils/src/intern.rs

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//! and make comparisons for any type as fast as integers.
66
77
use std::{
8-
borrow::{Borrow, Cow},
8+
borrow::Borrow,
99
fmt::Debug,
1010
hash::Hash,
1111
ops::Deref,
@@ -76,31 +76,15 @@ impl<T> From<&Interned<T>> for Interned<T> {
7676
/// A trait for leaking data.
7777
///
7878
/// This is used by [`Interner<T>`] to create static references for values that are interned.
79-
///
80-
/// It is implemented for static references of `T`, [`Box<T>`], and [`Cow<'static, T>`].
81-
pub trait Leak<T: ?Sized>: Borrow<T> {
82-
/// Creates a static reference to a value equal to `self.borrow()`, possibly leaking memory.
83-
fn leak(self) -> &'static T;
84-
}
85-
86-
impl<T: ?Sized> Leak<T> for &'static T {
87-
fn leak(self) -> &'static T {
88-
self
89-
}
79+
pub trait Leak {
80+
/// Creates a static reference to `self`, possibly leaking memory.
81+
fn leak(&self) -> &'static Self;
9082
}
9183

92-
impl<T: ?Sized> Leak<T> for Box<T> {
93-
fn leak(self) -> &'static T {
94-
Box::leak(self)
95-
}
96-
}
97-
98-
impl<T: Clone + ?Sized> Leak<T> for Cow<'static, T> {
99-
fn leak(self) -> &'static T {
100-
match self {
101-
Cow::Borrowed(value) => value,
102-
Cow::Owned(value) => Box::leak(Box::new(value)),
103-
}
84+
impl Leak for str {
85+
fn leak(&self) -> &'static Self {
86+
let str = self.to_owned().into_boxed_str();
87+
Box::leak(str)
10488
}
10589
}
10690

@@ -161,16 +145,16 @@ impl<T: ?Sized> Interner<T> {
161145
}
162146
}
163147

164-
impl<T: StaticRef + Hash + Eq + ?Sized> Interner<T> {
148+
impl<T: Leak + StaticRef + Hash + Eq + ?Sized> Interner<T> {
165149
/// Return the [`Interned<T>`] corresponding to `value`.
166150
///
167151
/// If it is called the first time for `value`, it will possibly leak the value and return an
168152
/// [`Interned<T>`] using the obtained static reference. Subsequent calls for the same `value`
169153
/// will return [`Interned<T>`] using the same static reference.
170154
///
171155
/// This uses [`StaticRef::static_ref`] to short-circuit the interning process.
172-
pub fn intern<Q: Leak<T>>(&self, value: Q) -> Interned<T> {
173-
if let Some(value) = value.borrow().static_ref() {
156+
pub fn intern(&self, value: &T) -> Interned<T> {
157+
if let Some(value) = value.static_ref() {
174158
return Interned(value);
175159
}
176160
let lock = self.0.get_or_init(Default::default);
@@ -219,15 +203,15 @@ mod tests {
219203
}
220204
}
221205

222-
impl Leak<A> for A {
223-
fn leak(self) -> &'static Self {
206+
impl Leak for A {
207+
fn leak(&self) -> &'static Self {
224208
&A
225209
}
226210
}
227211

228212
let interner = Interner::default();
229-
let x = interner.intern(A);
230-
let y = interner.intern(A);
213+
let x = interner.intern(&A);
214+
let y = interner.intern(&A);
231215
assert_eq!(x, y);
232216
}
233217

@@ -248,8 +232,8 @@ mod tests {
248232
}
249233
}
250234

251-
impl Leak<A> for A {
252-
fn leak(self) -> &'static Self {
235+
impl Leak for A {
236+
fn leak(&self) -> &'static Self {
253237
match self {
254238
A::X => &A::X,
255239
A::Y => &A::Y,
@@ -258,8 +242,8 @@ mod tests {
258242
}
259243

260244
let interner = Interner::default();
261-
let x = interner.intern(A::X);
262-
let y = interner.intern(A::Y);
245+
let x = interner.intern(&A::X);
246+
let y = interner.intern(&A::Y);
263247
assert_ne!(x, y);
264248
}
265249

crates/bevy_utils/src/label.rs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@ macro_rules! define_label {
156156
}
157157
}
158158

159+
impl ::bevy_utils::intern::Leak for dyn $label_trait_name {
160+
fn leak(&self) -> &'static Self {
161+
Box::leak(self.dyn_clone())
162+
}
163+
}
164+
159165
impl ::bevy_utils::intern::StaticRef for dyn $label_trait_name {
160166
fn static_ref(&self) -> std::option::Option<&'static dyn $label_trait_name> {
161167
self.dyn_static_ref()
@@ -171,21 +177,7 @@ macro_rules! define_label {
171177
fn from(
172178
value: &dyn $label_trait_name,
173179
) -> ::bevy_utils::intern::Interned<dyn $label_trait_name> {
174-
struct LeakHelper<'a>(&'a dyn $label_trait_name);
175-
176-
impl<'a> ::std::borrow::Borrow<dyn $label_trait_name> for LeakHelper<'a> {
177-
fn borrow(&self) -> &dyn $label_trait_name {
178-
self.0
179-
}
180-
}
181-
182-
impl<'a> ::bevy_utils::intern::Leak<dyn $label_trait_name> for LeakHelper<'a> {
183-
fn leak(self) -> &'static dyn $label_trait_name {
184-
Box::leak(self.0.dyn_clone())
185-
}
186-
}
187-
188-
$interner_name.intern(LeakHelper(value))
180+
$interner_name.intern(value)
189181
}
190182
}
191183
};

0 commit comments

Comments
 (0)