Skip to content

Commit 717c1cc

Browse files
committed
Use Vec iterators internally
1 parent 8cf7496 commit 717c1cc

File tree

1 file changed

+24
-30
lines changed

1 file changed

+24
-30
lines changed

src/ordered.rs

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use bson::Bson;
22
use std::collections::BTreeMap;
33
use std::iter::{FromIterator, Map};
4+
use std::vec::IntoIter;
5+
use std::slice;
46

57
/// A BSON document represented as an associative BTree Map with insertion ordering.
68
#[derive(Debug, Clone)]
@@ -10,17 +12,15 @@ pub struct OrderedDocument {
1012
}
1113

1214
/// An iterator over OrderedDocument entries.
13-
#[derive(Clone)]
1415
pub struct OrderedDocumentIntoIterator {
15-
ordered_document: OrderedDocument,
16-
index: usize,
16+
vec_iter: IntoIter<String>,
17+
document: BTreeMap<String, Bson>,
1718
}
1819

1920
/// An owning iterator over OrderedDocument entries.
20-
#[derive(Clone)]
2121
pub struct OrderedDocumentIterator<'a> {
22-
ordered_document: &'a OrderedDocument,
23-
index: usize,
22+
vec_iter: slice::Iter<'a, String>,
23+
document: &'a BTreeMap<String, Bson>,
2424
}
2525

2626
/// An iterator over an OrderedDocument's keys.
@@ -33,19 +33,11 @@ pub struct Values<'a> {
3333
inner: Map<OrderedDocumentIterator<'a>, fn((&'a String, &'a Bson)) -> &'a Bson>
3434
}
3535

36-
impl<'a> Clone for Keys<'a> {
37-
fn clone(&self) -> Keys<'a> { Keys { inner: self.inner.clone() } }
38-
}
39-
4036
impl<'a> Iterator for Keys<'a> {
4137
type Item = &'a String;
4238
fn next(&mut self) -> Option<(&'a String)> { self.inner.next() }
4339
}
4440

45-
impl<'a> Clone for Values<'a> {
46-
fn clone(&self) -> Values<'a> { Values { inner: self.inner.clone() } }
47-
}
48-
4941
impl<'a> Iterator for Values<'a> {
5042
type Item = &'a Bson;
5143

@@ -57,7 +49,10 @@ impl IntoIterator for OrderedDocument {
5749
type IntoIter = OrderedDocumentIntoIterator;
5850

5951
fn into_iter(self) -> Self::IntoIter {
60-
OrderedDocumentIntoIterator { ordered_document: self, index: 0 }
52+
OrderedDocumentIntoIterator {
53+
document: self.document,
54+
vec_iter: self.keys.into_iter()
55+
}
6156
}
6257
}
6358

@@ -66,7 +61,11 @@ impl<'a> IntoIterator for &'a OrderedDocument {
6661
type IntoIter = OrderedDocumentIterator<'a>;
6762

6863
fn into_iter(self) -> Self::IntoIter {
69-
OrderedDocumentIterator { ordered_document: self, index: 0 }
64+
let ref keys = self.keys;
65+
OrderedDocumentIterator {
66+
vec_iter: keys.into_iter(),
67+
document: &self.document,
68+
}
7069
}
7170
}
7271

@@ -83,28 +82,23 @@ impl FromIterator<(String, Bson)> for OrderedDocument {
8382
impl<'a> Iterator for OrderedDocumentIntoIterator {
8483
type Item = (String, Bson);
8584
fn next(&mut self) -> Option<(String, Bson)> {
86-
if self.ordered_document.keys.len() <= self.index {
87-
return None;
85+
match self.vec_iter.next() {
86+
Some(key) => {
87+
let val = self.document.get(&key[..]).unwrap();
88+
Some((key, val.to_owned()))
89+
},
90+
None => None,
8891
}
89-
90-
let ref key = self.ordered_document.keys[self.index];
91-
let val = self.ordered_document.get(&key[..]).unwrap();
92-
self.index += 1;
93-
Some((key.to_owned(), val.to_owned()))
9492
}
9593
}
9694

9795
impl<'a> Iterator for OrderedDocumentIterator<'a> {
9896
type Item = (&'a String, &'a Bson);
9997
fn next(&mut self) -> Option<(&'a String, &'a Bson)> {
100-
if self.ordered_document.keys.len() <= self.index {
101-
return None;
98+
match self.vec_iter.next() {
99+
Some(key) => Some((&key, self.document.get(&key[..]).unwrap())),
100+
None => None,
102101
}
103-
104-
let ref key = self.ordered_document.keys[self.index];
105-
let val = self.ordered_document.get(&key[..]).unwrap();
106-
self.index += 1;
107-
Some((key, val))
108102
}
109103
}
110104

0 commit comments

Comments
 (0)