@@ -1249,25 +1249,25 @@ impl<T, A: Allocator + Clone> BTreeSet<T, A> {
12491249     /// 
12501250     /// let mut set = BTreeSet::from([1, 2, 3, 4]); 
12511251     /// 
1252-      /// let mut cursor = unsafe {  set.lower_bound_mut(Bound::Included(&2)) } ; 
1252+      /// let mut cursor = set.lower_bound_mut(Bound::Included(&2)); 
12531253     /// assert_eq!(cursor.peek_prev(), Some(&mut 1)); 
12541254     /// assert_eq!(cursor.peek_next(), Some(&mut 2)); 
12551255     /// 
1256-      /// let mut cursor = unsafe {  set.lower_bound_mut(Bound::Excluded(&2)) } ; 
1256+      /// let mut cursor = set.lower_bound_mut(Bound::Excluded(&2)); 
12571257     /// assert_eq!(cursor.peek_prev(), Some(&mut 2)); 
12581258     /// assert_eq!(cursor.peek_next(), Some(&mut 3)); 
12591259     /// 
1260-      /// let mut cursor = unsafe {  set.lower_bound_mut(Bound::Unbounded) } ; 
1260+      /// let mut cursor = set.lower_bound_mut(Bound::Unbounded); 
12611261     /// assert_eq!(cursor.peek_prev(), None); 
12621262     /// assert_eq!(cursor.peek_next(), Some(&mut 1)); 
12631263     /// ``` 
12641264     #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
1265-     pub  unsafe   fn  lower_bound_mut < Q :  ?Sized > ( & mut  self ,  bound :  Bound < & Q > )  -> CursorMut < ' _ ,  T ,  A > 
1265+     pub  fn  lower_bound_mut < Q :  ?Sized > ( & mut  self ,  bound :  Bound < & Q > )  -> CursorMut < ' _ ,  T ,  A > 
12661266    where 
12671267        T :  Borrow < Q >  + Ord , 
12681268        Q :  Ord , 
12691269    { 
1270-         CursorMut  {  inner :  unsafe   {   self . map . lower_bound_mut ( bound) . with_mutable_key ( )   }  } 
1270+         CursorMut  {  inner :  self . map . lower_bound_mut ( bound)  } 
12711271    } 
12721272
12731273    /// Returns a [`Cursor`] pointing at the gap after the greatest element 
@@ -1353,7 +1353,7 @@ impl<T, A: Allocator + Clone> BTreeSet<T, A> {
13531353        T :  Borrow < Q >  + Ord , 
13541354        Q :  Ord , 
13551355    { 
1356-         CursorMut  {  inner :  unsafe   {   self . map . upper_bound_mut ( bound) . with_mutable_key ( )   }  } 
1356+         CursorMut  {  inner :  self . map . upper_bound_mut ( bound)  } 
13571357    } 
13581358} 
13591359
@@ -2010,6 +2010,31 @@ impl<K: Debug> Debug for Cursor<'_, K> {
20102010    } 
20112011} 
20122012
2013+ /// A cursor over a `BTreeSet` with editing operations. 
2014+ /// 
2015+ /// A `Cursor` is like an iterator, except that it can freely seek back-and-forth, and can 
2016+ /// safely mutate the set during iteration. This is because the lifetime of its yielded 
2017+ /// references is tied to its own lifetime, instead of just the underlying map. This means 
2018+ /// cursors cannot yield multiple elements at once. 
2019+ /// 
2020+ /// Cursors always point to a gap between two elements in the set, and can 
2021+ /// operate on the two immediately adjacent elements. 
2022+ /// 
2023+ /// A `CursorMut` is created with the [`BTreeSet::lower_bound_mut`] and [`BTreeSet::upper_bound_mut`] 
2024+ /// methods. 
2025+ #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2026+ pub  struct  CursorMut < ' a ,  K :  ' a ,  #[ unstable( feature = "allocator_api" ,  issue = "32838" ) ]   A  = Global > 
2027+ { 
2028+     inner :  super :: map:: CursorMut < ' a ,  K ,  SetValZST ,  A > , 
2029+ } 
2030+ 
2031+ #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2032+ impl < K :  Debug ,  A >  Debug  for  CursorMut < ' _ ,  K ,  A >  { 
2033+     fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
2034+         f. write_str ( "CursorMut" ) 
2035+     } 
2036+ } 
2037+ 
20132038/// A cursor over a `BTreeSet` with editing operations, and which allows 
20142039/// mutating elements. 
20152040/// 
@@ -2021,8 +2046,8 @@ impl<K: Debug> Debug for Cursor<'_, K> {
20212046/// Cursors always point to a gap between two elements in the set, and can 
20222047/// operate on the two immediately adjacent elements. 
20232048/// 
2024- /// A `CursorMut ` is created with the  [`BTreeSet::lower_bound_mut `] and  
2025- /// [`BTreeSet::upper_bound_mut `] methods . 
2049+ /// A `CursorMutKey ` is created from a  [`CursorMut `] with the  
2050+ /// [`CursorMut::with_mutable_key `] method . 
20262051/// 
20272052/// # Safety 
20282053/// 
@@ -2032,15 +2057,18 @@ impl<K: Debug> Debug for Cursor<'_, K> {
20322057/// * The newly inserted element must be unique in the tree. 
20332058/// * All elements in the tree must remain in sorted order. 
20342059#[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2035- pub  struct  CursorMut < ' a ,  K :  ' a ,  #[ unstable( feature = "allocator_api" ,  issue = "32838" ) ]   A  = Global > 
2036- { 
2060+ pub  struct  CursorMutKey < 
2061+     ' a , 
2062+     K :  ' a , 
2063+     #[ unstable( feature = "allocator_api" ,  issue = "32838" ) ]   A  = Global , 
2064+ >  { 
20372065    inner :  super :: map:: CursorMutKey < ' a ,  K ,  SetValZST ,  A > , 
20382066} 
20392067
20402068#[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2041- impl < K :  Debug ,  A >  Debug  for  CursorMut < ' _ ,  K ,  A >  { 
2069+ impl < K :  Debug ,  A >  Debug  for  CursorMutKey < ' _ ,  K ,  A >  { 
20422070    fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
2043-         f. write_str ( "CursorMut " ) 
2071+         f. write_str ( "CursorMutKey " ) 
20442072    } 
20452073} 
20462074
@@ -2089,7 +2117,7 @@ impl<'a, T, A> CursorMut<'a, T, A> {
20892117     /// If the cursor is already at the end of the set then `None` is returned 
20902118     /// and the cursor is not moved. 
20912119     #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2092-     pub  fn  next ( & mut  self )  -> Option < & mut   T >  { 
2120+     pub  fn  next ( & mut  self )  -> Option < & T >  { 
20932121        self . inner . next ( ) . map ( |( k,  _) | k) 
20942122    } 
20952123
@@ -2099,23 +2127,23 @@ impl<'a, T, A> CursorMut<'a, T, A> {
20992127     /// If the cursor is already at the start of the set then `None` is returned 
21002128     /// and the cursor is not moved. 
21012129     #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2102-     pub  fn  prev ( & mut  self )  -> Option < & mut   T >  { 
2130+     pub  fn  prev ( & mut  self )  -> Option < & T >  { 
21032131        self . inner . prev ( ) . map ( |( k,  _) | k) 
21042132    } 
21052133
21062134    /// Returns a reference to the next element without moving the cursor. 
21072135     /// 
21082136     /// If the cursor is at the end of the set then `None` is returned. 
21092137     #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2110-     pub  fn  peek_next ( & mut  self )  -> Option < & mut   T >  { 
2138+     pub  fn  peek_next ( & mut  self )  -> Option < & T >  { 
21112139        self . inner . peek_next ( ) . map ( |( k,  _) | k) 
21122140    } 
21132141
21142142    /// Returns a reference to the previous element without moving the cursor. 
21152143     /// 
21162144     /// If the cursor is at the start of the set then `None` is returned. 
21172145     #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2118-     pub  fn  peek_prev ( & mut  self )  -> Option < & mut   T >  { 
2146+     pub  fn  peek_prev ( & mut  self )  -> Option < & T >  { 
21192147        self . inner . peek_prev ( ) . map ( |( k,  _) | k) 
21202148    } 
21212149
@@ -2129,6 +2157,70 @@ impl<'a, T, A> CursorMut<'a, T, A> {
21292157    pub  fn  as_cursor ( & self )  -> Cursor < ' _ ,  T >  { 
21302158        Cursor  {  inner :  self . inner . as_cursor ( )  } 
21312159    } 
2160+ 
2161+     /// Converts the cursor into a [`CursorMutKey`], which allows mutating 
2162+      /// elements in the tree. 
2163+      /// 
2164+      /// # Safety 
2165+      /// 
2166+      /// Since this cursor allows mutating elements, you must ensure that the 
2167+      /// `BTreeSet` invariants are maintained. Specifically: 
2168+      /// 
2169+      /// * The newly inserted element must be unique in the tree. 
2170+      /// * All elements in the tree must remain in sorted order. 
2171+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2172+     pub  unsafe  fn  with_mutable_key ( self )  -> CursorMutKey < ' a ,  T ,  A >  { 
2173+         CursorMutKey  {  inner :  unsafe  {  self . inner . with_mutable_key ( )  }  } 
2174+     } 
2175+ } 
2176+ 
2177+ impl < ' a ,  T ,  A >  CursorMutKey < ' a ,  T ,  A >  { 
2178+     /// Advances the cursor to the next gap, returning the  element that it 
2179+      /// moved over. 
2180+      /// 
2181+      /// If the cursor is already at the end of the set then `None` is returned 
2182+      /// and the cursor is not moved. 
2183+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2184+     pub  fn  next ( & mut  self )  -> Option < & mut  T >  { 
2185+         self . inner . next ( ) . map ( |( k,  _) | k) 
2186+     } 
2187+ 
2188+     /// Advances the cursor to the previous gap, returning the element that it 
2189+      /// moved over. 
2190+      /// 
2191+      /// If the cursor is already at the start of the set then `None` is returned 
2192+      /// and the cursor is not moved. 
2193+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2194+     pub  fn  prev ( & mut  self )  -> Option < & mut  T >  { 
2195+         self . inner . prev ( ) . map ( |( k,  _) | k) 
2196+     } 
2197+ 
2198+     /// Returns a reference to the next element without moving the cursor. 
2199+      /// 
2200+      /// If the cursor is at the end of the set then `None` is returned 
2201+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2202+     pub  fn  peek_next ( & mut  self )  -> Option < & mut  T >  { 
2203+         self . inner . peek_next ( ) . map ( |( k,  _) | k) 
2204+     } 
2205+ 
2206+     /// Returns a reference to the previous element without moving the cursor. 
2207+      /// 
2208+      /// If the cursor is at the start of the set then `None` is returned. 
2209+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2210+     pub  fn  peek_prev ( & mut  self )  -> Option < & mut  T >  { 
2211+         self . inner . peek_prev ( ) . map ( |( k,  _) | k) 
2212+     } 
2213+ 
2214+     /// Returns a read-only cursor pointing to the same location as the 
2215+      /// `CursorMutKey`. 
2216+      /// 
2217+      /// The lifetime of the returned `Cursor` is bound to that of the 
2218+      /// `CursorMutKey`, which means it cannot outlive the `CursorMutKey` and that the 
2219+      /// `CursorMutKey` is frozen for the lifetime of the `Cursor`. 
2220+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2221+     pub  fn  as_cursor ( & self )  -> Cursor < ' _ ,  T >  { 
2222+         Cursor  {  inner :  self . inner . as_cursor ( )  } 
2223+     } 
21322224} 
21332225
21342226impl < ' a ,  T :  Ord ,  A :  Allocator  + Clone >  CursorMut < ' a ,  T ,  A >  { 
@@ -2217,6 +2309,92 @@ impl<'a, T: Ord, A: Allocator + Clone> CursorMut<'a, T, A> {
22172309    } 
22182310} 
22192311
2312+ impl < ' a ,  T :  Ord ,  A :  Allocator  + Clone >  CursorMutKey < ' a ,  T ,  A >  { 
2313+     /// Inserts a new element into the set in the gap that the 
2314+      /// cursor is currently pointing to. 
2315+      /// 
2316+      /// After the insertion the cursor will be pointing at the gap before the 
2317+      /// newly inserted element. 
2318+      /// 
2319+      /// # Safety 
2320+      /// 
2321+      /// You must ensure that the `BTreeSet` invariants are maintained. 
2322+      /// Specifically: 
2323+      /// 
2324+      /// * The key of the newly inserted element must be unique in the tree. 
2325+      /// * All elements in the tree must remain in sorted order. 
2326+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2327+     pub  unsafe  fn  insert_after_unchecked ( & mut  self ,  value :  T )  { 
2328+         unsafe  {  self . inner . insert_after_unchecked ( value,  SetValZST )  } 
2329+     } 
2330+ 
2331+     /// Inserts a new element into the set in the gap that the 
2332+      /// cursor is currently pointing to. 
2333+      /// 
2334+      /// After the insertion the cursor will be pointing at the gap after the 
2335+      /// newly inserted element. 
2336+      /// 
2337+      /// # Safety 
2338+      /// 
2339+      /// You must ensure that the `BTreeSet` invariants are maintained. 
2340+      /// Specifically: 
2341+      /// 
2342+      /// * The newly inserted element must be unique in the tree. 
2343+      /// * All elements in the tree must remain in sorted order. 
2344+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2345+     pub  unsafe  fn  insert_before_unchecked ( & mut  self ,  value :  T )  { 
2346+         unsafe  {  self . inner . insert_before_unchecked ( value,  SetValZST )  } 
2347+     } 
2348+ 
2349+     /// Inserts a new element into the set in the gap that the 
2350+      /// cursor is currently pointing to. 
2351+      /// 
2352+      /// After the insertion the cursor will be pointing at the gap before the 
2353+      /// newly inserted element. 
2354+      /// 
2355+      /// If the inserted element is not greater than the element before the 
2356+      /// cursor (if any), or if it not less than the element after the cursor (if 
2357+      /// any), then an [`UnorderedKeyError`] is returned since this would 
2358+      /// invalidate the [`Ord`] invariant between the elements of the set. 
2359+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2360+     pub  fn  insert_after ( & mut  self ,  value :  T )  -> Result < ( ) ,  UnorderedKeyError >  { 
2361+         self . inner . insert_after ( value,  SetValZST ) 
2362+     } 
2363+ 
2364+     /// Inserts a new element into the set in the gap that the 
2365+      /// cursor is currently pointing to. 
2366+      /// 
2367+      /// After the insertion the cursor will be pointing at the gap after the 
2368+      /// newly inserted element. 
2369+      /// 
2370+      /// If the inserted element is not greater than the element before the 
2371+      /// cursor (if any), or if it not less than the element after the cursor (if 
2372+      /// any), then an [`UnorderedKeyError`] is returned since this would 
2373+      /// invalidate the [`Ord`] invariant between the elements of the set. 
2374+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2375+     pub  fn  insert_before ( & mut  self ,  value :  T )  -> Result < ( ) ,  UnorderedKeyError >  { 
2376+         self . inner . insert_before ( value,  SetValZST ) 
2377+     } 
2378+ 
2379+     /// Removes the next element from the `BTreeSet`. 
2380+      /// 
2381+      /// The element that was removed is returned. The cursor position is 
2382+      /// unchanged (before the removed element). 
2383+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2384+     pub  fn  remove_next ( & mut  self )  -> Option < T >  { 
2385+         self . inner . remove_next ( ) . map ( |( k,  _) | k) 
2386+     } 
2387+ 
2388+     /// Removes the precending element from the `BTreeSet`. 
2389+      /// 
2390+      /// The element that was removed is returned. The cursor position is 
2391+      /// unchanged (after the removed element). 
2392+      #[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
2393+     pub  fn  remove_prev ( & mut  self )  -> Option < T >  { 
2394+         self . inner . remove_prev ( ) . map ( |( k,  _) | k) 
2395+     } 
2396+ } 
2397+ 
22202398#[ unstable( feature = "btree_cursors" ,  issue = "107540" ) ]  
22212399pub  use  super :: map:: UnorderedKeyError ; 
22222400
0 commit comments