@@ -6,6 +6,7 @@ use std::ops::Deref;
6
6
use std:: sync:: LazyLock ;
7
7
8
8
enum MaybeLazyInner < T : ' static + ToOwned + ?Sized , F > {
9
+ LazyStaticFn ( LazyLock < T :: Owned > ) ,
9
10
Lazy ( LazyLock < T :: Owned , F > ) ,
10
11
Cow ( Cow < ' static , T > ) ,
11
12
}
@@ -60,6 +61,7 @@ impl<T: 'static + ?Sized + ToOwned<Owned: Clone>, F: FnOnce() -> T::Owned> Clone
60
61
fn clone ( & self ) -> Self {
61
62
MaybeLazy {
62
63
inner : MaybeLazyInner :: Cow ( match & self . inner {
64
+ MaybeLazyInner :: LazyStaticFn ( f) => Cow :: Owned ( ( * f) . to_owned ( ) ) ,
63
65
MaybeLazyInner :: Lazy ( f) => Cow :: Owned ( ( * f) . to_owned ( ) ) ,
64
66
MaybeLazyInner :: Cow ( c) => c. clone ( ) ,
65
67
} ) ,
@@ -72,7 +74,7 @@ impl<T: 'static + ?Sized + ToOwned<Owned: Default>, F: FnOnce() -> T::Owned> Def
72
74
{
73
75
#[ inline]
74
76
fn default ( ) -> MaybeLazy < T , F > {
75
- MaybeLazy :: owned ( T :: Owned :: default ( ) )
77
+ MaybeLazy { inner : MaybeLazyInner :: LazyStaticFn ( LazyLock :: new ( T :: Owned :: default) ) }
76
78
}
77
79
}
78
80
@@ -85,6 +87,7 @@ impl<T: 'static + ?Sized + ToOwned<Owned: Borrow<T>>, F: FnOnce() -> T::Owned> D
85
87
#[ inline]
86
88
fn deref ( & self ) -> & T {
87
89
match & self . inner {
90
+ MaybeLazyInner :: LazyStaticFn ( f) => ( & * * f) . borrow ( ) ,
88
91
MaybeLazyInner :: Lazy ( f) => ( & * * f) . borrow ( ) ,
89
92
MaybeLazyInner :: Cow ( c) => & * c,
90
93
}
0 commit comments