|
1 |
| -use std::{ ptr, mem, str, slice, fmt }; |
| 1 | +use std::{ ptr, mem, str, slice, vec, fmt }; |
2 | 2 | use std::ops::{ Index, IndexMut, Deref };
|
3 | 3 | use std::iter::FromIterator;
|
4 | 4 |
|
@@ -176,6 +176,24 @@ impl Clone for Key {
|
176 | 176 | }
|
177 | 177 | }
|
178 | 178 |
|
| 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 | + |
179 | 197 | #[derive(Clone)]
|
180 | 198 | struct Node {
|
181 | 199 | // String-esque key abstraction
|
@@ -643,6 +661,45 @@ impl<'a> ExactSizeIterator for IterMut<'a> {
|
643 | 661 | }
|
644 | 662 | }
|
645 | 663 |
|
| 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 | + |
646 | 703 | /// Implements indexing by `&str` to easily access object members:
|
647 | 704 | ///
|
648 | 705 | /// ## Example
|
|
0 commit comments