Skip to content

Commit 3ba358e

Browse files
timothee-haudebourggierens
authored andcommitted
Implement IntoIterator for Object.
1 parent 199f0a1 commit 3ba358e

File tree

1 file changed

+58
-1
lines changed

1 file changed

+58
-1
lines changed

src/object.rs

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{ ptr, mem, str, slice, fmt };
1+
use std::{ ptr, mem, str, slice, vec, fmt };
22
use std::ops::{ Index, IndexMut, Deref };
33
use std::iter::FromIterator;
44

@@ -176,6 +176,24 @@ impl Clone for Key {
176176
}
177177
}
178178

179+
impl From<Key> for String {
180+
fn from(key: Key) -> String {
181+
unsafe {
182+
if key.len > KEY_BUF_LEN {
183+
// Construct a `String` out of the `key_ptr`. Since the key is
184+
// always allocated from a slice, the capacity is equal to length.
185+
String::from_raw_parts(
186+
key.ptr,
187+
key.len,
188+
key.len
189+
)
190+
} else {
191+
String::from_utf8_unchecked(key.buf[0..key.len].to_vec())
192+
}
193+
}
194+
}
195+
}
196+
179197
#[derive(Clone)]
180198
struct Node {
181199
// String-esque key abstraction
@@ -643,6 +661,45 @@ impl<'a> ExactSizeIterator for IterMut<'a> {
643661
}
644662
}
645663

664+
pub struct IntoIter {
665+
inner: vec::IntoIter<Node>
666+
}
667+
668+
impl Iterator for IntoIter {
669+
type Item = (String, JsonValue);
670+
671+
#[inline(always)]
672+
fn next(&mut self) -> Option<Self::Item> {
673+
self.inner.next().map(|node| (node.key.into(), node.value))
674+
}
675+
}
676+
677+
impl DoubleEndedIterator for IntoIter {
678+
#[inline(always)]
679+
fn next_back(&mut self) -> Option<Self::Item> {
680+
self.inner.next_back().map(|node| (node.key.into(), node.value))
681+
}
682+
}
683+
684+
impl ExactSizeIterator for IntoIter {
685+
#[inline(always)]
686+
fn len(&self) -> usize {
687+
self.inner.len()
688+
}
689+
}
690+
691+
impl IntoIterator for Object {
692+
type Item = (String, JsonValue);
693+
type IntoIter = IntoIter;
694+
695+
#[inline(always)]
696+
fn into_iter(self) -> IntoIter {
697+
IntoIter {
698+
inner: self.store.into_iter()
699+
}
700+
}
701+
}
702+
646703
/// Implements indexing by `&str` to easily access object members:
647704
///
648705
/// ## Example

0 commit comments

Comments
 (0)