@@ -340,6 +340,40 @@ impl AtomicBool {
340340        unsafe  {  & mut  * ( v as  * mut  bool  as  * mut  Self )  } 
341341    } 
342342
343+     /// Get non-atomic access to a `&mut [AtomicBool]` slice. 
344+ /// 
345+ /// This is safe because the mutable reference guarantees that no other threads are 
346+ /// concurrently accessing the atomic data. 
347+ /// 
348+ /// # Examples 
349+ /// 
350+ /// ``` 
351+ /// #![feature(atomic_from_mut, inline_const, scoped_threads)] 
352+ /// use std::sync::atomic::{AtomicBool, Ordering}; 
353+ /// 
354+ /// let mut some_bools = [const { AtomicBool::new(false) }; 10]; 
355+ /// 
356+ /// let view: &mut [bool] = AtomicBool::get_mut_slice(&mut some_bools); 
357+ /// assert_eq!(view, [false; 10]); 
358+ /// view[..5].copy_from_slice(&[true; 5]); 
359+ /// 
360+ /// std::thread::scope(|s| { 
361+ ///     for t in &some_bools[..5] { 
362+ ///         s.spawn(move || assert_eq!(t.load(Ordering::Relaxed), true)); 
363+ ///     } 
364+ /// 
365+ ///     for f in &some_bools[5..] { 
366+ ///         s.spawn(move || assert_eq!(f.load(Ordering::Relaxed), false)); 
367+ ///     } 
368+ /// }); 
369+ /// ``` 
370+ #[ inline]  
371+     #[ unstable( feature = "atomic_from_mut" ,  issue = "76314" ) ]  
372+     pub  fn  get_mut_slice ( this :  & mut  [ Self ] )  -> & mut  [ bool ]  { 
373+         // SAFETY: the mutable reference guarantees unique ownership. 
374+         unsafe  {  & mut  * ( this as  * mut  [ Self ]  as  * mut  [ bool ] )  } 
375+     } 
376+ 
343377    /// Get atomic access to a `&mut [bool]` slice. 
344378/// 
345379/// # Examples 
@@ -971,6 +1005,46 @@ impl<T> AtomicPtr<T> {
9711005        unsafe  {  & mut  * ( v as  * mut  * mut  T  as  * mut  Self )  } 
9721006    } 
9731007
1008+     /// Get non-atomic access to a `&mut [AtomicPtr]` slice. 
1009+ /// 
1010+ /// This is safe because the mutable reference guarantees that no other threads are 
1011+ /// concurrently accessing the atomic data. 
1012+ /// 
1013+ /// # Examples 
1014+ /// 
1015+ /// ``` 
1016+ /// #![feature(atomic_from_mut, inline_const, scoped_threads)] 
1017+ /// use std::ptr::null_mut; 
1018+ /// use std::sync::atomic::{AtomicPtr, Ordering}; 
1019+ /// 
1020+ /// let mut some_ptrs = [const { AtomicPtr::new(null_mut::<String>()) }; 10]; 
1021+ /// 
1022+ /// let view: &mut [*mut String] = AtomicPtr::get_mut_slice(&mut some_ptrs); 
1023+ /// assert_eq!(view, [null_mut::<String>(); 10]); 
1024+ /// view 
1025+ ///     .iter_mut() 
1026+ ///     .enumerate() 
1027+ ///     .for_each(|(i, ptr)| *ptr = Box::into_raw(Box::new(format!("iteration#{i}")))); 
1028+ /// 
1029+ /// std::thread::scope(|s| { 
1030+ ///     for ptr in &some_ptrs { 
1031+ ///         s.spawn(move || { 
1032+ ///             let ptr = ptr.load(Ordering::Relaxed); 
1033+ ///             assert!(!ptr.is_null()); 
1034+ /// 
1035+ ///             let name = unsafe { Box::from_raw(ptr) }; 
1036+ ///             println!("Hello, {name}!"); 
1037+ ///         }); 
1038+ ///     } 
1039+ /// }); 
1040+ /// ``` 
1041+ #[ inline]  
1042+     #[ unstable( feature = "atomic_from_mut" ,  issue = "76314" ) ]  
1043+     pub  fn  get_mut_slice ( this :  & mut  [ Self ] )  -> & mut  [ * mut  T ]  { 
1044+         // SAFETY: the mutable reference guarantees unique ownership. 
1045+         unsafe  {  & mut  * ( this as  * mut  [ Self ]  as  * mut  [ * mut  T ] )  } 
1046+     } 
1047+ 
9741048    /// Get atomic access to a slice of pointers. 
9751049/// 
9761050/// # Examples 
@@ -1521,6 +1595,42 @@ macro_rules! atomic_int {
15211595                unsafe  {  & mut  * ( v as  * mut  $int_type as  * mut  Self )  } 
15221596            } 
15231597
1598+             #[ doc = concat!( "Get non-atomic access to a `&mut [" ,  stringify!( $atomic_type) ,  "]` slice" ) ] 
1599+             /// 
1600+ /// This is safe because the mutable reference guarantees that no other threads are 
1601+ /// concurrently accessing the atomic data. 
1602+ /// 
1603+ /// # Examples 
1604+ /// 
1605+ /// ``` 
1606+ /// #![feature(atomic_from_mut, inline_const, scoped_threads)] 
1607+ [ doc = concat!( $extra_feature,  "use std::sync::atomic::{" ,  stringify!( $atomic_type) ,  ", Ordering};" ) ] 
1608+             /// 
1609+ [ doc = concat!( "let mut some_ints = [const { " ,  stringify!( $atomic_type) ,  "::new(0) }; 10];" ) ] 
1610+             /// 
1611+ [ doc = concat!( "let view: &mut [" ,  stringify!( $int_type) ,  "] = " ,  stringify!( $atomic_type) ,  "::get_mut_slice(&mut some_ints);" ) ] 
1612+             /// assert_eq!(view, [0; 10]); 
1613+ /// view 
1614+ ///     .iter_mut() 
1615+ ///     .enumerate() 
1616+ ///     .for_each(|(idx, int)| *int = idx as _); 
1617+ /// 
1618+ /// std::thread::scope(|s| { 
1619+ ///     some_ints 
1620+ ///         .iter() 
1621+ ///         .enumerate() 
1622+ ///         .for_each(|(idx, int)| { 
1623+ ///             s.spawn(move || assert_eq!(int.load(Ordering::Relaxed), idx as _)); 
1624+ ///         }) 
1625+ /// }); 
1626+ /// ``` 
1627+ [ inline] 
1628+             #[ unstable( feature = "atomic_from_mut" ,  issue = "76314" ) ] 
1629+             pub  fn  get_mut_slice( this:  & mut  [ Self ] )  -> & mut  [ $int_type]  { 
1630+                 // SAFETY: the mutable reference guarantees unique ownership. 
1631+                 unsafe  {  & mut  * ( this as  * mut  [ Self ]  as  * mut  [ $int_type] )  } 
1632+             } 
1633+ 
15241634            #[ doc = concat!( "Get atomic access to a `&mut [" ,  stringify!( $int_type) ,  "]` slice." ) ] 
15251635            /// 
15261636/// # Examples 
0 commit comments