@@ -6,6 +6,7 @@ use std::ops::Deref;
66use std:: sync:: LazyLock ;
77
88enum MaybeLazyInner < T : ' static + ToOwned + ?Sized , F > {
9+ LazyStaticFn ( LazyLock < T :: Owned > ) ,
910 Lazy ( LazyLock < T :: Owned , F > ) ,
1011 Cow ( Cow < ' static , T > ) ,
1112}
@@ -60,6 +61,7 @@ impl<T: 'static + ?Sized + ToOwned<Owned: Clone>, F: FnOnce() -> T::Owned> Clone
6061 fn clone ( & self ) -> Self {
6162 MaybeLazy {
6263 inner : MaybeLazyInner :: Cow ( match & self . inner {
64+ MaybeLazyInner :: LazyStaticFn ( f) => Cow :: Owned ( ( * f) . to_owned ( ) ) ,
6365 MaybeLazyInner :: Lazy ( f) => Cow :: Owned ( ( * f) . to_owned ( ) ) ,
6466 MaybeLazyInner :: Cow ( c) => c. clone ( ) ,
6567 } ) ,
@@ -72,7 +74,7 @@ impl<T: 'static + ?Sized + ToOwned<Owned: Default>, F: FnOnce() -> T::Owned> Def
7274{
7375 #[ inline]
7476 fn default ( ) -> MaybeLazy < T , F > {
75- MaybeLazy :: owned ( T :: Owned :: default ( ) )
77+ MaybeLazy { inner : MaybeLazyInner :: LazyStaticFn ( LazyLock :: new ( T :: Owned :: default) ) }
7678 }
7779}
7880
@@ -85,6 +87,7 @@ impl<T: 'static + ?Sized + ToOwned<Owned: Borrow<T>>, F: FnOnce() -> T::Owned> D
8587 #[ inline]
8688 fn deref ( & self ) -> & T {
8789 match & self . inner {
90+ MaybeLazyInner :: LazyStaticFn ( f) => ( & * * f) . borrow ( ) ,
8891 MaybeLazyInner :: Lazy ( f) => ( & * * f) . borrow ( ) ,
8992 MaybeLazyInner :: Cow ( c) => & * c,
9093 }
0 commit comments