1use std::{ ptr, mem, str, slice, fmt };
2use std::ops::{ Index, IndexMut, Deref };
3use std::iter::FromIterator;
4
5use crate::codegen::{ DumpGenerator, Generator, PrettyGenerator };
6use crate::value::JsonValue;
7
8const KEY_BUF_LEN: usize = 32;
9static NULL: JsonValue = JsonValue::Null;
10
11#[inline]
43fn hash_key(key: &[u8]) -> u64 {
44 let mut hash: u64 = 0xcbf29ce484222325;
45 for byte in key {
46 hash ^= *byte as u64;
47 hash = hash.wrapping_mul(0x100000001b3);
48 }
49 hash
50}
51
52struct Key {
53 pub buf: [u8; KEY_BUF_LEN],
56
57 pub len: usize,
59
60 pub ptr: *mut u8,
64
65 pub hash: u64,
67}
68
69impl Key {
70 #[inline]
71 fn new(hash: u64, len: usize) -> Self {
72 Key {
73 buf: [0; KEY_BUF_LEN],
74 len: len,
75 ptr: ptr::null_mut(),
76 hash: hash
77 }
78 }
79
80 #[inline]
81 fn as_bytes(&self) -> &[u8] {
82 unsafe {
83 slice::from_raw_parts(self.ptr, self.len)
84 }
85 }
86
87 #[inline]
88 fn as_str(&self) -> &str {
89 unsafe {
90 str::from_utf8_unchecked(self.as_bytes())
91 }
92 }
93
94 #[inline]
99 fn attach(&mut self, key: &[u8]) {
100 if self.len <= KEY_BUF_LEN {
101 unsafe {
102 ptr::copy_nonoverlapping(
103 key.as_ptr(),
104 self.buf.as_mut_ptr(),
105 self.len
106 );
107 }
108 self.ptr = self.buf.as_mut_ptr();
109 } else {
110 let mut heap = key.to_vec();
111 self.ptr = heap.as_mut_ptr();
112 mem::forget(heap);
113 }
114 }
115
116 #[inline]
120 fn fix_ptr(&mut self) {
121 if self.len <= KEY_BUF_LEN {
122 self.ptr = self.buf.as_mut_ptr();
123 }
124 }
125}
126
127unsafe impl Sync for Key {}
130unsafe impl Send for Key {}
131
132impl Drop for Key {
135 fn drop(&mut self) {
136 unsafe {
137 if self.len > KEY_BUF_LEN {
138 let heap = Vec::from_raw_parts(
141 self.ptr,
142 self.len,
143 self.len
144 );
145
146 drop(heap);
148 }
149 }
150 }
151}
152
153impl Clone for Key {
156 fn clone(&self) -> Self {
157 if self.len > KEY_BUF_LEN {
158 let mut heap = self.as_bytes().to_vec();
159 let ptr = heap.as_mut_ptr();
160 mem::forget(heap);
161
162 Key {
163 buf: [0; KEY_BUF_LEN],
164 len: self.len,
165 ptr: ptr,
166 hash: self.hash,
167 }
168 } else {
169 Key {
170 buf: self.buf,
171 len: self.len,
172 ptr: ptr::null_mut(), hash: self.hash,
174 }
175 }
176 }
177}
178
179#[derive(Clone)]
180struct Node {
181 pub key: Key,
183
184 pub value: JsonValue,
186
187 pub left: usize,
191
192 pub right: usize,
196}
197
198impl fmt::Debug for Node {
199 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
200 fmt::Debug::fmt(&(self.key.as_str(), &self.value, self.left, self.right), f)
201 }
202}
203
204impl PartialEq for Node {
205 fn eq(&self, other: &Node) -> bool {
206 self.key.hash == other.key.hash &&
207 self.key.as_bytes() == other.key.as_bytes() &&
208 self.value == other.value
209 }
210}
211
212impl Node {
213 #[inline]
214 fn new(value: JsonValue, hash: u64, len: usize) -> Node {
215 Node {
216 key: Key::new(hash, len),
217 value: value,
218 left: 0,
219 right: 0,
220 }
221 }
222}
223
224#[derive(Debug)]
228pub struct Object {
229 store: Vec<Node>
230}
231
232impl Object {
233 #[inline(always)]
236 pub fn new() -> Self {
237 Object {
238 store: Vec::new()
239 }
240 }
241
242 #[inline(always)]
245 pub fn with_capacity(capacity: usize) -> Self {
246 Object {
247 store: Vec::with_capacity(capacity)
248 }
249 }
250
251 #[inline]
252 fn node_at_index_mut(&mut self, index: usize) -> *mut Node {
253 unsafe { self.store.as_mut_ptr().offset(index as isize) }
254 }
255
256 #[inline(always)]
257 fn add_node(&mut self, key: &[u8], value: JsonValue, hash: u64) -> usize {
258 let index = self.store.len();
259
260 if index < self.store.capacity() {
261 unsafe {
266 let node = Node::new(value, hash, key.len());
267 self.store.set_len(index + 1);
268
269 ptr::copy_nonoverlapping(
272 &node as *const Node,
273 self.store.as_mut_ptr().offset(index as isize),
274 1,
275 );
276
277 mem::forget(node);
280 }
281
282 unsafe { self.store.get_unchecked_mut(index).key.attach(key) };
283 } else {
284 self.store.push(Node::new(value, hash, key.len()));
285
286 unsafe { self.store.get_unchecked_mut(index).key.attach(key) };
287
288 for node in self.store.iter_mut().take(index) {
291 node.key.fix_ptr();
292 }
293 }
294
295 index
296 }
297
298 #[inline]
303 pub fn insert(&mut self, key: &str, value: JsonValue) {
304 self.insert_index(key, value);
305 }
306
307 pub(crate) fn insert_index(&mut self, key: &str, value: JsonValue) -> usize {
308 let key = key.as_bytes();
309 let hash = hash_key(key);
310
311 if self.store.len() == 0 {
312 self.store.push(Node::new(value, hash, key.len()));
313 self.store[0].key.attach(key);
314 return 0;
315 }
316
317 let mut node = unsafe { &mut *self.node_at_index_mut(0) };
318 let mut parent = 0;
319
320 loop {
321 if hash == node.key.hash && key == node.key.as_bytes() {
322 node.value = value;
323 return parent;
324 } else if hash < node.key.hash {
325 if node.left != 0 {
326 parent = node.left;
327 node = unsafe { &mut *self.node_at_index_mut(node.left) };
328 continue;
329 }
330 let index = self.add_node(key, value, hash);
331 self.store[parent].left = index;
332
333 return index;
334 } else {
335 if node.right != 0 {
336 parent = node.right;
337 node = unsafe { &mut *self.node_at_index_mut(node.right) };
338 continue;
339 }
340 let index = self.add_node(key, value, hash);
341 self.store[parent].right = index;
342
343 return index;
344 }
345 }
346 }
347
348 #[inline]
349 pub(crate) fn override_at(&mut self, index: usize, value: JsonValue) {
350 self.store[index].value = value;
351 }
352
353 #[inline]
354 #[deprecated(since="0.11.11", note="Was only meant for internal use")]
355 pub fn override_last(&mut self, value: JsonValue) {
356 if let Some(node) = self.store.last_mut() {
357 node.value = value;
358 }
359 }
360
361 pub fn get(&self, key: &str) -> Option<&JsonValue> {
362 if self.store.len() == 0 {
363 return None;
364 }
365
366 let key = key.as_bytes();
367 let hash = hash_key(key);
368
369 let mut node = unsafe { self.store.get_unchecked(0) };
370
371 loop {
372 if hash == node.key.hash && key == node.key.as_bytes() {
373 return Some(&node.value);
374 } else if hash < node.key.hash {
375 if node.left == 0 {
376 return None;
377 }
378 node = unsafe { self.store.get_unchecked(node.left) };
379 } else {
380 if node.right == 0 {
381 return None;
382 }
383 node = unsafe { self.store.get_unchecked(node.right) };
384 }
385 }
386 }
387
388 pub fn get_mut(&mut self, key: &str) -> Option<&mut JsonValue> {
389 if self.store.len() == 0 {
390 return None;
391 }
392
393 let key = key.as_bytes();
394 let hash = hash_key(key);
395
396 let mut index = 0;
397 {
398 let mut node = unsafe { self.store.get_unchecked(0) };
399
400 loop {
401 if hash == node.key.hash && key == node.key.as_bytes() {
402 break;
403 } else if hash < node.key.hash {
404 if node.left == 0 {
405 return None;
406 }
407 index = node.left;
408 node = unsafe { self.store.get_unchecked(node.left) };
409 } else {
410 if node.right == 0 {
411 return None;
412 }
413 index = node.right;
414 node = unsafe { self.store.get_unchecked(node.right) };
415 }
416 }
417 }
418
419 let node = unsafe { self.store.get_unchecked_mut(index) };
420
421 Some(&mut node.value)
422 }
423
424 pub fn remove(&mut self, key: &str) -> Option<JsonValue> {
427 if self.store.len() == 0 {
428 return None;
429 }
430
431 let key = key.as_bytes();
432 let hash = hash_key(key);
433 let mut index = 0;
434
435 {
436 let mut node = unsafe { self.store.get_unchecked(0) };
437
438 loop {
440 if hash == node.key.hash && key == node.key.as_bytes() {
441 break;
442 } else if hash < node.key.hash {
443 if node.left == 0 {
444 return None;
445 }
446 index = node.left;
447 node = unsafe { self.store.get_unchecked(node.left) };
448 } else {
449 if node.right == 0 {
450 return None;
451 }
452 index = node.right;
453 node = unsafe { self.store.get_unchecked(node.right) };
454 }
455 }
456 }
457
458 let mut new_object = Object::with_capacity(self.store.len() - 1);
463 let mut removed = None;
464
465 for (i, node) in self.store.iter_mut().enumerate() {
466 if i == index {
467 removed = Some(mem::replace(&mut node.value, JsonValue::Null));
470 } else {
471 let value = mem::replace(&mut node.value, JsonValue::Null);
472
473 new_object.insert(node.key.as_str(), value);
474 }
475 }
476
477 mem::swap(self, &mut new_object);
478
479 removed
480 }
481
482 #[inline(always)]
483 pub fn len(&self) -> usize {
484 self.store.len()
485 }
486
487 #[inline(always)]
488 pub fn is_empty(&self) -> bool {
489 self.store.is_empty()
490 }
491
492 pub fn clear(&mut self) {
494 self.store.clear();
495 }
496
497 #[inline(always)]
498 pub fn iter(&self) -> Iter {
499 Iter {
500 inner: self.store.iter()
501 }
502 }
503
504 #[inline(always)]
505 pub fn iter_mut(&mut self) -> IterMut {
506 IterMut {
507 inner: self.store.iter_mut()
508 }
509 }
510
511 pub fn dump(&self) -> String {
513 let mut gen = DumpGenerator::new();
514 gen.write_object(self).expect("Can't fail");
515 gen.consume()
516 }
517
518 pub fn pretty(&self, spaces: u16) -> String {
521 let mut gen = PrettyGenerator::new(spaces);
522 gen.write_object(self).expect("Can't fail");
523 gen.consume()
524 }
525}
526
527impl Clone for Object {
530 fn clone(&self) -> Self {
531 let mut store = self.store.clone();
532
533 for node in store.iter_mut() {
534 node.key.fix_ptr();
535 }
536
537 Object {
538 store: store
539 }
540 }
541}
542
543impl<K: AsRef<str>, V: Into<JsonValue>> FromIterator<(K, V)> for Object {
544 fn from_iter<I: IntoIterator<Item=(K, V)>>(iter: I) -> Self {
545 let iter = iter.into_iter();
546 let mut object = Object::with_capacity(iter.size_hint().0);
547
548 for (key, value) in iter {
549 object.insert(key.as_ref(), value.into());
550 }
551
552 object
553 }
554}
555
556impl PartialEq for Object {
560 fn eq(&self, other: &Object) -> bool {
561 if self.len() != other.len() {
562 return false;
563 }
564
565 for (key, value) in self.iter() {
566 match other.get(key) {
567 Some(ref other_val) => if *other_val != value { return false; },
568 None => return false
569 }
570 }
571
572 true
573 }
574}
575
576pub struct Iter<'a> {
577 inner: slice::Iter<'a, Node>
578}
579
580impl<'a> Iter<'a> {
581 pub fn empty() -> Self {
583 Iter {
584 inner: [].iter()
585 }
586 }
587}
588
589impl<'a> Iterator for Iter<'a> {
590 type Item = (&'a str, &'a JsonValue);
591
592 #[inline(always)]
593 fn next(&mut self) -> Option<Self::Item> {
594 self.inner.next().map(|node| (node.key.as_str(), &node.value))
595 }
596}
597
598impl<'a> DoubleEndedIterator for Iter<'a> {
599 #[inline(always)]
600 fn next_back(&mut self) -> Option<Self::Item> {
601 self.inner.next_back().map(|node| (node.key.as_str(), &node.value))
602 }
603}
604
605impl<'a> ExactSizeIterator for Iter<'a> {
606 fn len(&self) -> usize {
607 self.inner.len()
608 }
609}
610
611pub struct IterMut<'a> {
612 inner: slice::IterMut<'a, Node>
613}
614
615impl<'a> IterMut<'a> {
616 pub fn empty() -> Self {
618 IterMut {
619 inner: [].iter_mut()
620 }
621 }
622}
623
624impl<'a> Iterator for IterMut<'a> {
625 type Item = (&'a str, &'a mut JsonValue);
626
627 #[inline(always)]
628 fn next(&mut self) -> Option<Self::Item> {
629 self.inner.next().map(|node| (node.key.as_str(), &mut node.value))
630 }
631}
632
633impl<'a> DoubleEndedIterator for IterMut<'a> {
634 #[inline(always)]
635 fn next_back(&mut self) -> Option<Self::Item> {
636 self.inner.next_back().map(|node| (node.key.as_str(), &mut node.value))
637 }
638}
639
640impl<'a> ExactSizeIterator for IterMut<'a> {
641 fn len(&self) -> usize {
642 self.inner.len()
643 }
644}
645
646impl<'a> Index<&'a str> for Object {
667 type Output = JsonValue;
668
669 fn index(&self, index: &str) -> &JsonValue {
670 match self.get(index) {
671 Some(value) => value,
672 _ => &NULL
673 }
674 }
675}
676
677impl Index<String> for Object {
678 type Output = JsonValue;
679
680 fn index(&self, index: String) -> &JsonValue {
681 self.index(index.deref())
682 }
683}
684
685impl<'a> Index<&'a String> for Object {
686 type Output = JsonValue;
687
688 fn index(&self, index: &String) -> &JsonValue {
689 self.index(index.deref())
690 }
691}
692
693impl<'a> IndexMut<&'a str> for Object {
713 fn index_mut(&mut self, index: &str) -> &mut JsonValue {
714 if self.get(index).is_none() {
715 self.insert(index, JsonValue::Null);
716 }
717 self.get_mut(index).unwrap()
718 }
719}
720
721impl IndexMut<String> for Object {
722 fn index_mut(&mut self, index: String) -> &mut JsonValue {
723 self.index_mut(index.deref())
724 }
725}
726
727impl<'a> IndexMut<&'a String> for Object {
728 fn index_mut(&mut self, index: &String) -> &mut JsonValue {
729 self.index_mut(index.deref())
730 }
731}