rune/modules/collections/vec_deque.rs
1use core::cmp::Ordering;
2use core::iter;
3
4use crate as rune;
5use crate::alloc;
6use crate::alloc::fmt::TryWrite;
7use crate::alloc::prelude::*;
8use crate::runtime::{
9 EnvProtocolCaller, Formatter, Iterator, Protocol, ProtocolCaller, RawAnyGuard, Ref, Value, Vec,
10 VmErrorKind, VmResult,
11};
12use crate::{Any, ContextError, Module};
13
14/// A dynamic vec deque.
15#[rune::module(::std::collections::vec_deque)]
16pub fn module() -> Result<Module, ContextError> {
17 let mut m = Module::from_meta(self::module_meta)?;
18
19 m.ty::<VecDeque>()?;
20
21 m.function_meta(VecDeque::new)?;
22 m.function_meta(VecDeque::with_capacity__meta)?;
23 m.function_meta(from)?;
24
25 m.function_meta(VecDeque::extend)?;
26 m.function_meta(VecDeque::insert)?;
27 m.function_meta(VecDeque::iter__meta)?;
28 m.function_meta(VecDeque::into_iter__meta)?;
29 m.function_meta(VecDeque::from_iter__meta)?;
30 m.function_meta(VecDeque::reserve)?;
31 m.function_meta(VecDeque::len)?;
32 m.function_meta(VecDeque::capacity)?;
33 m.function_meta(VecDeque::front)?;
34 m.function_meta(VecDeque::back)?;
35 m.function_meta(VecDeque::push_back__meta)?;
36 m.function_meta(VecDeque::push_front)?;
37 m.function_meta(VecDeque::pop_front)?;
38 m.function_meta(VecDeque::pop_back)?;
39 m.function_meta(VecDeque::remove)?;
40 m.function_meta(VecDeque::rotate_left)?;
41 m.function_meta(VecDeque::rotate_right)?;
42
43 m.associated_function(&Protocol::INDEX_GET, VecDeque::get)?;
44 m.associated_function(&Protocol::INDEX_SET, VecDeque::set)?;
45
46 m.function_meta(VecDeque::debug_fmt)?;
47
48 m.function_meta(VecDeque::partial_eq__meta)?;
49 m.implement_trait::<VecDeque>(rune::item!(::std::cmp::PartialEq))?;
50
51 m.function_meta(VecDeque::eq__meta)?;
52 m.implement_trait::<VecDeque>(rune::item!(::std::cmp::Eq))?;
53
54 m.function_meta(VecDeque::partial_cmp__meta)?;
55 m.implement_trait::<VecDeque>(rune::item!(::std::cmp::PartialOrd))?;
56
57 m.function_meta(VecDeque::cmp__meta)?;
58 m.implement_trait::<VecDeque>(rune::item!(::std::cmp::Ord))?;
59
60 m.ty::<Iter>()?;
61 m.function_meta(Iter::next__meta)?;
62 m.function_meta(Iter::size_hint__meta)?;
63 m.implement_trait::<Iter>(rune::item!(::std::iter::Iterator))?;
64
65 m.function_meta(Iter::next_back__meta)?;
66 m.implement_trait::<Iter>(rune::item!(::std::iter::DoubleEndedIterator))?;
67
68 m.function_meta(Iter::len__meta)?;
69 m.implement_trait::<Iter>(rune::item!(::std::iter::ExactSizeIterator))?;
70
71 Ok(m)
72}
73
74/// A double-ended queue implemented with a growable ring buffer.
75///
76/// The "default" usage of this type as a queue is to use [`push_back`] to add
77/// to the queue, and [`pop_front`] to remove from the queue. [`extend`] and
78/// [`append`] push onto the back in this manner, and iterating over `VecDeque`
79/// goes front to back.
80///
81/// A `VecDeque` with a known list of items can be initialized from an array:
82///
83/// ```rune
84/// use std::collections::VecDeque;
85///
86/// let deq = VecDeque::from::<Vec>([-1, 0, 1]);
87/// ```
88///
89/// [`push_back`]: VecDeque::push_back
90/// [`pop_front`]: VecDeque::pop_front
91/// [`extend`]: VecDeque::extend
92/// [`append`]: VecDeque::append
93#[derive(Any, Default)]
94#[rune(module = crate, item = ::std::collections::vec_deque)]
95pub(crate) struct VecDeque {
96 inner: alloc::VecDeque<Value>,
97}
98
99impl VecDeque {
100 /// Creates an empty deque.
101 ///
102 /// # Examples
103 ///
104 /// ```rune
105 /// use std::collections::VecDeque;
106 ///
107 /// let deque = VecDeque::new();
108 /// ```
109 #[rune::function(path = Self::new)]
110 fn new() -> VecDeque {
111 Self {
112 inner: alloc::VecDeque::new(),
113 }
114 }
115
116 /// Creates an empty deque with space for at least `capacity` elements.
117 ///
118 /// # Examples
119 ///
120 /// ```rune
121 /// use std::collections::VecDeque;
122 ///
123 /// let deque = VecDeque::with_capacity(10);
124 /// assert!(deque.capacity() >= 10);
125 /// ```
126 #[rune::function(keep, path = Self::with_capacity)]
127 pub(crate) fn with_capacity(count: usize) -> VmResult<VecDeque> {
128 VmResult::Ok(Self {
129 inner: vm_try!(alloc::VecDeque::try_with_capacity(count)),
130 })
131 }
132
133 /// Extend this VecDeque with something that implements the [`INTO_ITER`]
134 /// protocol.
135 ///
136 /// # Examples
137 ///
138 /// ```rune
139 /// use std::collections::VecDeque;
140 ///
141 /// let deque = VecDeque::new();
142 /// deque.extend([1, 2, 3]);
143 ///
144 /// assert_eq!(Some(1), deque.pop_front());
145 /// assert_eq!(Some(3), deque.pop_back());
146 /// ```
147 #[rune::function]
148 pub fn extend(&mut self, value: Value) -> VmResult<()> {
149 let mut it = vm_try!(value.into_iter());
150
151 while let Some(value) = vm_try!(it.next()) {
152 vm_try!(self.inner.try_push_back(value));
153 }
154
155 VmResult::Ok(())
156 }
157
158 /// Provides a reference to the front element, or `None` if the deque is
159 /// empty.
160 ///
161 /// # Examples
162 ///
163 /// ```rune
164 /// use std::collections::VecDeque;
165 ///
166 /// let d = VecDeque::new();
167 /// assert_eq!(d.front(), None);
168 ///
169 /// d.push_back(1);
170 /// d.push_back(2);
171 /// assert_eq!(d.front(), Some(1));
172 /// ```
173 #[rune::function]
174 fn front(&mut self) -> Option<Value> {
175 self.inner.front().cloned()
176 }
177
178 /// Provides a reference to the back element, or `None` if the deque is
179 /// empty.
180 ///
181 /// # Examples
182 ///
183 /// ```rune
184 /// use std::collections::VecDeque;
185 ///
186 /// let d = VecDeque::new();
187 /// assert_eq!(d.back(), None);
188 ///
189 /// d.push_back(1);
190 /// d.push_back(2);
191 /// assert_eq!(d.back(), Some(2));
192 /// ```
193 #[rune::function]
194 pub fn back(&self) -> Option<Value> {
195 self.inner.back().cloned()
196 }
197
198 /// Appends an element to the back of the deque.
199 ///
200 /// # Examples
201 ///
202 /// ```rune
203 /// use std::collections::VecDeque;
204 ///
205 /// let buf = VecDeque::new();
206 /// buf.push_back(1);
207 /// buf.push_back(3);
208 /// assert_eq!(Some(3), buf.back());
209 /// ```
210 #[rune::function(keep)]
211 pub(crate) fn push_back(&mut self, value: Value) -> VmResult<()> {
212 vm_try!(self.inner.try_push_back(value));
213 VmResult::Ok(())
214 }
215
216 /// Prepends an element to the deque.
217 ///
218 /// # Examples
219 ///
220 /// ```rune
221 /// use std::collections::VecDeque;
222 ///
223 /// let d = VecDeque::new();
224 /// d.push_front(1);
225 /// d.push_front(2);
226 /// assert_eq!(d.front(), Some(2));
227 /// ```
228 #[rune::function]
229 fn push_front(&mut self, value: Value) -> VmResult<()> {
230 vm_try!(self.inner.try_push_front(value));
231 VmResult::Ok(())
232 }
233
234 /// Removes the first element and returns it, or `None` if the deque is
235 /// empty.
236 ///
237 /// # Examples
238 ///
239 /// ```rune
240 /// use std::collections::VecDeque;
241 ///
242 /// let d = VecDeque::new();
243 /// d.push_back(1);
244 /// d.push_back(2);
245 ///
246 /// assert_eq!(d.pop_front(), Some(1));
247 /// assert_eq!(d.pop_front(), Some(2));
248 /// assert_eq!(d.pop_front(), None);
249 /// ```
250 #[rune::function]
251 fn pop_front(&mut self) -> Option<Value> {
252 self.inner.pop_front()
253 }
254
255 /// Removes the last element from the deque and returns it, or `None` if it
256 /// is empty.
257 ///
258 /// # Examples
259 ///
260 /// ```rune
261 /// use std::collections::VecDeque;
262 ///
263 /// let buf = VecDeque::new();
264 /// assert_eq!(buf.pop_back(), None);
265 /// buf.push_back(1);
266 /// buf.push_back(3);
267 /// assert_eq!(buf.pop_back(), Some(3));
268 /// ```
269 #[rune::function]
270 fn pop_back(&mut self) -> Option<Value> {
271 self.inner.pop_back()
272 }
273
274 /// Reserves capacity for at least `additional` more elements to be inserted
275 /// in the given deque. The collection may reserve more space to
276 /// speculatively avoid frequent reallocations.
277 ///
278 /// # Panics
279 ///
280 /// Panics if the new capacity overflows `usize`.
281 ///
282 /// # Examples
283 ///
284 /// ```rune
285 /// use std::collections::VecDeque;
286 ///
287 /// let buf = VecDeque::from::<Vec>([1]);
288 /// buf.reserve(10);
289 /// assert!(buf.capacity() >= 11);
290 /// ```
291 #[rune::function]
292 fn reserve(&mut self, index: usize) -> VmResult<()> {
293 vm_try!(self.inner.try_reserve(index));
294 VmResult::Ok(())
295 }
296
297 /// Returns the number of elements in the deque.
298 ///
299 /// # Examples
300 ///
301 /// ```rune
302 /// use std::collections::VecDeque;
303 ///
304 /// let deque = VecDeque::new();
305 /// assert_eq!(deque.len(), 0);
306 /// deque.push_back(1);
307 /// assert_eq!(deque.len(), 1);
308 /// ```
309 #[rune::function]
310 fn len(&self) -> usize {
311 self.inner.len()
312 }
313
314 /// Returns the number of elements the deque can hold without reallocating.
315 ///
316 /// # Examples
317 ///
318 /// ```rune
319 /// use std::collections::VecDeque;
320 ///
321 /// let buf = VecDeque::with_capacity(10);
322 /// assert!(buf.capacity() >= 10);
323 /// ```
324 #[rune::function]
325 fn capacity(&mut self) -> usize {
326 self.inner.capacity()
327 }
328
329 /// Inserts an element at `index` within the deque, shifting all elements
330 /// with indices greater than or equal to `index` towards the back.
331 ///
332 /// Element at index 0 is the front of the queue.
333 ///
334 /// # Panics
335 ///
336 /// Panics if `index` is greater than deque's length
337 ///
338 /// # Examples
339 ///
340 /// ```rune
341 /// use std::collections::VecDeque;
342 ///
343 /// let buf = VecDeque::new();
344 /// buf.push_back('a');
345 /// buf.push_back('b');
346 /// buf.push_back('c');
347 /// assert_eq!(buf, ['a', 'b', 'c']);
348 ///
349 /// buf.insert(1, 'd');
350 /// assert_eq!(buf, ['a', 'd', 'b', 'c']);
351 /// ```
352 #[rune::function]
353 fn insert(&mut self, index: usize, value: Value) -> VmResult<()> {
354 if index > self.inner.len() {
355 return VmResult::err(VmErrorKind::OutOfRange {
356 index: index.into(),
357 length: self.inner.len().into(),
358 });
359 }
360
361 vm_try!(self.inner.try_insert(index, value));
362 VmResult::Ok(())
363 }
364
365 /// Removes and returns the element at `index` from the deque.
366 /// Whichever end is closer to the removal point will be moved to make
367 /// room, and all the affected elements will be moved to new positions.
368 /// Returns `None` if `index` is out of bounds.
369 ///
370 /// Element at index 0 is the front of the queue.
371 ///
372 /// # Examples
373 ///
374 /// ```rune
375 /// use std::collections::VecDeque;
376 ///
377 /// let buf = VecDeque::new();
378 /// buf.push_back(1);
379 /// buf.push_back(2);
380 /// buf.push_back(3);
381 /// assert_eq!(buf, [1, 2, 3]);
382 ///
383 /// assert_eq!(buf.remove(1), Some(2));
384 /// assert_eq!(buf, [1, 3]);
385 /// ```
386 #[rune::function]
387 fn remove(&mut self, index: usize) -> Option<Value> {
388 self.inner.remove(index)
389 }
390
391 /// Rotates the double-ended queue `mid` places to the left.
392 ///
393 /// Equivalently,
394 /// - Rotates item `mid` into the first position.
395 /// - Pops the first `mid` items and pushes them to the end.
396 /// - Rotates `len() - mid` places to the right.
397 ///
398 /// # Panics
399 ///
400 /// If `mid` is greater than `len()`. Note that `mid == len()` does _not_
401 /// panic and is a no-op rotation.
402 ///
403 /// # Complexity
404 ///
405 /// Takes `*O*(min(mid, len() - mid))` time and no extra space.
406 ///
407 /// # Examples
408 ///
409 /// ```rune
410 /// use std::collections::VecDeque;
411 ///
412 /// let buf = (0..10).iter().collect::<VecDeque>();
413 ///
414 /// buf.rotate_left(3);
415 /// assert_eq!(buf, [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]);
416 ///
417 /// for i in 1..10 {
418 /// assert_eq!(i * 3 % 10, buf[0]);
419 /// buf.rotate_left(3);
420 /// }
421 ///
422 /// assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
423 /// ```
424 #[rune::function]
425 fn rotate_left(&mut self, mid: usize) -> VmResult<()> {
426 if mid > self.inner.len() {
427 return VmResult::err(VmErrorKind::OutOfRange {
428 index: mid.into(),
429 length: self.inner.len().into(),
430 });
431 }
432
433 self.inner.rotate_left(mid);
434 VmResult::Ok(())
435 }
436
437 /// Rotates the double-ended queue `k` places to the right.
438 ///
439 /// Equivalently,
440 /// - Rotates the first item into position `k`.
441 /// - Pops the last `k` items and pushes them to the front.
442 /// - Rotates `len() - k` places to the left.
443 ///
444 /// # Panics
445 ///
446 /// If `k` is greater than `len()`. Note that `k == len()` does _not_ panic
447 /// and is a no-op rotation.
448 ///
449 /// # Complexity
450 ///
451 /// Takes `*O*(min(k, len() - k))` time and no extra space.
452 ///
453 /// # Examples
454 ///
455 /// ```rune
456 /// use std::collections::VecDeque;
457 ///
458 /// let buf = (0..10).iter().collect::<VecDeque>();
459 ///
460 /// buf.rotate_right(3);
461 /// assert_eq!(buf, [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]);
462 ///
463 /// for i in 1..10 {
464 /// assert_eq!(0, buf[i * 3 % 10]);
465 /// buf.rotate_right(3);
466 /// }
467 ///
468 /// assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
469 /// ```
470 #[rune::function]
471 fn rotate_right(&mut self, mid: usize) -> VmResult<()> {
472 if mid > self.inner.len() {
473 return VmResult::err(VmErrorKind::OutOfRange {
474 index: mid.into(),
475 length: self.inner.len().into(),
476 });
477 }
478
479 self.inner.rotate_right(mid);
480 VmResult::Ok(())
481 }
482
483 /// Returns a front-to-back iterator.
484 ///
485 /// # Examples
486 ///
487 /// ```rune
488 /// use std::collections::VecDeque;
489 ///
490 /// let buf = VecDeque::new();
491 /// buf.push_back(5);
492 /// buf.push_back(3);
493 /// buf.push_back(4);
494 ///
495 /// assert_eq!([5, 3, 4], buf.iter());
496 /// assert_eq!([4, 3, 5], buf.iter().rev());
497 /// ```
498 #[inline]
499 #[rune::function(keep, instance, path = Self::iter)]
500 fn iter(this: Ref<Self>) -> Iter {
501 // SAFETY: We're holding onto the reference guard.
502 let iter = unsafe { this.inner.raw_iter() };
503 let (_, guard) = Ref::into_raw(this);
504 Iter { iter, guard }
505 }
506
507 #[rune::function(keep, instance, protocol = INTO_ITER, path = Self)]
508 fn into_iter(this: Ref<Self>) -> Iter {
509 Self::iter(this)
510 }
511
512 /// Build a [`VecDeque`] from an iterator.
513 ///
514 /// The vecdeque can be converted from anything that implements the
515 /// [`INTO_ITER`] protocol.
516 ///
517 /// # Examples
518 ///
519 /// ```rune
520 /// use std::collections::VecDeque;
521 ///
522 /// let deque = VecDeque::from_iter(["a", "b", "c"]);
523 /// assert_eq!(deque.len(), 3);
524 /// assert_eq!(deque.pop_front(), Some("a"));
525 /// assert_eq!(deque.pop_back(), Some("c"));
526 /// assert_eq!(deque.len(), 1);
527 /// ```
528 #[rune::function(keep, path = Self::from_iter)]
529 fn from_iter(mut it: Iterator) -> VmResult<Self> {
530 let (lo, _) = vm_try!(it.size_hint());
531 let mut inner = vm_try!(alloc::VecDeque::try_with_capacity(lo));
532
533 while let Some(value) = vm_try!(it.next()) {
534 vm_try!(inner.try_push_back(value));
535 }
536
537 VmResult::Ok(Self { inner })
538 }
539
540 fn get(&self, index: usize) -> VmResult<Value> {
541 let Some(v) = self.inner.get(index) else {
542 return VmResult::err(VmErrorKind::OutOfRange {
543 index: index.into(),
544 length: self.inner.len().into(),
545 });
546 };
547
548 VmResult::Ok(v.clone())
549 }
550
551 fn set(&mut self, index: usize, value: Value) -> VmResult<()> {
552 let Some(v) = self.inner.get_mut(index) else {
553 return VmResult::err(VmErrorKind::OutOfRange {
554 index: index.into(),
555 length: self.inner.len().into(),
556 });
557 };
558
559 *v = value;
560 VmResult::Ok(())
561 }
562
563 /// Write a debug representation to a string.
564 ///
565 /// This calls the [`DEBUG_FMT`] protocol over all elements of the
566 /// collection.
567 ///
568 /// # Examples
569 ///
570 /// ```rune
571 /// use std::collections::VecDeque;
572 ///
573 /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
574 /// assert_eq!(format!("{:?}", deque), "[1, 2, 3]");
575 /// ```
576 #[rune::function(protocol = DEBUG_FMT)]
577 fn debug_fmt(&self, f: &mut Formatter) -> VmResult<()> {
578 self.debug_fmt_with(f, &mut EnvProtocolCaller)
579 }
580
581 #[inline]
582 fn debug_fmt_with(&self, f: &mut Formatter, caller: &mut dyn ProtocolCaller) -> VmResult<()> {
583 let mut it = self.inner.iter().peekable();
584
585 vm_try!(vm_write!(f, "["));
586
587 while let Some(value) = it.next() {
588 vm_try!(value.debug_fmt_with(f, caller));
589
590 if it.peek().is_some() {
591 vm_try!(vm_write!(f, ", "));
592 }
593 }
594
595 vm_try!(vm_write!(f, "]"));
596 VmResult::Ok(())
597 }
598
599 /// Perform a partial equality check with this deque.
600 ///
601 /// This can take any argument which can be converted into an iterator using
602 /// [`INTO_ITER`].
603 ///
604 /// # Examples
605 ///
606 /// ```rune
607 /// use std::collections::VecDeque;
608 ///
609 /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
610 ///
611 /// assert!(deque == [1, 2, 3]);
612 /// assert!(deque == (1..=3));
613 /// assert!(deque != [2, 3, 4]);
614 /// ```
615 #[rune::function(keep, protocol = PARTIAL_EQ)]
616 fn partial_eq(&self, b: Value) -> VmResult<bool> {
617 self.partial_eq_with(b, &mut EnvProtocolCaller)
618 }
619
620 fn partial_eq_with(&self, b: Value, caller: &mut dyn ProtocolCaller) -> VmResult<bool> {
621 let mut b = vm_try!(b.into_iter_with(caller));
622
623 for a in &self.inner {
624 let Some(b) = vm_try!(b.next()) else {
625 return VmResult::Ok(false);
626 };
627
628 if !vm_try!(Value::partial_eq_with(a, &b, caller)) {
629 return VmResult::Ok(false);
630 }
631 }
632
633 if vm_try!(b.next()).is_some() {
634 return VmResult::Ok(false);
635 }
636
637 VmResult::Ok(true)
638 }
639
640 /// Perform a total equality check with this deque.
641 ///
642 /// # Examples
643 ///
644 /// ```rune
645 /// use std::collections::VecDeque;
646 /// use std::ops::eq;
647 ///
648 /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
649 ///
650 /// assert!(eq(deque, VecDeque::from::<Vec>([1, 2, 3])));
651 /// assert!(!eq(deque, VecDeque::from::<Vec>([2, 3, 4])));
652 /// ```
653 #[rune::function(keep, protocol = EQ)]
654 fn eq(&self, b: &VecDeque) -> VmResult<bool> {
655 self.eq_with(b, &mut EnvProtocolCaller)
656 }
657
658 fn eq_with(&self, b: &VecDeque, caller: &mut dyn ProtocolCaller) -> VmResult<bool> {
659 let mut b = b.inner.iter();
660
661 for a in &self.inner {
662 let Some(b) = b.next() else {
663 return VmResult::Ok(false);
664 };
665
666 if !vm_try!(Value::eq_with(a, b, caller)) {
667 return VmResult::Ok(false);
668 }
669 }
670
671 if b.next().is_some() {
672 return VmResult::Ok(false);
673 }
674
675 VmResult::Ok(true)
676 }
677
678 /// Perform a partial comparison check with this deque.
679 ///
680 /// # Examples
681 ///
682 /// ```rune
683 /// use std::collections::VecDeque;
684 ///
685 /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
686 ///
687 /// assert!(deque > VecDeque::from::<Vec>([0, 2, 3]));
688 /// assert!(deque < VecDeque::from::<Vec>([2, 2, 3]));
689 /// ```
690 #[rune::function(keep, protocol = PARTIAL_CMP)]
691 fn partial_cmp(&self, b: &VecDeque) -> VmResult<Option<Ordering>> {
692 self.partial_cmp_with(b, &mut EnvProtocolCaller)
693 }
694
695 fn partial_cmp_with(
696 &self,
697 b: &VecDeque,
698 caller: &mut dyn ProtocolCaller,
699 ) -> VmResult<Option<Ordering>> {
700 let mut b = b.inner.iter();
701
702 for a in self.inner.iter() {
703 let Some(b) = b.next() else {
704 return VmResult::Ok(Some(Ordering::Greater));
705 };
706
707 match vm_try!(Value::partial_cmp_with(a, b, caller)) {
708 Some(Ordering::Equal) => (),
709 other => return VmResult::Ok(other),
710 }
711 }
712
713 if b.next().is_some() {
714 return VmResult::Ok(Some(Ordering::Less));
715 };
716
717 VmResult::Ok(Some(Ordering::Equal))
718 }
719
720 /// Perform a total comparison check with this deque.
721 ///
722 /// # Examples
723 ///
724 /// ```rune
725 /// use std::collections::VecDeque;
726 /// use std::cmp::Ordering;
727 /// use std::ops::cmp;
728 ///
729 /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
730 ///
731 /// assert_eq!(cmp(deque, VecDeque::from::<Vec>([0, 2, 3])), Ordering::Greater);
732 /// assert_eq!(cmp(deque, VecDeque::from::<Vec>([2, 2, 3])), Ordering::Less);
733 /// ```
734 #[rune::function(keep, protocol = CMP)]
735 fn cmp(&self, b: &VecDeque) -> VmResult<Ordering> {
736 self.cmp_with(b, &mut EnvProtocolCaller)
737 }
738
739 fn cmp_with(&self, other: &VecDeque, caller: &mut dyn ProtocolCaller) -> VmResult<Ordering> {
740 let mut b = other.inner.iter();
741
742 for a in self.inner.iter() {
743 let Some(b) = b.next() else {
744 return VmResult::Ok(Ordering::Greater);
745 };
746
747 match vm_try!(Value::cmp_with(a, b, caller)) {
748 Ordering::Equal => (),
749 other => return VmResult::Ok(other),
750 }
751 }
752
753 if b.next().is_some() {
754 return VmResult::Ok(Ordering::Less);
755 };
756
757 VmResult::Ok(Ordering::Equal)
758 }
759}
760
761impl From<Vec> for VecDeque {
762 fn from(value: Vec) -> Self {
763 Self {
764 inner: alloc::VecDeque::from(value.into_inner()),
765 }
766 }
767}
768
769impl TryClone for VecDeque {
770 #[inline]
771 fn try_clone(&self) -> alloc::Result<Self> {
772 Ok(Self {
773 inner: self.inner.try_clone()?,
774 })
775 }
776
777 #[inline]
778 fn try_clone_from(&mut self, source: &Self) -> alloc::Result<()> {
779 self.inner.try_clone_from(&source.inner)
780 }
781}
782
783/// Construct a [`VecDeque`] from a [`Vec`].
784///
785/// This is a cheap conversion.
786///
787/// # Examples
788///
789/// ```rune
790/// use std::collections::VecDeque;
791///
792/// let buf = VecDeque::from::<Vec>([1, 2, 3]);
793/// ```
794#[rune::function(free, path = VecDeque::from::<Vec>)]
795fn from(vec: Vec) -> VmResult<VecDeque> {
796 VmResult::Ok(VecDeque::from(vec))
797}
798
799#[derive(Any)]
800#[rune(item = ::std::collections::vec_deque)]
801pub(crate) struct Iter {
802 iter: alloc::vec_deque::RawIter<Value>,
803 // Drop must happen after the raw iterator.
804 #[allow(unused)]
805 guard: RawAnyGuard,
806}
807
808impl Iter {
809 #[rune::function(keep, protocol = NEXT)]
810 fn next(&mut self) -> Option<Value> {
811 // SAFETY: We're holding onto the reference guard.
812 unsafe { Some((*self.iter.next()?).clone()) }
813 }
814
815 #[rune::function(keep, protocol = SIZE_HINT)]
816 fn size_hint(self) -> (usize, Option<usize>) {
817 self.iter.size_hint()
818 }
819
820 #[rune::function(keep, protocol = LEN)]
821 fn len(self) -> usize {
822 self.iter.len()
823 }
824
825 #[rune::function(keep, protocol = NEXT_BACK)]
826 fn next_back(&mut self) -> Option<Value> {
827 // SAFETY: We're holding onto the reference guard.
828 unsafe { Some((*self.iter.next_back()?).clone()) }
829 }
830}
831
832impl iter::Iterator for Iter {
833 type Item = Value;
834
835 #[inline]
836 fn next(&mut self) -> Option<Self::Item> {
837 Iter::next(self)
838 }
839}
840
841impl iter::DoubleEndedIterator for Iter {
842 fn next_back(&mut self) -> Option<Self::Item> {
843 Iter::next_back(self)
844 }
845}