Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. use std::cell::UnsafeCell;
  2. use std::rc::{Rc, Weak};
  3. use std::ops::{RangeBounds, Bound};
  4.  
  5. pub struct Owner {
  6. inner: Rc<UnsafeCell<Vec<u8>>>,
  7. }
  8.  
  9. pub struct Borrowed {
  10. lo: usize,
  11. hi: usize,
  12. inner: Weak<UnsafeCell<Vec<u8>>>,
  13. }
  14.  
  15. pub struct BorrowedMut {
  16. lo: usize,
  17. hi: usize,
  18. inner: Weak<UnsafeCell<Vec<u8>>>,
  19. }
  20.  
  21. impl Owner {
  22. #[inline]
  23. pub fn new(len: usize) -> Self {
  24. Owner::of(vec![0; len])
  25. }
  26.  
  27. #[inline]
  28. pub fn of(vec: Vec<u8>) -> Self {
  29. Owner {
  30. inner: Rc::new(UnsafeCell::new(vec))
  31. }
  32. }
  33.  
  34. #[inline]
  35. pub fn slice<B>(&self, bounds: B) -> Borrowed
  36. where B: RangeBounds<usize>
  37. {
  38. let (lo, hi) = self.indices(bounds);
  39. Borrowed {
  40. lo, hi,
  41. inner: Rc::downgrade(&self.inner),
  42. }
  43. }
  44.  
  45. #[inline]
  46. pub fn slice_mut<B>(&mut self, bounds: B) -> BorrowedMut
  47. where B: RangeBounds<usize>
  48. {
  49. let (lo, hi) = self.indices(bounds);
  50. BorrowedMut {
  51. lo, hi,
  52. inner: Rc::downgrade(&self.inner),
  53. }
  54. }
  55.  
  56. #[inline]
  57. fn indices<B>(&self, bounds: B) -> (usize, usize)
  58. where B: RangeBounds<usize>
  59. {
  60. let lo = match bounds.start_bound() {
  61. Bound::Included(x) => *x,
  62. _ => 0,
  63. };
  64. let hi = match bounds.end_bound() {
  65. Bound::Excluded(x) => *x,
  66. _ => unsafe { (*self.inner.get()).len() - 1 },
  67. };
  68. (lo, hi)
  69. }
  70. }
  71.  
  72. impl Borrowed {
  73. #[inline]
  74. pub fn get(&self) -> Option<&[u8]> {
  75. self.inner
  76. .upgrade()
  77. .map(|cell| {
  78. let len = self.hi - self.lo;
  79. let vec = unsafe { &mut *cell.get() };
  80.  
  81. if len > vec.len() {
  82. vec.resize(len, 0)
  83. }
  84.  
  85. &vec[self.lo..self.hi]
  86. })
  87. }
  88. }
  89.  
  90. impl BorrowedMut {
  91. #[inline]
  92. pub fn get(&mut self) -> Option<&mut [u8]> {
  93. self.inner
  94. .upgrade()
  95. .map(|cell| {
  96. let len = self.hi - self.lo;
  97. let vec = unsafe { &mut *cell.get() };
  98.  
  99. if len > vec.len() {
  100. vec.resize(len, 0)
  101. }
  102.  
  103. &mut vec[self.lo..self.hi]
  104. })
  105. }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement