rcvec.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // SPDX-License-Identifier: Apache-2.0 OR MIT
  2. use alloc::rc::Rc;
  3. use alloc::vec;
  4. use core::mem;
  5. use core::panic::RefUnwindSafe;
  6. use core::slice;
  7. pub(crate) struct RcVec<T> {
  8. inner: Rc<Vec<T>>,
  9. }
  10. pub(crate) struct RcVecBuilder<T> {
  11. inner: Vec<T>,
  12. }
  13. pub(crate) struct RcVecMut<'a, T> {
  14. inner: &'a mut Vec<T>,
  15. }
  16. #[derive(Clone)]
  17. pub(crate) struct RcVecIntoIter<T> {
  18. inner: vec::IntoIter<T>,
  19. }
  20. impl<T> RcVec<T> {
  21. pub(crate) fn is_empty(&self) -> bool {
  22. self.inner.is_empty()
  23. }
  24. pub(crate) fn len(&self) -> usize {
  25. self.inner.len()
  26. }
  27. pub(crate) fn iter(&self) -> slice::Iter<T> {
  28. self.inner.iter()
  29. }
  30. pub(crate) fn make_mut(&mut self) -> RcVecMut<T>
  31. where
  32. T: Clone,
  33. {
  34. RcVecMut {
  35. inner: Rc::make_mut(&mut self.inner),
  36. }
  37. }
  38. pub(crate) fn get_mut(&mut self) -> Option<RcVecMut<T>> {
  39. let inner = Rc::get_mut(&mut self.inner)?;
  40. Some(RcVecMut { inner })
  41. }
  42. pub(crate) fn make_owned(mut self) -> RcVecBuilder<T>
  43. where
  44. T: Clone,
  45. {
  46. let vec = if let Some(owned) = Rc::get_mut(&mut self.inner) {
  47. mem::take(owned)
  48. } else {
  49. Vec::clone(&self.inner)
  50. };
  51. RcVecBuilder { inner: vec }
  52. }
  53. }
  54. impl<T> RcVecBuilder<T> {
  55. pub(crate) fn new() -> Self {
  56. RcVecBuilder { inner: Vec::new() }
  57. }
  58. pub(crate) fn with_capacity(cap: usize) -> Self {
  59. RcVecBuilder {
  60. inner: Vec::with_capacity(cap),
  61. }
  62. }
  63. pub(crate) fn push(&mut self, element: T) {
  64. self.inner.push(element);
  65. }
  66. pub(crate) fn extend(&mut self, iter: impl IntoIterator<Item = T>) {
  67. self.inner.extend(iter);
  68. }
  69. pub(crate) fn as_mut(&mut self) -> RcVecMut<T> {
  70. RcVecMut {
  71. inner: &mut self.inner,
  72. }
  73. }
  74. pub(crate) fn build(self) -> RcVec<T> {
  75. RcVec {
  76. inner: Rc::new(self.inner),
  77. }
  78. }
  79. }
  80. impl<'a, T> RcVecMut<'a, T> {
  81. pub(crate) fn push(&mut self, element: T) {
  82. self.inner.push(element);
  83. }
  84. pub(crate) fn extend(&mut self, iter: impl IntoIterator<Item = T>) {
  85. self.inner.extend(iter);
  86. }
  87. pub(crate) fn as_mut(&mut self) -> RcVecMut<T> {
  88. RcVecMut { inner: self.inner }
  89. }
  90. pub(crate) fn take(self) -> RcVecBuilder<T> {
  91. let vec = mem::take(self.inner);
  92. RcVecBuilder { inner: vec }
  93. }
  94. }
  95. impl<T> Clone for RcVec<T> {
  96. fn clone(&self) -> Self {
  97. RcVec {
  98. inner: Rc::clone(&self.inner),
  99. }
  100. }
  101. }
  102. impl<T> IntoIterator for RcVecBuilder<T> {
  103. type Item = T;
  104. type IntoIter = RcVecIntoIter<T>;
  105. fn into_iter(self) -> Self::IntoIter {
  106. RcVecIntoIter {
  107. inner: self.inner.into_iter(),
  108. }
  109. }
  110. }
  111. impl<T> Iterator for RcVecIntoIter<T> {
  112. type Item = T;
  113. fn next(&mut self) -> Option<Self::Item> {
  114. self.inner.next()
  115. }
  116. fn size_hint(&self) -> (usize, Option<usize>) {
  117. self.inner.size_hint()
  118. }
  119. }
  120. impl<T> RefUnwindSafe for RcVec<T> where T: RefUnwindSafe {}