@@ -1861,65 +1861,51 @@ where
1861
1861
let mut max_node = root2;
1862
1862
let mut min_found = false ;
1863
1863
let mut max_found = false ;
1864
- let mut diverged = false ;
1865
1864
1866
1865
loop {
1867
- let min_edge = match ( min_found, range. start_bound ( ) ) {
1868
- ( false , Included ( key) ) => match search:: search_linear ( & min_node, key) {
1869
- ( i , true ) => {
1866
+ let front = match ( min_found, range. start_bound ( ) ) {
1867
+ ( false , Included ( key) ) => match search:: search_node ( min_node, key) {
1868
+ Found ( kv ) => {
1870
1869
min_found = true ;
1871
- i
1870
+ kv . left_edge ( )
1872
1871
}
1873
- ( i , false ) => i ,
1872
+ GoDown ( edge ) => edge ,
1874
1873
} ,
1875
- ( false , Excluded ( key) ) => match search:: search_linear ( & min_node, key) {
1876
- ( i , true ) => {
1874
+ ( false , Excluded ( key) ) => match search:: search_node ( min_node, key) {
1875
+ Found ( kv ) => {
1877
1876
min_found = true ;
1878
- i + 1
1877
+ kv . right_edge ( )
1879
1878
}
1880
- ( i , false ) => i ,
1879
+ GoDown ( edge ) => edge ,
1881
1880
} ,
1882
- ( _ , Unbounded ) => 0 ,
1883
- ( true , Included ( _) ) => min_node. len ( ) ,
1884
- ( true , Excluded ( _ ) ) => 0 ,
1881
+ ( true , Included ( _ ) ) => min_node . last_edge ( ) ,
1882
+ ( true , Excluded ( _) ) => min_node. first_edge ( ) ,
1883
+ ( _ , Unbounded ) => min_node . first_edge ( ) ,
1885
1884
} ;
1886
1885
1887
- let max_edge = match ( max_found, range. end_bound ( ) ) {
1888
- ( false , Included ( key) ) => match search:: search_linear ( & max_node, key) {
1889
- ( i , true ) => {
1886
+ let back = match ( max_found, range. end_bound ( ) ) {
1887
+ ( false , Included ( key) ) => match search:: search_node ( max_node, key) {
1888
+ Found ( kv ) => {
1890
1889
max_found = true ;
1891
- i + 1
1890
+ kv . right_edge ( )
1892
1891
}
1893
- ( i , false ) => i ,
1892
+ GoDown ( edge ) => edge ,
1894
1893
} ,
1895
- ( false , Excluded ( key) ) => match search:: search_linear ( & max_node, key) {
1896
- ( i , true ) => {
1894
+ ( false , Excluded ( key) ) => match search:: search_node ( max_node, key) {
1895
+ Found ( kv ) => {
1897
1896
max_found = true ;
1898
- i
1897
+ kv . left_edge ( )
1899
1898
}
1900
- ( i , false ) => i ,
1899
+ GoDown ( edge ) => edge ,
1901
1900
} ,
1902
- ( _ , Unbounded ) => max_node. len ( ) ,
1903
- ( true , Included ( _) ) => 0 ,
1904
- ( true , Excluded ( _ ) ) => max_node. len ( ) ,
1901
+ ( true , Included ( _ ) ) => max_node. first_edge ( ) ,
1902
+ ( true , Excluded ( _) ) => max_node . last_edge ( ) ,
1903
+ ( _ , Unbounded ) => max_node. last_edge ( ) ,
1905
1904
} ;
1906
1905
1907
- if !diverged {
1908
- if max_edge < min_edge {
1909
- panic ! ( "Ord is ill-defined in BTreeMap range" )
1910
- }
1911
- if min_edge != max_edge {
1912
- diverged = true ;
1913
- }
1906
+ if front. partial_cmp ( & back) == Some ( Ordering :: Greater ) {
1907
+ panic ! ( "Ord is ill-defined in BTreeMap range" ) ;
1914
1908
}
1915
-
1916
- // Safety guarantee: `min_edge` is always in range for `min_node`, because
1917
- // `min_edge` is unconditionally calculated for each iteration's value of `min_node`,
1918
- // either (if not found) as the edge index returned by `search_linear`,
1919
- // or (if found) as the KV index returned by `search_linear`, possibly + 1.
1920
- // Likewise for `max_node` versus `max_edge`.
1921
- let front = unsafe { Handle :: new_edge ( min_node, min_edge) } ;
1922
- let back = unsafe { Handle :: new_edge ( max_node, max_edge) } ;
1923
1909
match ( front. force ( ) , back. force ( ) ) {
1924
1910
( Leaf ( f) , Leaf ( b) ) => {
1925
1911
return ( f, b) ;
0 commit comments