@@ -420,6 +420,48 @@ impl<T, A> RawRc<T, A> {
420420 unsafe { Self :: from_raw_parts ( ptr. as_ptr ( ) . cast ( ) , alloc) }
421421 }
422422
423+ #[ cfg( not( no_global_oom_handling) ) ]
424+ unsafe fn new_cyclic_impl < F , R > ( mut weak : RawWeak < T , A > , data_fn : F ) -> Self
425+ where
426+ A : Allocator ,
427+ F : FnOnce ( & RawWeak < T , A > ) -> T ,
428+ R : RefCounter ,
429+ {
430+ use crate :: raw_rc:: raw_unique_rc:: RawUniqueRc ;
431+ use crate :: raw_rc:: raw_weak:: WeakGuard ;
432+
433+ let guard = unsafe { WeakGuard :: < T , A , R > :: new ( & mut weak) } ;
434+ let data = data_fn ( & guard) ;
435+
436+ mem:: forget ( guard) ;
437+
438+ unsafe { RawUniqueRc :: from_weak_with_value ( weak, data) . into_rc :: < R > ( ) }
439+ }
440+
441+ #[ cfg( not( no_global_oom_handling) ) ]
442+ pub ( crate ) unsafe fn new_cyclic < F , R > ( data_fn : F ) -> Self
443+ where
444+ A : Allocator + Default ,
445+ F : FnOnce ( & RawWeak < T , A > ) -> T ,
446+ R : RefCounter ,
447+ {
448+ let weak = RawWeak :: new_uninit :: < 0 > ( ) ;
449+
450+ unsafe { Self :: new_cyclic_impl :: < F , R > ( weak, data_fn) }
451+ }
452+
453+ #[ cfg( not( no_global_oom_handling) ) ]
454+ pub ( crate ) unsafe fn new_cyclic_in < F , R > ( data_fn : F , alloc : A ) -> Self
455+ where
456+ A : Allocator ,
457+ F : FnOnce ( & RawWeak < T , A > ) -> T ,
458+ R : RefCounter ,
459+ {
460+ let weak = RawWeak :: new_uninit_in :: < 0 > ( alloc) ;
461+
462+ unsafe { Self :: new_cyclic_impl :: < F , R > ( weak, data_fn) }
463+ }
464+
423465 pub ( crate ) unsafe fn into_inner < R > ( self ) -> Option < T >
424466 where
425467 A : Allocator ,
0 commit comments