1use core::cmp;
2use core::cmp::Ordering;
3use core::fmt;
4use core::mem;
5use core::ops;
6use core::slice;
7use core::slice::SliceIndex;
8
9use crate as rune;
10use crate::alloc;
11use crate::alloc::fmt::TryWrite;
12use crate::alloc::prelude::*;
13use crate::runtime::slice::Iter;
14use crate::shared::FixedVec;
15use crate::{Any, TypeHash};
16
17use super::{
18 Dismantle, EnvProtocolCaller, Formatter, FromValue, Handover, Hasher, ProtocolCaller, Range,
19 RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive, RawAnyGuard, Ref,
20 RuntimeError, ToValue, UnsafeToRef, Value, VmError, VmErrorKind, Worklist,
21};
22
23#[derive(Default, Any)]
41#[repr(transparent)]
42#[rune(item = ::std::vec, dismantle)]
43pub struct Vec {
44 inner: alloc::Vec<Value>,
45}
46
47impl Dismantle for Vec {
51 fn dismantle(&mut self, out: &mut Handover<'_>) {
52 for value in self.inner.drain(..) {
55 out.push(value);
56 }
57 }
58}
59
60impl Vec {
61 pub const fn new() -> Self {
73 Self {
74 inner: alloc::Vec::new(),
75 }
76 }
77
78 pub fn sort_by<F>(&mut self, mut compare: F) -> alloc::Result<()>
93 where
94 F: FnMut(&Value, &Value) -> cmp::Ordering,
95 {
96 let len = self.inner.len();
97
98 if len < 2 {
99 return Ok(());
100 }
101
102 let mut buf = self.inner.try_clone()?;
104 let mut width = 1usize;
105
106 while width < len {
107 let mut start = 0;
108
109 while start < len {
110 let mid = start.saturating_add(width).min(len);
111 let end = start.saturating_add(width * 2).min(len);
112
113 merge(
114 &self.inner[start..mid],
115 &self.inner[mid..end],
116 &mut buf[start..end],
117 &mut compare,
118 );
119
120 start = end;
121 }
122
123 mem::swap(&mut self.inner, &mut buf);
124 width *= 2;
125 }
126
127 Ok(())
128 }
129
130 pub fn with_capacity(cap: usize) -> alloc::Result<Self> {
133 Ok(Self {
134 inner: alloc::Vec::try_with_capacity(cap)?,
135 })
136 }
137
138 pub fn into_inner(self) -> alloc::Vec<Value> {
140 self.inner
141 }
142
143 pub fn is_empty(&self) -> bool {
158 self.inner.is_empty()
159 }
160
161 pub fn len(&self) -> usize {
164 self.inner.len()
165 }
166
167 pub fn capacity(&self) -> usize {
170 self.inner.capacity()
171 }
172
173 pub fn set(&mut self, index: usize, value: Value) -> Result<(), VmError> {
175 let length = self.len();
176
177 let Some(v) = self.inner.get_mut(index) else {
178 return Err(VmError::new(VmErrorKind::OutOfRange {
179 index: index.into(),
180 length: length.into(),
181 }));
182 };
183
184 Worklist::new().replace(v, value);
189 Ok(())
190 }
191
192 pub fn resize(&mut self, new_len: usize, value: Value) -> Result<(), VmError> {
198 let len = self.inner.len();
199
200 if new_len < len {
201 if let Some(values) = self.inner.get_mut(new_len..) {
204 Worklist::new().dismantle_all(values.iter_mut());
205 }
206
207 self.inner.truncate(new_len);
208 return Ok(());
209 }
210
211 if value.is_inline() {
212 self.inner.try_resize(new_len, value)?;
213 } else {
214 for _ in 0..new_len - len {
215 let value = value.clone_with(&mut EnvProtocolCaller)?;
216 self.inner.try_push(value)?;
217 }
218 }
219
220 Ok(())
221 }
222
223 pub(crate) fn dismantle(&mut self, work: &mut Worklist) {
226 work.dismantle_all(self.inner.iter_mut());
227 self.inner.clear();
228 }
229
230 pub fn push(&mut self, value: Value) -> alloc::Result<()> {
232 self.inner.try_push(value)
233 }
234
235 pub fn push_value<T>(&mut self, value: T) -> Result<(), VmError>
238 where
239 T: ToValue,
240 {
241 self.inner.try_push(value.to_value()?)?;
242 Ok(())
243 }
244
245 pub fn get<I>(&self, index: I) -> Option<&I::Output>
247 where
248 I: SliceIndex<[Value]>,
249 {
250 self.inner.get(index)
251 }
252
253 pub fn get_value<T>(&self, index: usize) -> Result<Option<T>, VmError>
255 where
256 T: FromValue,
257 {
258 let Some(value) = self.inner.get(index) else {
259 return Ok(None);
260 };
261
262 Ok(Some(T::from_value(value.clone())?))
263 }
264
265 pub fn get_mut(&mut self, index: usize) -> Option<&mut Value> {
267 self.inner.get_mut(index)
268 }
269
270 pub fn pop(&mut self) -> Option<Value> {
273 self.inner.pop()
274 }
275
276 pub fn remove(&mut self, index: usize) -> Value {
278 self.inner.remove(index)
279 }
280
281 pub fn clear(&mut self) {
286 self.inner.clear();
287 }
288
289 pub fn insert(&mut self, index: usize, value: Value) -> alloc::Result<()> {
292 self.inner.try_insert(index, value)
293 }
294
295 pub fn extend(&mut self, value: Value) -> Result<(), VmError> {
298 let mut it = value.into_iter()?;
299
300 while let Some(value) = it.next()? {
301 self.push(value)?;
302 }
303
304 Ok(())
305 }
306
307 #[rune::function(keep, path = Self::iter)]
319 pub fn rune_iter(this: Ref<Self>) -> Iter {
320 Iter::new(Ref::map(this, |vec| &**vec))
321 }
322
323 pub(crate) fn as_slice(&self) -> &[Value] {
325 &self.inner
326 }
327
328 pub(crate) fn debug_fmt_with(
329 this: &[Value],
330 f: &mut Formatter,
331 caller: &mut dyn ProtocolCaller,
332 ) -> Result<(), VmError> {
333 let mut it = this.iter().peekable();
334 write!(f, "[")?;
335
336 while let Some(value) = it.next() {
337 value.debug_fmt_with(f, caller)?;
338
339 if it.peek().is_some() {
340 write!(f, ", ")?;
341 }
342 }
343
344 write!(f, "]")?;
345 Ok(())
346 }
347
348 pub(crate) fn partial_eq_with(
349 a: &[Value],
350 b: Value,
351 caller: &mut dyn ProtocolCaller,
352 ) -> Result<bool, VmError> {
353 let mut b = b.into_iter_with(caller)?;
354
355 for a in a {
356 let Some(b) = b.next()? else {
357 return Ok(false);
358 };
359
360 if !Value::partial_eq_with(a, &b, caller)? {
361 return Ok(false);
362 }
363 }
364
365 Ok(!b.next()?.is_some())
366 }
367
368 pub(crate) fn eq_with(
369 a: &[Value],
370 b: &[Value],
371 eq: fn(&Value, &Value, &mut dyn ProtocolCaller) -> Result<bool, VmError>,
372 caller: &mut dyn ProtocolCaller,
373 ) -> Result<bool, VmError> {
374 if a.len() != b.len() {
375 return Ok(false);
376 }
377
378 for (a, b) in a.iter().zip(b.iter()) {
379 if !eq(a, b, caller)? {
380 return Ok(false);
381 }
382 }
383
384 Ok(true)
385 }
386
387 pub(crate) fn partial_cmp_with(
388 a: &[Value],
389 b: &[Value],
390 caller: &mut dyn ProtocolCaller,
391 ) -> Result<Option<Ordering>, VmError> {
392 let mut b = b.iter();
393
394 for a in a.iter() {
395 let Some(b) = b.next() else {
396 return Ok(Some(Ordering::Greater));
397 };
398
399 match Value::partial_cmp_with(a, b, caller)? {
400 Some(Ordering::Equal) => continue,
401 other => return Ok(other),
402 }
403 }
404
405 if b.next().is_some() {
406 return Ok(Some(Ordering::Less));
407 }
408
409 Ok(Some(Ordering::Equal))
410 }
411
412 pub(crate) fn cmp_with(
413 a: &[Value],
414 b: &[Value],
415 caller: &mut dyn ProtocolCaller,
416 ) -> Result<Ordering, VmError> {
417 let mut b = b.iter();
418
419 for a in a.iter() {
420 let Some(b) = b.next() else {
421 return Ok(Ordering::Greater);
422 };
423
424 match Value::cmp_with(a, b, caller)? {
425 Ordering::Equal => continue,
426 other => return Ok(other),
427 }
428 }
429
430 if b.next().is_some() {
431 return Ok(Ordering::Less);
432 }
433
434 Ok(Ordering::Equal)
435 }
436
437 pub(crate) fn index_get(this: &[Value], index: Value) -> Result<Option<Value>, VmError> {
440 let slice: Option<&[Value]> = 'out: {
441 if let Some(value) = index.as_any() {
442 match value.type_hash() {
443 RangeFrom::HASH => {
444 let range = value.borrow_ref::<RangeFrom>()?;
445 let start = range.start.as_usize()?;
446 break 'out this.get(start..);
447 }
448 RangeFull::HASH => {
449 _ = value.borrow_ref::<RangeFull>()?;
450 break 'out this.get(..);
451 }
452 RangeInclusive::HASH => {
453 let range = value.borrow_ref::<RangeInclusive>()?;
454 let start = range.start.as_usize()?;
455 let end = range.end.as_usize()?;
456 break 'out this.get(start..=end);
457 }
458 RangeToInclusive::HASH => {
459 let range = value.borrow_ref::<RangeToInclusive>()?;
460 let end = range.end.as_usize()?;
461 break 'out this.get(..=end);
462 }
463 RangeTo::HASH => {
464 let range = value.borrow_ref::<RangeTo>()?;
465 let end = range.end.as_usize()?;
466 break 'out this.get(..end);
467 }
468 Range::HASH => {
469 let range = value.borrow_ref::<Range>()?;
470 let start = range.start.as_usize()?;
471 let end = range.end.as_usize()?;
472 break 'out this.get(start..end);
473 }
474 _ => {}
475 }
476 };
477
478 let index = usize::from_value(index)?;
479
480 let Some(value) = this.get(index) else {
481 return Ok(None);
482 };
483
484 return Ok(Some(value.clone()));
485 };
486
487 let Some(values) = slice else {
488 return Ok(None);
489 };
490
491 let vec = alloc::Vec::try_from(values)?;
492 Ok(Some(Value::vec(vec)?))
493 }
494
495 pub(crate) fn hash_with(
496 &self,
497 hasher: &mut Hasher,
498 caller: &mut dyn ProtocolCaller,
499 ) -> Result<(), VmError> {
500 for value in self.inner.iter() {
501 value.hash_with(hasher, caller)?;
502 }
503
504 Ok(())
505 }
506}
507
508impl TryClone for Vec {
509 fn try_clone(&self) -> alloc::Result<Self> {
510 Ok(Self {
511 inner: self.inner.try_clone()?,
512 })
513 }
514}
515
516impl fmt::Debug for Vec {
517 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
518 f.debug_list().entries(&*self.inner).finish()
519 }
520}
521
522impl ops::Deref for Vec {
523 type Target = [Value];
524
525 #[inline]
526 fn deref(&self) -> &Self::Target {
527 &self.inner
528 }
529}
530
531impl ops::DerefMut for Vec {
532 #[inline]
533 fn deref_mut(&mut self) -> &mut Self::Target {
534 &mut self.inner
535 }
536}
537
538impl IntoIterator for Vec {
539 type Item = Value;
540 type IntoIter = alloc::vec::IntoIter<Value>;
541
542 #[inline]
543 fn into_iter(self) -> Self::IntoIter {
544 self.inner.into_iter()
545 }
546}
547
548impl<'a> IntoIterator for &'a Vec {
549 type Item = &'a Value;
550 type IntoIter = slice::Iter<'a, Value>;
551
552 #[inline]
553 fn into_iter(self) -> Self::IntoIter {
554 self.inner.iter()
555 }
556}
557
558impl<'a> IntoIterator for &'a mut Vec {
559 type Item = &'a mut Value;
560 type IntoIter = slice::IterMut<'a, Value>;
561
562 #[inline]
563 fn into_iter(self) -> Self::IntoIter {
564 self.inner.iter_mut()
565 }
566}
567
568impl TryFrom<rust_alloc::vec::Vec<Value>> for Vec {
569 type Error = alloc::Error;
570
571 #[inline]
572 fn try_from(values: rust_alloc::vec::Vec<Value>) -> Result<Self, Self::Error> {
573 let mut inner = alloc::Vec::try_with_capacity(values.len())?;
574
575 for value in values {
576 inner.try_push(value)?;
577 }
578
579 Ok(Self { inner })
580 }
581}
582
583impl TryFrom<rust_alloc::boxed::Box<[Value]>> for Vec {
584 type Error = alloc::Error;
585
586 #[inline]
587 fn try_from(inner: rust_alloc::boxed::Box<[Value]>) -> Result<Self, Self::Error> {
588 Vec::try_from(inner.into_vec())
589 }
590}
591
592impl From<alloc::Vec<Value>> for Vec {
593 #[inline]
594 fn from(inner: alloc::Vec<Value>) -> Self {
595 Self { inner }
596 }
597}
598
599impl<T> FromValue for rust_alloc::vec::Vec<T>
600where
601 T: FromValue,
602{
603 #[inline]
604 fn from_value(value: Value) -> Result<Self, RuntimeError> {
605 let vec = value.downcast::<Vec>()?;
606
607 let mut output = rust_alloc::vec::Vec::with_capacity(vec.len());
608
609 for value in vec {
610 output.push(T::from_value(value)?);
611 }
612
613 Ok(output)
614 }
615}
616
617impl<T> FromValue for alloc::Vec<T>
618where
619 T: FromValue,
620{
621 #[inline]
622 fn from_value(value: Value) -> Result<Self, RuntimeError> {
623 let vec = value.downcast::<Vec>()?;
624
625 let mut output = alloc::Vec::try_with_capacity(vec.len())?;
626
627 for value in vec {
628 output.try_push(T::from_value(value)?)?;
629 }
630
631 Ok(output)
632 }
633}
634
635impl UnsafeToRef for [Value] {
636 type Guard = RawAnyGuard;
637
638 #[inline]
639 unsafe fn unsafe_to_ref<'a>(value: Value) -> Result<(&'a Self, Self::Guard), RuntimeError> {
640 let vec = value.into_ref::<Vec>()?;
641 let (vec, guard) = Ref::into_raw(vec);
642 Ok((vec.as_ref().as_slice(), guard))
643 }
644}
645
646impl<T> ToValue for alloc::Vec<T>
647where
648 T: ToValue,
649{
650 #[inline]
651 fn to_value(self) -> Result<Value, RuntimeError> {
652 let mut inner = alloc::Vec::try_with_capacity(self.len())?;
653
654 for value in self {
655 let value = value.to_value()?;
656 inner.try_push(value)?;
657 }
658
659 Ok(Value::try_from(Vec { inner })?)
660 }
661}
662
663impl<T> ToValue for rust_alloc::vec::Vec<T>
664where
665 T: ToValue,
666{
667 #[inline]
668 fn to_value(self) -> Result<Value, RuntimeError> {
669 let mut inner = alloc::Vec::try_with_capacity(self.len())?;
670
671 for value in self {
672 let value = value.to_value()?;
673 inner.try_push(value)?;
674 }
675
676 Ok(Value::try_from(Vec { inner })?)
677 }
678}
679
680impl<T, const N: usize> FromValue for [T; N]
681where
682 T: FromValue,
683{
684 fn from_value(value: Value) -> Result<Self, RuntimeError> {
685 let vec = value.into_ref::<Vec>()?;
686
687 let values = vec.as_slice();
688
689 if values.len() != N {
690 return Err(RuntimeError::new(VmErrorKind::ExpectedVecLength {
691 actual: vec.len(),
692 expected: N,
693 }));
694 };
695
696 let mut output = FixedVec::<T, N>::new();
697
698 for v in values {
699 output.try_push(T::from_value(v.clone())?)?;
700 }
701
702 Ok(output.into_inner())
703 }
704}
705
706impl<T, const N: usize> ToValue for [T; N]
707where
708 T: ToValue,
709{
710 #[inline]
711 fn to_value(self) -> Result<Value, RuntimeError> {
712 let mut inner = alloc::Vec::try_with_capacity(self.len())?;
713
714 for value in self {
715 let value = value.to_value()?;
716 inner.try_push(value)?;
717 }
718
719 Ok(Value::try_from(Vec { inner })?)
720 }
721}
722
723fn merge<F>(a: &[Value], b: &[Value], out: &mut [Value], compare: &mut F)
730where
731 F: FnMut(&Value, &Value) -> Ordering,
732{
733 let mut i = 0;
734 let mut j = 0;
735
736 for slot in out.iter_mut() {
737 let take_a = if i >= a.len() {
738 false
739 } else if j >= b.len() {
740 true
741 } else {
742 !matches!(compare(&a[i], &b[j]), Ordering::Greater)
743 };
744
745 if take_a {
746 *slot = a[i].clone();
747 i += 1;
748 } else {
749 *slot = b[j].clone();
750 j += 1;
751 }
752 }
753}