]> git.lizzy.rs Git - rust.git/blob - src/libcollections/btree/map.rs
Auto merge of #26213 - semarie:openbsd-morestack, r=alexcrichton
[rust.git] / src / libcollections / btree / map.rs
1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 // This implementation is largely based on the high-level description and analysis of B-Trees
12 // found in *Open Data Structures* (ODS). Although our implementation does not use any of
13 // the source found in ODS, if one wishes to review the high-level design of this structure, it
14 // can be freely downloaded at http://opendatastructures.org/. Its contents are as of this
15 // writing (August 2014) freely licensed under the following Creative Commons Attribution
16 // License: [CC BY 2.5 CA](http://creativecommons.org/licenses/by/2.5/ca/).
17
18 use self::Entry::*;
19
20 use core::prelude::*;
21
22 use core::cmp::Ordering;
23 use core::fmt::Debug;
24 use core::hash::{Hash, Hasher};
25 use core::iter::{Map, FromIterator};
26 use core::ops::Index;
27 use core::{iter, fmt, mem, usize};
28 use Bound::{self, Included, Excluded, Unbounded};
29
30 use borrow::Borrow;
31 use vec_deque::VecDeque;
32
33 use self::Continuation::{Continue, Finished};
34 use self::StackOp::*;
35 use super::node::ForceResult::{Leaf, Internal};
36 use super::node::TraversalItem::{self, Elem, Edge};
37 use super::node::{Traversal, MutTraversal, MoveTraversal};
38 use super::node::{self, Node, Found, GoDown};
39
40 /// A map based on a B-Tree.
41 ///
42 /// B-Trees represent a fundamental compromise between cache-efficiency and actually minimizing
43 /// the amount of work performed in a search. In theory, a binary search tree (BST) is the optimal
44 /// choice for a sorted map, as a perfectly balanced BST performs the theoretical minimum amount of
45 /// comparisons necessary to find an element (log<sub>2</sub>n). However, in practice the way this
46 /// is done is *very* inefficient for modern computer architectures. In particular, every element
47 /// is stored in its own individually heap-allocated node. This means that every single insertion
48 /// triggers a heap-allocation, and every single comparison should be a cache-miss. Since these
49 /// are both notably expensive things to do in practice, we are forced to at very least reconsider
50 /// the BST strategy.
51 ///
52 /// A B-Tree instead makes each node contain B-1 to 2B-1 elements in a contiguous array. By doing
53 /// this, we reduce the number of allocations by a factor of B, and improve cache efficiency in
54 /// searches. However, this does mean that searches will have to do *more* comparisons on average.
55 /// The precise number of comparisons depends on the node search strategy used. For optimal cache
56 /// efficiency, one could search the nodes linearly. For optimal comparisons, one could search
57 /// the node using binary search. As a compromise, one could also perform a linear search
58 /// that initially only checks every i<sup>th</sup> element for some choice of i.
59 ///
60 /// Currently, our implementation simply performs naive linear search. This provides excellent
61 /// performance on *small* nodes of elements which are cheap to compare. However in the future we
62 /// would like to further explore choosing the optimal search strategy based on the choice of B,
63 /// and possibly other factors. Using linear search, searching for a random element is expected
64 /// to take O(B log<sub>B</sub>n) comparisons, which is generally worse than a BST. In practice,
65 /// however, performance is excellent.
66 ///
67 /// It is a logic error for a key to be modified in such a way that the key's ordering relative to
68 /// any other key, as determined by the `Ord` trait, changes while it is in the map. This is
69 /// normally only possible through `Cell`, `RefCell`, global state, I/O, or unsafe code.
70 #[derive(Clone)]
71 #[stable(feature = "rust1", since = "1.0.0")]
72 pub struct BTreeMap<K, V> {
73     root: Node<K, V>,
74     length: usize,
75     depth: usize,
76     b: usize,
77 }
78
79 /// An abstract base over-which all other BTree iterators are built.
80 #[derive(Clone)]
81 struct AbsIter<T> {
82     traversals: VecDeque<T>,
83     size: usize,
84 }
85
86 /// An iterator over a BTreeMap's entries.
87 #[stable(feature = "rust1", since = "1.0.0")]
88 pub struct Iter<'a, K: 'a, V: 'a> {
89     inner: AbsIter<Traversal<'a, K, V>>
90 }
91
92 /// A mutable iterator over a BTreeMap's entries.
93 #[stable(feature = "rust1", since = "1.0.0")]
94 pub struct IterMut<'a, K: 'a, V: 'a> {
95     inner: AbsIter<MutTraversal<'a, K, V>>
96 }
97
98 /// An owning iterator over a BTreeMap's entries.
99 #[stable(feature = "rust1", since = "1.0.0")]
100 pub struct IntoIter<K, V> {
101     inner: AbsIter<MoveTraversal<K, V>>
102 }
103
104 /// An iterator over a BTreeMap's keys.
105 #[stable(feature = "rust1", since = "1.0.0")]
106 pub struct Keys<'a, K: 'a, V: 'a> {
107     inner: Map<Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a K>
108 }
109
110 /// An iterator over a BTreeMap's values.
111 #[stable(feature = "rust1", since = "1.0.0")]
112 pub struct Values<'a, K: 'a, V: 'a> {
113     inner: Map<Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a V>
114 }
115
116 /// An iterator over a sub-range of BTreeMap's entries.
117 pub struct Range<'a, K: 'a, V: 'a> {
118     inner: AbsIter<Traversal<'a, K, V>>
119 }
120
121 /// A mutable iterator over a sub-range of BTreeMap's entries.
122 pub struct RangeMut<'a, K: 'a, V: 'a> {
123     inner: AbsIter<MutTraversal<'a, K, V>>
124 }
125
126 /// A view into a single entry in a map, which may either be vacant or occupied.
127 #[stable(feature = "rust1", since = "1.0.0")]
128 pub enum Entry<'a, K:'a, V:'a> {
129     /// A vacant Entry
130     #[stable(feature = "rust1", since = "1.0.0")]
131     Vacant(VacantEntry<'a, K, V>),
132
133     /// An occupied Entry
134     #[stable(feature = "rust1", since = "1.0.0")]
135     Occupied(OccupiedEntry<'a, K, V>),
136 }
137
138 /// A vacant Entry.
139 #[stable(feature = "rust1", since = "1.0.0")]
140 pub struct VacantEntry<'a, K:'a, V:'a> {
141     key: K,
142     stack: stack::SearchStack<'a, K, V, node::handle::Edge, node::handle::Leaf>,
143 }
144
145 /// An occupied Entry.
146 #[stable(feature = "rust1", since = "1.0.0")]
147 pub struct OccupiedEntry<'a, K:'a, V:'a> {
148     stack: stack::SearchStack<'a, K, V, node::handle::KV, node::handle::LeafOrInternal>,
149 }
150
151 impl<K: Ord, V> BTreeMap<K, V> {
152     /// Makes a new empty BTreeMap with a reasonable choice for B.
153     #[stable(feature = "rust1", since = "1.0.0")]
154     pub fn new() -> BTreeMap<K, V> {
155         //FIXME(Gankro): Tune this as a function of size_of<K/V>?
156         BTreeMap::with_b(6)
157     }
158
159     /// Makes a new empty BTreeMap with the given B.
160     ///
161     /// B cannot be less than 2.
162     pub fn with_b(b: usize) -> BTreeMap<K, V> {
163         assert!(b > 1, "B must be greater than 1");
164         BTreeMap {
165             length: 0,
166             depth: 1,
167             root: Node::make_leaf_root(b),
168             b: b,
169         }
170     }
171
172     /// Clears the map, removing all values.
173     ///
174     /// # Examples
175     ///
176     /// ```
177     /// use std::collections::BTreeMap;
178     ///
179     /// let mut a = BTreeMap::new();
180     /// a.insert(1, "a");
181     /// a.clear();
182     /// assert!(a.is_empty());
183     /// ```
184     #[stable(feature = "rust1", since = "1.0.0")]
185     pub fn clear(&mut self) {
186         let b = self.b;
187         // avoid recursive destructors by manually traversing the tree
188         for _ in mem::replace(self, BTreeMap::with_b(b)) {};
189     }
190
191     // Searching in a B-Tree is pretty straightforward.
192     //
193     // Start at the root. Try to find the key in the current node. If we find it, return it.
194     // If it's not in there, follow the edge *before* the smallest key larger than
195     // the search key. If no such key exists (they're *all* smaller), then just take the last
196     // edge in the node. If we're in a leaf and we don't find our key, then it's not
197     // in the tree.
198
199     /// Returns a reference to the value corresponding to the key.
200     ///
201     /// The key may be any borrowed form of the map's key type, but the ordering
202     /// on the borrowed form *must* match the ordering on the key type.
203     ///
204     /// # Examples
205     ///
206     /// ```
207     /// use std::collections::BTreeMap;
208     ///
209     /// let mut map = BTreeMap::new();
210     /// map.insert(1, "a");
211     /// assert_eq!(map.get(&1), Some(&"a"));
212     /// assert_eq!(map.get(&2), None);
213     /// ```
214     #[stable(feature = "rust1", since = "1.0.0")]
215     pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V> where K: Borrow<Q>, Q: Ord {
216         let mut cur_node = &self.root;
217         loop {
218             match Node::search(cur_node, key) {
219                 Found(handle) => return Some(handle.into_kv().1),
220                 GoDown(handle) => match handle.force() {
221                     Leaf(_) => return None,
222                     Internal(internal_handle) => {
223                         cur_node = internal_handle.into_edge();
224                         continue;
225                     }
226                 }
227             }
228         }
229     }
230
231     /// Returns true if the map contains a value for the specified key.
232     ///
233     /// The key may be any borrowed form of the map's key type, but the ordering
234     /// on the borrowed form *must* match the ordering on the key type.
235     ///
236     /// # Examples
237     ///
238     /// ```
239     /// use std::collections::BTreeMap;
240     ///
241     /// let mut map = BTreeMap::new();
242     /// map.insert(1, "a");
243     /// assert_eq!(map.contains_key(&1), true);
244     /// assert_eq!(map.contains_key(&2), false);
245     /// ```
246     #[stable(feature = "rust1", since = "1.0.0")]
247     pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool where K: Borrow<Q>, Q: Ord {
248         self.get(key).is_some()
249     }
250
251     /// Returns a mutable reference to the value corresponding to the key.
252     ///
253     /// The key may be any borrowed form of the map's key type, but the ordering
254     /// on the borrowed form *must* match the ordering on the key type.
255     ///
256     /// # Examples
257     ///
258     /// ```
259     /// use std::collections::BTreeMap;
260     ///
261     /// let mut map = BTreeMap::new();
262     /// map.insert(1, "a");
263     /// if let Some(x) = map.get_mut(&1) {
264     ///     *x = "b";
265     /// }
266     /// assert_eq!(map[&1], "b");
267     /// ```
268     // See `get` for implementation notes, this is basically a copy-paste with mut's added
269     #[stable(feature = "rust1", since = "1.0.0")]
270     pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V> where K: Borrow<Q>, Q: Ord {
271         // temp_node is a Borrowck hack for having a mutable value outlive a loop iteration
272         let mut temp_node = &mut self.root;
273         loop {
274             let cur_node = temp_node;
275             match Node::search(cur_node, key) {
276                 Found(handle) => return Some(handle.into_kv_mut().1),
277                 GoDown(handle) => match handle.force() {
278                     Leaf(_) => return None,
279                     Internal(internal_handle) => {
280                         temp_node = internal_handle.into_edge_mut();
281                         continue;
282                     }
283                 }
284             }
285         }
286     }
287
288     // Insertion in a B-Tree is a bit complicated.
289     //
290     // First we do the same kind of search described in `find`. But we need to maintain a stack of
291     // all the nodes/edges in our search path. If we find a match for the key we're trying to
292     // insert, just swap the vals and return the old ones. However, when we bottom out in a leaf,
293     // we attempt to insert our key-value pair at the same location we would want to follow another
294     // edge.
295     //
296     // If the node has room, then this is done in the obvious way by shifting elements. However,
297     // if the node itself is full, we split node into two, and give its median key-value
298     // pair to its parent to insert the new node with. Of course, the parent may also be
299     // full, and insertion can propagate until we reach the root. If we reach the root, and
300     // it is *also* full, then we split the root and place the two nodes under a newly made root.
301     //
302     // Note that we subtly deviate from Open Data Structures in our implementation of split.
303     // ODS describes inserting into the node *regardless* of its capacity, and then
304     // splitting *afterwards* if it happens to be overfull. However, this is inefficient.
305     // Instead, we split beforehand, and then insert the key-value pair into the appropriate
306     // result node. This has two consequences:
307     //
308     // 1) While ODS produces a left node of size B-1, and a right node of size B,
309     // we may potentially reverse this. However, this shouldn't effect the analysis.
310     //
311     // 2) While ODS may potentially return the pair we *just* inserted after
312     // the split, we will never do this. Again, this shouldn't effect the analysis.
313
314     /// Inserts a key-value pair into the map. If the key already had a value
315     /// present in the map, that value is returned. Otherwise, `None` is returned.
316     ///
317     /// # Examples
318     ///
319     /// ```
320     /// use std::collections::BTreeMap;
321     ///
322     /// let mut map = BTreeMap::new();
323     /// assert_eq!(map.insert(37, "a"), None);
324     /// assert_eq!(map.is_empty(), false);
325     ///
326     /// map.insert(37, "b");
327     /// assert_eq!(map.insert(37, "c"), Some("b"));
328     /// assert_eq!(map[&37], "c");
329     /// ```
330     #[stable(feature = "rust1", since = "1.0.0")]
331     pub fn insert(&mut self, mut key: K, mut value: V) -> Option<V> {
332         // This is a stack of rawptrs to nodes paired with indices, respectively
333         // representing the nodes and edges of our search path. We have to store rawptrs
334         // because as far as Rust is concerned, we can mutate aliased data with such a
335         // stack. It is of course correct, but what it doesn't know is that we will only
336         // be popping and using these ptrs one at a time in child-to-parent order. The alternative
337         // to doing this is to take the Nodes from their parents. This actually makes
338         // borrowck *really* happy and everything is pretty smooth. However, this creates
339         // *tons* of pointless writes, and requires us to always walk all the way back to
340         // the root after an insertion, even if we only needed to change a leaf. Therefore,
341         // we accept this potential unsafety and complexity in the name of performance.
342         //
343         // Regardless, the actual dangerous logic is completely abstracted away from BTreeMap
344         // by the stack module. All it can do is immutably read nodes, and ask the search stack
345         // to proceed down some edge by index. This makes the search logic we'll be reusing in a
346         // few different methods much neater, and of course drastically improves safety.
347         let mut stack = stack::PartialSearchStack::new(self);
348
349         loop {
350             let result = stack.with(move |pusher, node| {
351                 // Same basic logic as found in `find`, but with PartialSearchStack mediating the
352                 // actual nodes for us
353                 match Node::search(node, &key) {
354                     Found(mut handle) => {
355                         // Perfect match, swap the values and return the old one
356                         mem::swap(handle.val_mut(), &mut value);
357                         Finished(Some(value))
358                     },
359                     GoDown(handle) => {
360                         // We need to keep searching, try to get the search stack
361                         // to go down further
362                         match handle.force() {
363                             Leaf(leaf_handle) => {
364                                 // We've reached a leaf, perform the insertion here
365                                 pusher.seal(leaf_handle).insert(key, value);
366                                 Finished(None)
367                             }
368                             Internal(internal_handle) => {
369                                 // We've found the subtree to insert this key/value pair in,
370                                 // keep searching
371                                 Continue((pusher.push(internal_handle), key, value))
372                             }
373                         }
374                     }
375                 }
376             });
377             match result {
378                 Finished(ret) => return ret,
379                 Continue((new_stack, renewed_key, renewed_val)) => {
380                     stack = new_stack;
381                     key = renewed_key;
382                     value = renewed_val;
383                 }
384             }
385         }
386     }
387
388     // Deletion is the most complicated operation for a B-Tree.
389     //
390     // First we do the same kind of search described in
391     // `find`. But we need to maintain a stack of all the nodes/edges in our search path.
392     // If we don't find the key, then we just return `None` and do nothing. If we do find the
393     // key, we perform two operations: remove the item, and then possibly handle underflow.
394     //
395     // # removing the item
396     //      If the node is a leaf, we just remove the item, and shift
397     //      any items after it back to fill the hole.
398     //
399     //      If the node is an internal node, we *swap* the item with the smallest item in
400     //      in its right subtree (which must reside in a leaf), and then revert to the leaf
401     //      case
402     //
403     // # handling underflow
404     //      After removing an item, there may be too few items in the node. We want nodes
405     //      to be mostly full for efficiency, although we make an exception for the root, which
406     //      may have as few as one item. If this is the case, we may first try to steal
407     //      an item from our left or right neighbour.
408     //
409     //      To steal from the left (right) neighbour,
410     //      we take the largest (smallest) item and child from it. We then swap the taken item
411     //      with the item in their mutual parent that separates them, and then insert the
412     //      parent's item and the taken child into the first (last) index of the underflowed node.
413     //
414     //      However, stealing has the possibility of underflowing our neighbour. If this is the
415     //      case, we instead *merge* with our neighbour. This of course reduces the number of
416     //      children in the parent. Therefore, we also steal the item that separates the now
417     //      merged nodes, and insert it into the merged node.
418     //
419     //      Merging may cause the parent to underflow. If this is the case, then we must repeat
420     //      the underflow handling process on the parent. If merging merges the last two children
421     //      of the root, then we replace the root with the merged node.
422
423     /// Removes a key from the map, returning the value at the key if the key
424     /// was previously in the map.
425     ///
426     /// The key may be any borrowed form of the map's key type, but the ordering
427     /// on the borrowed form *must* match the ordering on the key type.
428     ///
429     /// # Examples
430     ///
431     /// ```
432     /// use std::collections::BTreeMap;
433     ///
434     /// let mut map = BTreeMap::new();
435     /// map.insert(1, "a");
436     /// assert_eq!(map.remove(&1), Some("a"));
437     /// assert_eq!(map.remove(&1), None);
438     /// ```
439     #[stable(feature = "rust1", since = "1.0.0")]
440     pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> where K: Borrow<Q>, Q: Ord {
441         // See `swap` for a more thorough description of the stuff going on in here
442         let mut stack = stack::PartialSearchStack::new(self);
443         loop {
444             let result = stack.with(move |pusher, node| {
445                 match Node::search(node, key) {
446                     Found(handle) => {
447                         // Perfect match. Terminate the stack here, and remove the entry
448                         Finished(Some(pusher.seal(handle).remove()))
449                     },
450                     GoDown(handle) => {
451                         // We need to keep searching, try to go down the next edge
452                         match handle.force() {
453                             // We're at a leaf; the key isn't in here
454                             Leaf(_) => Finished(None),
455                             Internal(internal_handle) => Continue(pusher.push(internal_handle))
456                         }
457                     }
458                 }
459             });
460             match result {
461                 Finished(ret) => return ret,
462                 Continue(new_stack) => stack = new_stack
463             }
464         }
465     }
466 }
467
468 #[stable(feature = "rust1", since = "1.0.0")]
469 impl<K, V> IntoIterator for BTreeMap<K, V> {
470     type Item = (K, V);
471     type IntoIter = IntoIter<K, V>;
472
473     /// Gets an owning iterator over the entries of the map.
474     ///
475     /// # Examples
476     ///
477     /// ```
478     /// use std::collections::BTreeMap;
479     ///
480     /// let mut map = BTreeMap::new();
481     /// map.insert(1, "a");
482     /// map.insert(2, "b");
483     /// map.insert(3, "c");
484     ///
485     /// for (key, value) in map.into_iter() {
486     ///     println!("{}: {}", key, value);
487     /// }
488     /// ```
489     fn into_iter(self) -> IntoIter<K, V> {
490         let len = self.len();
491         let mut lca = VecDeque::new();
492         lca.push_back(Traverse::traverse(self.root));
493         IntoIter {
494             inner: AbsIter {
495                 traversals: lca,
496                 size: len,
497             }
498         }
499     }
500 }
501
502 #[stable(feature = "rust1", since = "1.0.0")]
503 impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V> {
504     type Item = (&'a K, &'a V);
505     type IntoIter = Iter<'a, K, V>;
506
507     fn into_iter(self) -> Iter<'a, K, V> {
508         self.iter()
509     }
510 }
511
512 #[stable(feature = "rust1", since = "1.0.0")]
513 impl<'a, K, V> IntoIterator for &'a mut BTreeMap<K, V> {
514     type Item = (&'a K, &'a mut V);
515     type IntoIter = IterMut<'a, K, V>;
516
517     fn into_iter(mut self) -> IterMut<'a, K, V> {
518         self.iter_mut()
519     }
520 }
521
522 /// A helper enum useful for deciding whether to continue a loop since we can't
523 /// return from a closure
524 enum Continuation<A, B> {
525     Continue(A),
526     Finished(B)
527 }
528
529 /// The stack module provides a safe interface for constructing and manipulating a stack of ptrs
530 /// to nodes. By using this module much better safety guarantees can be made, and more search
531 /// boilerplate gets cut out.
532 mod stack {
533     use core::prelude::*;
534     use core::marker;
535     use core::mem;
536     use core::ops::{Deref, DerefMut};
537     use super::BTreeMap;
538     use super::super::node::{self, Node, Fit, Split, Internal, Leaf};
539     use super::super::node::handle;
540     use vec::Vec;
541
542     struct InvariantLifetime<'id>(
543         marker::PhantomData<::core::cell::Cell<&'id ()>>);
544
545     impl<'id> InvariantLifetime<'id> {
546         fn new() -> InvariantLifetime<'id> {
547             InvariantLifetime(marker::PhantomData)
548         }
549     }
550
551     /// A generic mutable reference, identical to `&mut` except for the fact that its lifetime
552     /// parameter is invariant. This means that wherever an `IdRef` is expected, only an `IdRef`
553     /// with the exact requested lifetime can be used. This is in contrast to normal references,
554     /// where `&'static` can be used in any function expecting any lifetime reference.
555     pub struct IdRef<'id, T: 'id> {
556         inner: &'id mut T,
557         _marker: InvariantLifetime<'id>,
558     }
559
560     impl<'id, T> Deref for IdRef<'id, T> {
561         type Target = T;
562
563         fn deref(&self) -> &T {
564             &*self.inner
565         }
566     }
567
568     impl<'id, T> DerefMut for IdRef<'id, T> {
569         fn deref_mut(&mut self) -> &mut T {
570             &mut *self.inner
571         }
572     }
573
574     type StackItem<K, V> = node::Handle<*mut Node<K, V>, handle::Edge, handle::Internal>;
575     type Stack<K, V> = Vec<StackItem<K, V>>;
576
577     /// A `PartialSearchStack` handles the construction of a search stack.
578     pub struct PartialSearchStack<'a, K:'a, V:'a> {
579         map: &'a mut BTreeMap<K, V>,
580         stack: Stack<K, V>,
581         next: *mut Node<K, V>,
582     }
583
584     /// A `SearchStack` represents a full path to an element or an edge of interest. It provides
585     /// methods depending on the type of what the path points to for removing an element, inserting
586     /// a new element, and manipulating to element at the top of the stack.
587     pub struct SearchStack<'a, K:'a, V:'a, Type, NodeType> {
588         map: &'a mut BTreeMap<K, V>,
589         stack: Stack<K, V>,
590         top: node::Handle<*mut Node<K, V>, Type, NodeType>,
591     }
592
593     /// A `PartialSearchStack` that doesn't hold a a reference to the next node, and is just
594     /// just waiting for a `Handle` to that next node to be pushed. See `PartialSearchStack::with`
595     /// for more details.
596     pub struct Pusher<'id, 'a, K:'a, V:'a> {
597         map: &'a mut BTreeMap<K, V>,
598         stack: Stack<K, V>,
599         _marker: InvariantLifetime<'id>,
600     }
601
602     impl<'a, K, V> PartialSearchStack<'a, K, V> {
603         /// Creates a new PartialSearchStack from a BTreeMap by initializing the stack with the
604         /// root of the tree.
605         pub fn new(map: &'a mut BTreeMap<K, V>) -> PartialSearchStack<'a, K, V> {
606             let depth = map.depth;
607
608             PartialSearchStack {
609                 next: &mut map.root as *mut _,
610                 map: map,
611                 stack: Vec::with_capacity(depth),
612             }
613         }
614
615         /// Breaks up the stack into a `Pusher` and the next `Node`, allowing the given closure
616         /// to interact with, search, and finally push the `Node` onto the stack. The passed in
617         /// closure must be polymorphic on the `'id` lifetime parameter, as this statically
618         /// ensures that only `Handle`s from the correct `Node` can be pushed.
619         ///
620         /// The reason this works is that the `Pusher` has an `'id` parameter, and will only accept
621         /// handles with the same `'id`. The closure could only get references with that lifetime
622         /// through its arguments or through some other `IdRef` that it has lying around. However,
623         /// no other `IdRef` could possibly work - because the `'id` is held in an invariant
624         /// parameter, it would need to have precisely the correct lifetime, which would mean that
625         /// at least one of the calls to `with` wouldn't be properly polymorphic, wanting a
626         /// specific lifetime instead of the one that `with` chooses to give it.
627         ///
628         /// See also Haskell's `ST` monad, which uses a similar trick.
629         pub fn with<T, F: for<'id> FnOnce(Pusher<'id, 'a, K, V>,
630                                           IdRef<'id, Node<K, V>>) -> T>(self, closure: F) -> T {
631             let pusher = Pusher {
632                 map: self.map,
633                 stack: self.stack,
634                 _marker: InvariantLifetime::new(),
635             };
636             let node = IdRef {
637                 inner: unsafe { &mut *self.next },
638                 _marker: InvariantLifetime::new(),
639             };
640
641             closure(pusher, node)
642         }
643     }
644
645     impl<'id, 'a, K, V> Pusher<'id, 'a, K, V> {
646         /// Pushes the requested child of the stack's current top on top of the stack. If the child
647         /// exists, then a new PartialSearchStack is yielded. Otherwise, a VacantSearchStack is
648         /// yielded.
649         pub fn push(mut self, mut edge: node::Handle<IdRef<'id, Node<K, V>>,
650                                                      handle::Edge,
651                                                      handle::Internal>)
652                     -> PartialSearchStack<'a, K, V> {
653             self.stack.push(edge.as_raw());
654             PartialSearchStack {
655                 map: self.map,
656                 stack: self.stack,
657                 next: edge.edge_mut() as *mut _,
658             }
659         }
660
661         /// Converts the PartialSearchStack into a SearchStack.
662         pub fn seal<Type, NodeType>
663                    (self, mut handle: node::Handle<IdRef<'id, Node<K, V>>, Type, NodeType>)
664                     -> SearchStack<'a, K, V, Type, NodeType> {
665             SearchStack {
666                 map: self.map,
667                 stack: self.stack,
668                 top: handle.as_raw(),
669             }
670         }
671     }
672
673     impl<'a, K, V, NodeType> SearchStack<'a, K, V, handle::KV, NodeType> {
674         /// Gets a reference to the value the stack points to.
675         pub fn peek(&self) -> &V {
676             unsafe { self.top.from_raw().into_kv().1 }
677         }
678
679         /// Gets a mutable reference to the value the stack points to.
680         pub fn peek_mut(&mut self) -> &mut V {
681             unsafe { self.top.from_raw_mut().into_kv_mut().1 }
682         }
683
684         /// Converts the stack into a mutable reference to the value it points to, with a lifetime
685         /// tied to the original tree.
686         pub fn into_top(mut self) -> &'a mut V {
687             unsafe {
688                 mem::copy_mut_lifetime(
689                     self.map,
690                     self.top.from_raw_mut().val_mut()
691                 )
692             }
693         }
694     }
695
696     impl<'a, K, V> SearchStack<'a, K, V, handle::KV, handle::Leaf> {
697         /// Removes the key and value in the top element of the stack, then handles underflows as
698         /// described in BTree's pop function.
699         fn remove_leaf(mut self) -> V {
700             self.map.length -= 1;
701
702             // Remove the key-value pair from the leaf that this search stack points to.
703             // Then, note if the leaf is underfull, and promptly forget the leaf and its ptr
704             // to avoid ownership issues.
705             let (value, mut underflow) = unsafe {
706                 let (_, value) = self.top.from_raw_mut().remove_as_leaf();
707                 let underflow = self.top.from_raw().node().is_underfull();
708                 (value, underflow)
709             };
710
711             loop {
712                 match self.stack.pop() {
713                     None => {
714                         // We've reached the root, so no matter what, we're done. We manually
715                         // access the root via the tree itself to avoid creating any dangling
716                         // pointers.
717                         if self.map.root.is_empty() && !self.map.root.is_leaf() {
718                             // We've emptied out the root, so make its only child the new root.
719                             // If it's a leaf, we just let it become empty.
720                             self.map.depth -= 1;
721                             self.map.root.hoist_lone_child();
722                         }
723                         return value;
724                     }
725                     Some(mut handle) => {
726                         if underflow {
727                             // Underflow! Handle it!
728                             unsafe {
729                                 handle.from_raw_mut().handle_underflow();
730                                 underflow = handle.from_raw().node().is_underfull();
731                             }
732                         } else {
733                             // All done!
734                             return value;
735                         }
736                     }
737                 }
738             }
739         }
740     }
741
742     impl<'a, K, V> SearchStack<'a, K, V, handle::KV, handle::LeafOrInternal> {
743         /// Removes the key and value in the top element of the stack, then handles underflows as
744         /// described in BTree's pop function.
745         pub fn remove(self) -> V {
746             // Ensure that the search stack goes to a leaf. This is necessary to perform deletion
747             // in a BTree. Note that this may put the tree in an inconsistent state (further
748             // described in into_leaf's comments), but this is immediately fixed by the
749             // removing the value we want to remove
750             self.into_leaf().remove_leaf()
751         }
752
753         /// Subroutine for removal. Takes a search stack for a key that might terminate at an
754         /// internal node, and mutates the tree and search stack to *make* it a search stack
755         /// for that same key that *does* terminates at a leaf. If the mutation occurs, then this
756         /// leaves the tree in an inconsistent state that must be repaired by the caller by
757         /// removing the entry in question. Specifically the key-value pair and its successor will
758         /// become swapped.
759         fn into_leaf(mut self) -> SearchStack<'a, K, V, handle::KV, handle::Leaf> {
760             unsafe {
761                 let mut top_raw = self.top;
762                 let mut top = top_raw.from_raw_mut();
763
764                 let key_ptr = top.key_mut() as *mut _;
765                 let val_ptr = top.val_mut() as *mut _;
766
767                 // Try to go into the right subtree of the found key to find its successor
768                 match top.force() {
769                     Leaf(mut leaf_handle) => {
770                         // We're a proper leaf stack, nothing to do
771                         return SearchStack {
772                             map: self.map,
773                             stack: self.stack,
774                             top: leaf_handle.as_raw()
775                         }
776                     }
777                     Internal(mut internal_handle) => {
778                         let mut right_handle = internal_handle.right_edge();
779
780                         //We're not a proper leaf stack, let's get to work.
781                         self.stack.push(right_handle.as_raw());
782
783                         let mut temp_node = right_handle.edge_mut();
784                         loop {
785                             // Walk into the smallest subtree of this node
786                             let node = temp_node;
787
788                             match node.kv_handle(0).force() {
789                                 Leaf(mut handle) => {
790                                     // This node is a leaf, do the swap and return
791                                     mem::swap(handle.key_mut(), &mut *key_ptr);
792                                     mem::swap(handle.val_mut(), &mut *val_ptr);
793                                     return SearchStack {
794                                         map: self.map,
795                                         stack: self.stack,
796                                         top: handle.as_raw()
797                                     }
798                                 },
799                                 Internal(kv_handle) => {
800                                     // This node is internal, go deeper
801                                     let mut handle = kv_handle.into_left_edge();
802                                     self.stack.push(handle.as_raw());
803                                     temp_node = handle.into_edge_mut();
804                                 }
805                             }
806                         }
807                     }
808                 }
809             }
810         }
811     }
812
813     impl<'a, K, V> SearchStack<'a, K, V, handle::Edge, handle::Leaf> {
814         /// Inserts the key and value into the top element in the stack, and if that node has to
815         /// split recursively inserts the split contents into the next element stack until
816         /// splits stop.
817         ///
818         /// Assumes that the stack represents a search path from the root to a leaf.
819         ///
820         /// An &mut V is returned to the inserted value, for callers that want a reference to this.
821         pub fn insert(mut self, key: K, val: V) -> &'a mut V {
822             unsafe {
823                 self.map.length += 1;
824
825                 // Insert the key and value into the leaf at the top of the stack
826                 let (mut insertion, inserted_ptr) = self.top.from_raw_mut()
827                                                         .insert_as_leaf(key, val);
828
829                 loop {
830                     match insertion {
831                         Fit => {
832                             // The last insertion went off without a hitch, no splits! We can stop
833                             // inserting now.
834                             return &mut *inserted_ptr;
835                         }
836                         Split(key, val, right) => match self.stack.pop() {
837                             // The last insertion triggered a split, so get the next element on the
838                             // stack to recursively insert the split node into.
839                             None => {
840                                 // The stack was empty; we've split the root, and need to make a
841                                 // a new one. This is done in-place because we can't move the
842                                 // root out of a reference to the tree.
843                                 Node::make_internal_root(&mut self.map.root, self.map.b,
844                                                          key, val, right);
845
846                                 self.map.depth += 1;
847                                 return &mut *inserted_ptr;
848                             }
849                             Some(mut handle) => {
850                                 // The stack wasn't empty, do the insertion and recurse
851                                 insertion = handle.from_raw_mut()
852                                                   .insert_as_internal(key, val, right);
853                                 continue;
854                             }
855                         }
856                     }
857                 }
858             }
859         }
860     }
861 }
862
863 #[stable(feature = "rust1", since = "1.0.0")]
864 impl<K: Ord, V> FromIterator<(K, V)> for BTreeMap<K, V> {
865     fn from_iter<T: IntoIterator<Item=(K, V)>>(iter: T) -> BTreeMap<K, V> {
866         let mut map = BTreeMap::new();
867         map.extend(iter);
868         map
869     }
870 }
871
872 #[stable(feature = "rust1", since = "1.0.0")]
873 impl<K: Ord, V> Extend<(K, V)> for BTreeMap<K, V> {
874     #[inline]
875     fn extend<T: IntoIterator<Item=(K, V)>>(&mut self, iter: T) {
876         for (k, v) in iter {
877             self.insert(k, v);
878         }
879     }
880 }
881
882 #[stable(feature = "extend_ref", since = "1.2.0")]
883 impl<'a, K: Ord + Copy, V: Copy> Extend<(&'a K, &'a V)> for BTreeMap<K, V> {
884     fn extend<I: IntoIterator<Item=(&'a K, &'a V)>>(&mut self, iter: I) {
885         self.extend(iter.into_iter().map(|(&key, &value)| (key, value)));
886     }
887 }
888
889 #[stable(feature = "rust1", since = "1.0.0")]
890 impl<K: Hash, V: Hash> Hash for BTreeMap<K, V> {
891     fn hash<H: Hasher>(&self, state: &mut H) {
892         for elt in self {
893             elt.hash(state);
894         }
895     }
896 }
897
898 #[stable(feature = "rust1", since = "1.0.0")]
899 impl<K: Ord, V> Default for BTreeMap<K, V> {
900     #[stable(feature = "rust1", since = "1.0.0")]
901     fn default() -> BTreeMap<K, V> {
902         BTreeMap::new()
903     }
904 }
905
906 #[stable(feature = "rust1", since = "1.0.0")]
907 impl<K: PartialEq, V: PartialEq> PartialEq for BTreeMap<K, V> {
908     fn eq(&self, other: &BTreeMap<K, V>) -> bool {
909         self.len() == other.len() &&
910             self.iter().zip(other).all(|(a, b)| a == b)
911     }
912 }
913
914 #[stable(feature = "rust1", since = "1.0.0")]
915 impl<K: Eq, V: Eq> Eq for BTreeMap<K, V> {}
916
917 #[stable(feature = "rust1", since = "1.0.0")]
918 impl<K: PartialOrd, V: PartialOrd> PartialOrd for BTreeMap<K, V> {
919     #[inline]
920     fn partial_cmp(&self, other: &BTreeMap<K, V>) -> Option<Ordering> {
921         iter::order::partial_cmp(self.iter(), other.iter())
922     }
923 }
924
925 #[stable(feature = "rust1", since = "1.0.0")]
926 impl<K: Ord, V: Ord> Ord for BTreeMap<K, V> {
927     #[inline]
928     fn cmp(&self, other: &BTreeMap<K, V>) -> Ordering {
929         iter::order::cmp(self.iter(), other.iter())
930     }
931 }
932
933 #[stable(feature = "rust1", since = "1.0.0")]
934 impl<K: Debug, V: Debug> Debug for BTreeMap<K, V> {
935     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
936         f.debug_map().entries(self.iter()).finish()
937     }
938 }
939
940 #[stable(feature = "rust1", since = "1.0.0")]
941 impl<'a, K: Ord, Q: ?Sized, V> Index<&'a Q> for BTreeMap<K, V>
942     where K: Borrow<Q>, Q: Ord
943 {
944     type Output = V;
945
946     #[inline]
947     fn index(&self, key: &Q) -> &V {
948         self.get(key).expect("no entry found for key")
949     }
950 }
951
952 /// Genericises over how to get the correct type of iterator from the correct type
953 /// of Node ownership.
954 trait Traverse<N> {
955     fn traverse(node: N) -> Self;
956 }
957
958 impl<'a, K, V> Traverse<&'a Node<K, V>> for Traversal<'a, K, V> {
959     fn traverse(node: &'a Node<K, V>) -> Traversal<'a, K, V> {
960         node.iter()
961     }
962 }
963
964 impl<'a, K, V> Traverse<&'a mut Node<K, V>> for MutTraversal<'a, K, V> {
965     fn traverse(node: &'a mut Node<K, V>) -> MutTraversal<'a, K, V> {
966         node.iter_mut()
967     }
968 }
969
970 impl<K, V> Traverse<Node<K, V>> for MoveTraversal<K, V> {
971     fn traverse(node: Node<K, V>) -> MoveTraversal<K, V> {
972         node.into_iter()
973     }
974 }
975
976 /// Represents an operation to perform inside the following iterator methods.
977 /// This is necessary to use in `next` because we want to modify `self.traversals` inside
978 /// a match that borrows it. Similarly in `next_back`. Instead, we use this enum to note
979 /// what we want to do, and do it after the match.
980 enum StackOp<T> {
981     Push(T),
982     Pop,
983 }
984 impl<K, V, E, T> Iterator for AbsIter<T> where
985     T: DoubleEndedIterator<Item=TraversalItem<K, V, E>> + Traverse<E>,
986 {
987     type Item = (K, V);
988
989     // Our iterator represents a queue of all ancestors of elements we have
990     // yet to yield, from smallest to largest.  Note that the design of these
991     // iterators permits an *arbitrary* initial pair of min and max, making
992     // these arbitrary sub-range iterators.
993     fn next(&mut self) -> Option<(K, V)> {
994         loop {
995             // We want the smallest element, so try to get the back of the queue
996             let op = match self.traversals.back_mut() {
997                 None => return None,
998                 // The queue wasn't empty, so continue along the node in its head
999                 Some(iter) => match iter.next() {
1000                     // The head is empty, so Pop it off and continue the process
1001                     None => Pop,
1002                     // The head yielded an edge, so make that the new head
1003                     Some(Edge(next)) => Push(Traverse::traverse(next)),
1004                     // The head yielded an entry, so yield that
1005                     Some(Elem(kv)) => {
1006                         self.size -= 1;
1007                         return Some(kv)
1008                     }
1009                 }
1010             };
1011
1012             // Handle any operation as necessary, without a conflicting borrow of the queue
1013             match op {
1014                 Push(item) => { self.traversals.push_back(item); },
1015                 Pop => { self.traversals.pop_back(); },
1016             }
1017         }
1018     }
1019
1020     fn size_hint(&self) -> (usize, Option<usize>) {
1021         (self.size, Some(self.size))
1022     }
1023 }
1024
1025 impl<K, V, E, T> DoubleEndedIterator for AbsIter<T> where
1026     T: DoubleEndedIterator<Item=TraversalItem<K, V, E>> + Traverse<E>,
1027 {
1028     // next_back is totally symmetric to next
1029     #[inline]
1030     fn next_back(&mut self) -> Option<(K, V)> {
1031         loop {
1032             let op = match self.traversals.front_mut() {
1033                 None => return None,
1034                 Some(iter) => match iter.next_back() {
1035                     None => Pop,
1036                     Some(Edge(next)) => Push(Traverse::traverse(next)),
1037                     Some(Elem(kv)) => {
1038                         self.size -= 1;
1039                         return Some(kv)
1040                     }
1041                 }
1042             };
1043
1044             match op {
1045                 Push(item) => { self.traversals.push_front(item); },
1046                 Pop => { self.traversals.pop_front(); }
1047             }
1048         }
1049     }
1050 }
1051
1052 impl<'a, K, V> Clone for Iter<'a, K, V> {
1053     fn clone(&self) -> Iter<'a, K, V> { Iter { inner: self.inner.clone() } }
1054 }
1055 #[stable(feature = "rust1", since = "1.0.0")]
1056 impl<'a, K, V> Iterator for Iter<'a, K, V> {
1057     type Item = (&'a K, &'a V);
1058
1059     fn next(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next() }
1060     fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
1061 }
1062 #[stable(feature = "rust1", since = "1.0.0")]
1063 impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
1064     fn next_back(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next_back() }
1065 }
1066 #[stable(feature = "rust1", since = "1.0.0")]
1067 impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {}
1068
1069 #[stable(feature = "rust1", since = "1.0.0")]
1070 impl<'a, K, V> Iterator for IterMut<'a, K, V> {
1071     type Item = (&'a K, &'a mut V);
1072
1073     fn next(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next() }
1074     fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
1075 }
1076 #[stable(feature = "rust1", since = "1.0.0")]
1077 impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
1078     fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next_back() }
1079 }
1080 #[stable(feature = "rust1", since = "1.0.0")]
1081 impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {}
1082
1083 #[stable(feature = "rust1", since = "1.0.0")]
1084 impl<K, V> Iterator for IntoIter<K, V> {
1085     type Item = (K, V);
1086
1087     fn next(&mut self) -> Option<(K, V)> { self.inner.next() }
1088     fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
1089 }
1090 #[stable(feature = "rust1", since = "1.0.0")]
1091 impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
1092     fn next_back(&mut self) -> Option<(K, V)> { self.inner.next_back() }
1093 }
1094 #[stable(feature = "rust1", since = "1.0.0")]
1095 impl<K, V> ExactSizeIterator for IntoIter<K, V> {}
1096
1097 impl<'a, K, V> Clone for Keys<'a, K, V> {
1098     fn clone(&self) -> Keys<'a, K, V> { Keys { inner: self.inner.clone() } }
1099 }
1100 #[stable(feature = "rust1", since = "1.0.0")]
1101 impl<'a, K, V> Iterator for Keys<'a, K, V> {
1102     type Item = &'a K;
1103
1104     fn next(&mut self) -> Option<(&'a K)> { self.inner.next() }
1105     fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
1106 }
1107 #[stable(feature = "rust1", since = "1.0.0")]
1108 impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
1109     fn next_back(&mut self) -> Option<(&'a K)> { self.inner.next_back() }
1110 }
1111 #[stable(feature = "rust1", since = "1.0.0")]
1112 impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {}
1113
1114
1115 impl<'a, K, V> Clone for Values<'a, K, V> {
1116     fn clone(&self) -> Values<'a, K, V> { Values { inner: self.inner.clone() } }
1117 }
1118 #[stable(feature = "rust1", since = "1.0.0")]
1119 impl<'a, K, V> Iterator for Values<'a, K, V> {
1120     type Item = &'a V;
1121
1122     fn next(&mut self) -> Option<(&'a V)> { self.inner.next() }
1123     fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() }
1124 }
1125 #[stable(feature = "rust1", since = "1.0.0")]
1126 impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
1127     fn next_back(&mut self) -> Option<(&'a V)> { self.inner.next_back() }
1128 }
1129 #[stable(feature = "rust1", since = "1.0.0")]
1130 impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {}
1131
1132 impl<'a, K, V> Clone for Range<'a, K, V> {
1133     fn clone(&self) -> Range<'a, K, V> { Range { inner: self.inner.clone() } }
1134 }
1135 impl<'a, K, V> Iterator for Range<'a, K, V> {
1136     type Item = (&'a K, &'a V);
1137
1138     fn next(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next() }
1139 }
1140 impl<'a, K, V> DoubleEndedIterator for Range<'a, K, V> {
1141     fn next_back(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next_back() }
1142 }
1143
1144 impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
1145     type Item = (&'a K, &'a mut V);
1146
1147     fn next(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next() }
1148 }
1149 impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V> {
1150     fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> { self.inner.next_back() }
1151 }
1152
1153 impl<'a, K: Ord, V> Entry<'a, K, V> {
1154     #[unstable(feature = "std_misc",
1155                reason = "will soon be replaced by or_insert")]
1156     #[deprecated(since = "1.0",
1157                 reason = "replaced with more ergonomic `or_insert` and `or_insert_with`")]
1158     /// Returns a mutable reference to the entry if occupied, or the VacantEntry if vacant
1159     pub fn get(self) -> Result<&'a mut V, VacantEntry<'a, K, V>> {
1160         match self {
1161             Occupied(entry) => Ok(entry.into_mut()),
1162             Vacant(entry) => Err(entry),
1163         }
1164     }
1165
1166     #[stable(feature = "rust1", since = "1.0.0")]
1167     /// Ensures a value is in the entry by inserting the default if empty, and returns
1168     /// a mutable reference to the value in the entry.
1169     pub fn or_insert(self, default: V) -> &'a mut V {
1170         match self {
1171             Occupied(entry) => entry.into_mut(),
1172             Vacant(entry) => entry.insert(default),
1173         }
1174     }
1175
1176     #[stable(feature = "rust1", since = "1.0.0")]
1177     /// Ensures a value is in the entry by inserting the result of the default function if empty,
1178     /// and returns a mutable reference to the value in the entry.
1179     pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
1180         match self {
1181             Occupied(entry) => entry.into_mut(),
1182             Vacant(entry) => entry.insert(default()),
1183         }
1184     }
1185 }
1186
1187 impl<'a, K: Ord, V> VacantEntry<'a, K, V> {
1188     /// Sets the value of the entry with the VacantEntry's key,
1189     /// and returns a mutable reference to it.
1190     #[stable(feature = "rust1", since = "1.0.0")]
1191     pub fn insert(self, value: V) -> &'a mut V {
1192         self.stack.insert(self.key, value)
1193     }
1194 }
1195
1196 impl<'a, K: Ord, V> OccupiedEntry<'a, K, V> {
1197     /// Gets a reference to the value in the entry.
1198     #[stable(feature = "rust1", since = "1.0.0")]
1199     pub fn get(&self) -> &V {
1200         self.stack.peek()
1201     }
1202
1203     /// Gets a mutable reference to the value in the entry.
1204     #[stable(feature = "rust1", since = "1.0.0")]
1205     pub fn get_mut(&mut self) -> &mut V {
1206         self.stack.peek_mut()
1207     }
1208
1209     /// Converts the entry into a mutable reference to its value.
1210     #[stable(feature = "rust1", since = "1.0.0")]
1211     pub fn into_mut(self) -> &'a mut V {
1212         self.stack.into_top()
1213     }
1214
1215     /// Sets the value of the entry with the OccupiedEntry's key,
1216     /// and returns the entry's old value.
1217     #[stable(feature = "rust1", since = "1.0.0")]
1218     pub fn insert(&mut self, mut value: V) -> V {
1219         mem::swap(self.stack.peek_mut(), &mut value);
1220         value
1221     }
1222
1223     /// Takes the value of the entry out of the map, and returns it.
1224     #[stable(feature = "rust1", since = "1.0.0")]
1225     pub fn remove(self) -> V {
1226         self.stack.remove()
1227     }
1228 }
1229
1230 impl<K, V> BTreeMap<K, V> {
1231     /// Gets an iterator over the entries of the map.
1232     ///
1233     /// # Examples
1234     ///
1235     /// ```
1236     /// use std::collections::BTreeMap;
1237     ///
1238     /// let mut map = BTreeMap::new();
1239     /// map.insert(1, "a");
1240     /// map.insert(2, "b");
1241     /// map.insert(3, "c");
1242     ///
1243     /// for (key, value) in map.iter() {
1244     ///     println!("{}: {}", key, value);
1245     /// }
1246     ///
1247     /// let (first_key, first_value) = map.iter().next().unwrap();
1248     /// assert_eq!((*first_key, *first_value), (1, "a"));
1249     /// ```
1250     #[stable(feature = "rust1", since = "1.0.0")]
1251     pub fn iter(&self) -> Iter<K, V> {
1252         let len = self.len();
1253         // NB. The initial capacity for ringbuf is large enough to avoid reallocs in many cases.
1254         let mut lca = VecDeque::new();
1255         lca.push_back(Traverse::traverse(&self.root));
1256         Iter {
1257             inner: AbsIter {
1258                 traversals: lca,
1259                 size: len,
1260             }
1261         }
1262     }
1263
1264     /// Gets a mutable iterator over the entries of the map.
1265     ///
1266     /// # Examples
1267     ///
1268     /// ```
1269     /// use std::collections::BTreeMap;
1270     ///
1271     /// let mut map = BTreeMap::new();
1272     /// map.insert("a", 1);
1273     /// map.insert("b", 2);
1274     /// map.insert("c", 3);
1275     ///
1276     /// // add 10 to the value if the key isn't "a"
1277     /// for (key, value) in map.iter_mut() {
1278     ///     if key != &"a" {
1279     ///         *value += 10;
1280     ///     }
1281     /// }
1282     /// ```
1283     #[stable(feature = "rust1", since = "1.0.0")]
1284     pub fn iter_mut(&mut self) -> IterMut<K, V> {
1285         let len = self.len();
1286         let mut lca = VecDeque::new();
1287         lca.push_back(Traverse::traverse(&mut self.root));
1288         IterMut {
1289             inner: AbsIter {
1290                 traversals: lca,
1291                 size: len,
1292             }
1293         }
1294     }
1295
1296     /// Gets an iterator over the keys of the map.
1297     ///
1298     /// # Examples
1299     ///
1300     /// ```
1301     /// use std::collections::BTreeMap;
1302     ///
1303     /// let mut a = BTreeMap::new();
1304     /// a.insert(1, "a");
1305     /// a.insert(2, "b");
1306     ///
1307     /// let keys: Vec<_> = a.keys().cloned().collect();
1308     /// assert_eq!(keys, [1, 2]);
1309     /// ```
1310     #[stable(feature = "rust1", since = "1.0.0")]
1311     pub fn keys<'a>(&'a self) -> Keys<'a, K, V> {
1312         fn first<A, B>((a, _): (A, B)) -> A { a }
1313         let first: fn((&'a K, &'a V)) -> &'a K = first; // coerce to fn pointer
1314
1315         Keys { inner: self.iter().map(first) }
1316     }
1317
1318     /// Gets an iterator over the values of the map.
1319     ///
1320     /// # Examples
1321     ///
1322     /// ```
1323     /// use std::collections::BTreeMap;
1324     ///
1325     /// let mut a = BTreeMap::new();
1326     /// a.insert(1, "a");
1327     /// a.insert(2, "b");
1328     ///
1329     /// let values: Vec<&str> = a.values().cloned().collect();
1330     /// assert_eq!(values, ["a", "b"]);
1331     /// ```
1332     #[stable(feature = "rust1", since = "1.0.0")]
1333     pub fn values<'a>(&'a self) -> Values<'a, K, V> {
1334         fn second<A, B>((_, b): (A, B)) -> B { b }
1335         let second: fn((&'a K, &'a V)) -> &'a V = second; // coerce to fn pointer
1336
1337         Values { inner: self.iter().map(second) }
1338     }
1339
1340     /// Returns the number of elements in the map.
1341     ///
1342     /// # Examples
1343     ///
1344     /// ```
1345     /// use std::collections::BTreeMap;
1346     ///
1347     /// let mut a = BTreeMap::new();
1348     /// assert_eq!(a.len(), 0);
1349     /// a.insert(1, "a");
1350     /// assert_eq!(a.len(), 1);
1351     /// ```
1352     #[stable(feature = "rust1", since = "1.0.0")]
1353     pub fn len(&self) -> usize { self.length }
1354
1355     /// Returns true if the map contains no elements.
1356     ///
1357     /// # Examples
1358     ///
1359     /// ```
1360     /// use std::collections::BTreeMap;
1361     ///
1362     /// let mut a = BTreeMap::new();
1363     /// assert!(a.is_empty());
1364     /// a.insert(1, "a");
1365     /// assert!(!a.is_empty());
1366     /// ```
1367     #[stable(feature = "rust1", since = "1.0.0")]
1368     pub fn is_empty(&self) -> bool { self.len() == 0 }
1369 }
1370
1371 macro_rules! range_impl {
1372     ($root:expr, $min:expr, $max:expr, $as_slices_internal:ident, $iter:ident, $Range:ident,
1373                                        $edges:ident, [$($mutability:ident)*]) => (
1374         {
1375             // A deque that encodes two search paths containing (left-to-right):
1376             // a series of truncated-from-the-left iterators, the LCA's doubly-truncated iterator,
1377             // and a series of truncated-from-the-right iterators.
1378             let mut traversals = VecDeque::new();
1379             let (root, min, max) = ($root, $min, $max);
1380
1381             let mut leftmost = None;
1382             let mut rightmost = None;
1383
1384             match (&min, &max) {
1385                 (&Unbounded, &Unbounded) => {
1386                     traversals.push_back(Traverse::traverse(root))
1387                 }
1388                 (&Unbounded, &Included(_)) | (&Unbounded, &Excluded(_)) => {
1389                     rightmost = Some(root);
1390                 }
1391                 (&Included(_), &Unbounded) | (&Excluded(_), &Unbounded) => {
1392                     leftmost = Some(root);
1393                 }
1394                   (&Included(min_key), &Included(max_key))
1395                 | (&Included(min_key), &Excluded(max_key))
1396                 | (&Excluded(min_key), &Included(max_key))
1397                 | (&Excluded(min_key), &Excluded(max_key)) => {
1398                     // lca represents the Lowest Common Ancestor, above which we never
1399                     // walk, since everything else is outside the range to iterate.
1400                     //       ___________________
1401                     //      |__0_|_80_|_85_|_90_|  (root)
1402                     //      |    |    |    |    |
1403                     //           |
1404                     //           v
1405                     //  ___________________
1406                     // |__5_|_15_|_30_|_73_|
1407                     // |    |    |    |    |
1408                     //                |
1409                     //                v
1410                     //       ___________________
1411                     //      |_33_|_58_|_63_|_68_|  lca for the range [41, 65]
1412                     //      |    |\___|___/|    |  iterator at traversals[2]
1413                     //           |         |
1414                     //           |         v
1415                     //           v         rightmost
1416                     //           leftmost
1417                     let mut is_leaf = root.is_leaf();
1418                     let mut lca = root.$as_slices_internal();
1419                     loop {
1420                         let slice = lca.slice_from(min_key).slice_to(max_key);
1421                         if let [ref $($mutability)* edge] = slice.edges {
1422                             // Follow the only edge that leads the node that covers the range.
1423                             is_leaf = edge.is_leaf();
1424                             lca = edge.$as_slices_internal();
1425                         } else {
1426                             let mut iter = slice.$iter();
1427                             if is_leaf {
1428                                 leftmost = None;
1429                                 rightmost = None;
1430                             } else {
1431                                 // Only change the state of nodes with edges.
1432                                 leftmost = iter.next_edge_item();
1433                                 rightmost = iter.next_edge_item_back();
1434                             }
1435                             traversals.push_back(iter);
1436                             break;
1437                         }
1438                     }
1439                 }
1440             }
1441             // Keep narrowing the range by going down.
1442             //               ___________________
1443             //              |_38_|_43_|_48_|_53_|
1444             //              |    |____|____|____/ iterator at traversals[1]
1445             //                   |
1446             //                   v
1447             //  ___________________
1448             // |_39_|_40_|_41_|_42_|  (leaf, the last leftmost)
1449             //           \_________|  iterator at traversals[0]
1450             match min {
1451                 Included(key) | Excluded(key) =>
1452                     while let Some(left) = leftmost {
1453                         let is_leaf = left.is_leaf();
1454                         let mut iter = left.$as_slices_internal().slice_from(key).$iter();
1455                         leftmost = if is_leaf {
1456                             None
1457                         } else {
1458                             // Only change the state of nodes with edges.
1459                             iter.next_edge_item()
1460                         };
1461                         traversals.push_back(iter);
1462                     },
1463                 _ => {}
1464             }
1465             // If the leftmost iterator starts with an element, then it was an exact match.
1466             if let (Excluded(_), Some(leftmost_iter)) = (min, traversals.back_mut()) {
1467                 // Drop this excluded element. `next_kv_item` has no effect when
1468                 // the next item is an edge.
1469                 leftmost_iter.next_kv_item();
1470             }
1471
1472             // The code for the right side is similar.
1473             match max {
1474                 Included(key) | Excluded(key) =>
1475                     while let Some(right) = rightmost {
1476                         let is_leaf = right.is_leaf();
1477                         let mut iter = right.$as_slices_internal().slice_to(key).$iter();
1478                         rightmost = if is_leaf {
1479                             None
1480                         } else {
1481                             iter.next_edge_item_back()
1482                         };
1483                         traversals.push_front(iter);
1484                     },
1485                 _ => {}
1486             }
1487             if let (Excluded(_), Some(rightmost_iter)) = (max, traversals.front_mut()) {
1488                 rightmost_iter.next_kv_item_back();
1489             }
1490
1491             $Range {
1492                 inner: AbsIter {
1493                     traversals: traversals,
1494                     size: usize::MAX, // unused
1495                 }
1496             }
1497         }
1498     )
1499 }
1500
1501 impl<K: Ord, V> BTreeMap<K, V> {
1502     /// Constructs a double-ended iterator over a sub-range of elements in the map, starting
1503     /// at min, and ending at max. If min is `Unbounded`, then it will be treated as "negative
1504     /// infinity", and if max is `Unbounded`, then it will be treated as "positive infinity".
1505     /// Thus range(Unbounded, Unbounded) will yield the whole collection.
1506     ///
1507     /// # Examples
1508     ///
1509     /// ```
1510     /// # #![feature(collections)]
1511     /// use std::collections::BTreeMap;
1512     /// use std::collections::Bound::{Included, Unbounded};
1513     ///
1514     /// let mut map = BTreeMap::new();
1515     /// map.insert(3, "a");
1516     /// map.insert(5, "b");
1517     /// map.insert(8, "c");
1518     /// for (&key, &value) in map.range(Included(&4), Included(&8)) {
1519     ///     println!("{}: {}", key, value);
1520     /// }
1521     /// assert_eq!(Some((&5, &"b")), map.range(Included(&4), Unbounded).next());
1522     /// ```
1523     #[unstable(feature = "collections",
1524                reason = "matches collection reform specification, waiting for dust to settle")]
1525     pub fn range<'a>(&'a self, min: Bound<&K>, max: Bound<&K>) -> Range<'a, K, V> {
1526         range_impl!(&self.root, min, max, as_slices_internal, iter, Range, edges, [])
1527     }
1528
1529     /// Constructs a mutable double-ended iterator over a sub-range of elements in the map, starting
1530     /// at min, and ending at max. If min is `Unbounded`, then it will be treated as "negative
1531     /// infinity", and if max is `Unbounded`, then it will be treated as "positive infinity".
1532     /// Thus range(Unbounded, Unbounded) will yield the whole collection.
1533     ///
1534     /// # Examples
1535     ///
1536     /// ```
1537     /// # #![feature(collections)]
1538     /// use std::collections::BTreeMap;
1539     /// use std::collections::Bound::{Included, Excluded};
1540     ///
1541     /// let mut map: BTreeMap<&str, i32> = ["Alice", "Bob", "Carol", "Cheryl"].iter()
1542     ///                                                                       .map(|&s| (s, 0))
1543     ///                                                                       .collect();
1544     /// for (_, balance) in map.range_mut(Included(&"B"), Excluded(&"Cheryl")) {
1545     ///     *balance += 100;
1546     /// }
1547     /// for (name, balance) in &map {
1548     ///     println!("{} => {}", name, balance);
1549     /// }
1550     /// ```
1551     #[unstable(feature = "collections",
1552                reason = "matches collection reform specification, waiting for dust to settle")]
1553     pub fn range_mut<'a>(&'a mut self, min: Bound<&K>, max: Bound<&K>) -> RangeMut<'a, K, V> {
1554         range_impl!(&mut self.root, min, max, as_slices_internal_mut, iter_mut, RangeMut,
1555                                                                       edges_mut, [mut])
1556     }
1557
1558     /// Gets the given key's corresponding entry in the map for in-place manipulation.
1559     ///
1560     /// # Examples
1561     ///
1562     /// ```
1563     /// use std::collections::BTreeMap;
1564     ///
1565     /// let mut count: BTreeMap<&str, usize> = BTreeMap::new();
1566     ///
1567     /// // count the number of occurrences of letters in the vec
1568     /// for x in vec!["a","b","a","c","a","b"] {
1569     ///     *count.entry(x).or_insert(0) += 1;
1570     /// }
1571     ///
1572     /// assert_eq!(count["a"], 3);
1573     /// ```
1574     #[stable(feature = "rust1", since = "1.0.0")]
1575     pub fn entry(&mut self, mut key: K) -> Entry<K, V> {
1576         // same basic logic of `swap` and `pop`, blended together
1577         let mut stack = stack::PartialSearchStack::new(self);
1578         loop {
1579             let result = stack.with(move |pusher, node| {
1580                 match Node::search(node, &key) {
1581                     Found(handle) => {
1582                         // Perfect match
1583                         Finished(Occupied(OccupiedEntry {
1584                             stack: pusher.seal(handle)
1585                         }))
1586                     },
1587                     GoDown(handle) => {
1588                         match handle.force() {
1589                             Leaf(leaf_handle) => {
1590                                 Finished(Vacant(VacantEntry {
1591                                     stack: pusher.seal(leaf_handle),
1592                                     key: key,
1593                                 }))
1594                             },
1595                             Internal(internal_handle) => {
1596                                 Continue((
1597                                     pusher.push(internal_handle),
1598                                     key
1599                                 ))
1600                             }
1601                         }
1602                     }
1603                 }
1604             });
1605             match result {
1606                 Finished(finished) => return finished,
1607                 Continue((new_stack, renewed_key)) => {
1608                     stack = new_stack;
1609                     key = renewed_key;
1610                 }
1611             }
1612         }
1613     }
1614 }