1
2use crate::prelude::*;
3use bitvec::vec::BitVec;
4use std::{
5 cell::UnsafeCell,
6 fmt::Debug,
7 mem::{ManuallyDrop, size_of, size_of_val},
8 ops::{Index, IndexMut, Range, RangeFrom, RangeTo, RangeFull, RangeInclusive, RangeToInclusive},
9 rc::Rc,
10};
11
12pub trait BufferVecItem: Copy + Sized + Default + Debug {}
14impl<T> BufferVecItem for T where T: Copy + Sized + Default + Debug {}
15
16pub trait BufferVec<T: BufferVecItem>: Debug + Clone + From<Buffer> +
18 Index<usize> + IndexMut<usize> +
19 Index<Range<usize>> + IndexMut<Range<usize>> +
20 Index<RangeTo<usize>> + IndexMut<RangeTo<usize>> +
21 Index<RangeFull> + IndexMut<RangeFull> +
22 Index<RangeInclusive<usize>> + IndexMut<RangeInclusive<usize>> +
23 Index<RangeToInclusive<usize>> + IndexMut<RangeToInclusive<usize>>
24{
25 fn get_buffer(&self) -> &Buffer;
27
28 fn get_buffer_mut(&mut self) -> &mut Buffer;
30
31 fn get_target(&self) -> BufferTarget;
33
34 fn set_target(&mut self, target: BufferTarget);
36
37 fn len(&self) -> usize;
39
40 fn capacity(&self) -> usize;
42
43 fn resize(&mut self, new_len: usize, value: T) -> Result<(), GLCoreError>;
45
46 fn shrink_to_fit(&mut self) -> Result<(), GLCoreError>;
48
49 fn get(&self, index: usize) -> Result<T, GLCoreError>;
51
52 fn set(&mut self, index: usize, data: &T) -> Result<(), GLCoreError>;
54
55 fn get_slice_of_data(&self, start_index: usize, len: usize) -> Result<Vec<T>, GLCoreError>;
57
58 fn set_slice_of_data(&mut self, start_index: usize, data: &[T]) -> Result<(), GLCoreError>;
60
61 fn flush(&mut self) -> Result<(), GLCoreError> {Ok(())}
63
64 fn is_empty(&self) -> bool {
66 self.len() == 0
67 }
68
69 fn bind<'a>(&'a self) -> Result<BufferBind<'a>, GLCoreError> {
71 self.get_buffer().bind()
72 }
73
74 fn bind_to<'a>(&'a self, target: BufferTarget) -> Result<BufferBind<'a>, GLCoreError> {
76 self.get_buffer().bind_to(target)
77 }
78}
79
80#[derive(Debug)]
82pub struct BufferVecStatic<T: BufferVecItem> {
83 pub glcore: Rc<GLCore>,
84 buffer: ManuallyDrop<Buffer>,
85 num_items: usize,
86 capacity: usize,
87 cache: UnsafeCell<BufferVecStaticCache<T>>,
88}
89
90impl<T: BufferVecItem> Clone for BufferVecStatic<T> {
91 fn clone(&self) -> Self {
92 let buffer = self.buffer.clone();
93 let cache = UnsafeCell::new(unsafe {&mut *self.cache.get()}.clone_cache(&buffer).unwrap());
94 Self {
95 glcore: self.glcore.clone(),
96 buffer,
97 num_items: self.num_items,
98 capacity: self.capacity,
99 cache,
100 }
101 }
102}
103
104impl<T: BufferVecItem> BufferVecStatic<T> {
106 pub fn get_name(&self) -> u32 {
108 self.buffer.get_name()
109 }
110
111 pub fn new(buffer: Buffer) -> Self {
113 let glcore = buffer.glcore.clone();
114 let capacity = buffer.size() / size_of::<T>();
115 Self {
116 glcore,
117 buffer: ManuallyDrop::new(buffer),
118 num_items: 0,
119 capacity,
120 cache: UnsafeCell::new(BufferVecStaticCache::None),
121 }
122 }
123}
124
125impl<T: BufferVecItem> BufferVec<T> for BufferVecStatic<T> {
126 fn get_buffer(&self) -> &Buffer {
127 &self.buffer
128 }
129
130 fn get_buffer_mut(&mut self) -> &mut Buffer {
131 &mut self.buffer
132 }
133
134 fn get_target(&self) -> BufferTarget {
135 self.buffer.get_target()
136 }
137
138 fn set_target(&mut self, target: BufferTarget) {
139 self.buffer.set_target(target)
140 }
141
142 fn capacity(&self) -> usize {
143 self.capacity
144 }
145
146 fn len(&self) -> usize {
147 self.num_items
148 }
149
150 fn resize(&mut self, new_len: usize, value: T) -> Result<(), GLCoreError> {
151 let new_size = new_len * size_of::<T>();
152 if new_size > self.capacity {
153 self.buffer.resize(new_len * size_of::<T>(), value)?;
154 }
155 self.num_items = new_len;
156 Ok(())
157 }
158
159 fn shrink_to_fit(&mut self) -> Result<(), GLCoreError> {
160 self.capacity = self.num_items;
161 self.buffer.resize(self.capacity * size_of::<T>(), T::default())?;
162 Ok(())
163 }
164
165 fn get(&self, index: usize) -> Result<T, GLCoreError> {
166 let offset = index * size_of::<T>();
167 let bind = self.buffer.bind()?;
168 let (map, addr) = bind.map_ranged(offset, size_of::<T>(), MapAccess::WriteOnly)?;
169 let addr = addr as *mut T;
170 let ret = unsafe { *addr };
171 map.unmap();
172 Ok(ret)
173 }
174
175 fn set(&mut self, index: usize, data: &T) -> Result<(), GLCoreError> {
176 let offset = index * size_of::<T>();
177 let bind = self.buffer.bind()?;
178 let (map, addr) = bind.map_ranged(offset, size_of::<T>(), MapAccess::WriteOnly)?;
179 let addr = addr as *mut T;
180 unsafe {
181 *addr = *data;
182 }
183 map.unmap();
184 Ok(())
185 }
186
187 fn get_slice_of_data(&self, start_index: usize, len: usize) -> Result<Vec<T>, GLCoreError> {
188 let offset = start_index * size_of::<T>();
189 let end_index = start_index + len;
190 let bind = self.buffer.bind()?;
191 let (map, addr) = bind.map_ranged(offset, len * size_of::<T>(), MapAccess::WriteOnly)?;
192 let addr = addr as *mut T;
193 let mut ret: Vec<T> = Vec::with_capacity(len);
194 for i in start_index..end_index {
195 ret.push(unsafe {*addr.wrapping_add(i)});
196 }
197 map.unmap();
198 Ok(ret)
199 }
200
201 fn set_slice_of_data(&mut self, index: usize, data: &[T]) -> Result<(), GLCoreError> {
202 let offset = index * size_of::<T>();
203 let bind = self.buffer.bind()?;
204 let (map, addr) = bind.map_ranged(offset, size_of_val(data), MapAccess::WriteOnly)?;
205 let addr = addr as *mut T;
206 for (i, item) in data.iter().enumerate() {
207 unsafe { *addr.wrapping_add(i) = *item; };
208 }
209 map.unmap();
210 Ok(())
211 }
212
213 fn flush(&mut self) -> Result<(), GLCoreError> {
214 *self.cache.get_mut() = BufferVecStaticCache::None;
215 Ok(())
216 }
217}
218
219#[derive(Debug)]
221pub struct BufferVecItemRef<T>
222where
223 T: BufferVecItem {
224 item: T,
225 index: usize,
226 buffer: Box<BufferVecStatic<T>>,
227}
228
229#[derive(Debug)]
231pub struct BufferVecItemRefMut<T>
232where
233 T: BufferVecItem {
234 item: T,
235 index: usize,
236 buffer: Box<BufferVecStatic<T>>,
237}
238
239#[derive(Debug)]
241pub struct BufferVecSliceRef<T>
242where
243 T: BufferVecItem {
244 slice: Vec<T>,
245 start_index: usize,
246 buffer: Box<BufferVecStatic<T>>,
247}
248
249#[derive(Debug)]
251pub struct BufferVecSliceRefMut<T>
252where
253 T: BufferVecItem {
254 slice: Vec<T>,
255 start_index: usize,
256 buffer: Box<BufferVecStatic<T>>,
257}
258
259#[derive(Debug)]
261enum BufferVecStaticCache<T: BufferVecItem> {
262 None,
263 Item(BufferVecItemRef<T>),
264 ItemMut(BufferVecItemRefMut<T>),
265 Slice(BufferVecSliceRef<T>),
266 SliceMut(BufferVecSliceRefMut<T>),
267}
268
269impl<T: BufferVecItem> BufferVecStaticCache<T> {
270 fn get_item(&self) -> &T {
272 if let Self::Item(item) = self {
273 item.as_ref()
274 } else {
275 panic!("The current cache isn't an item")
276 }
277 }
278
279 fn get_item_mut(&mut self) -> &mut T {
281 if let Self::ItemMut(item_mut) = self {
282 item_mut.as_mut()
283 } else {
284 panic!("The current cache isn't an item")
285 }
286 }
287
288 fn get_slice(&self) -> &[T] {
290 if let Self::Slice(slice) = self {
291 slice.as_ref()
292 } else {
293 panic!("The current cache isn't an item")
294 }
295 }
296
297 fn get_slice_mut(&mut self) -> &mut [T] {
299 if let Self::SliceMut(slice_mut) = self {
300 slice_mut.as_mut()
301 } else {
302 panic!("The current cache isn't an item")
303 }
304 }
305
306 fn clone_cache(&self, new_buffer: &Buffer) -> Result<Self, GLCoreError> {
308 let ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(new_buffer.glcore.clone(), new_buffer.get_name(), new_buffer.get_target())}?));
309 Ok(match self {
310 Self::None => Self::None,
311 Self::Item(data) => Self::Item(BufferVecItemRef{
312 item: data.item,
313 index: data.index,
314 buffer: ref_buffer,
315 }),
316 Self::ItemMut(data) => Self::ItemMut(BufferVecItemRefMut{
317 item: data.item,
318 index: data.index,
319 buffer: ref_buffer,
320 }),
321 Self::Slice(data) => Self::Slice(BufferVecSliceRef{
322 slice: data.slice.clone(),
323 start_index: data.start_index,
324 buffer: ref_buffer,
325 }),
326 Self::SliceMut(data) => Self::SliceMut(BufferVecSliceRefMut{
327 slice: data.slice.clone(),
328 start_index: data.start_index,
329 buffer: ref_buffer,
330 }),
331 })
332 }
333}
334
335impl<T: BufferVecItem> From<Buffer> for BufferVecStatic<T> {
336 fn from(val: Buffer) -> Self {
337 let capacity = val.size() / size_of::<T>();
338 BufferVecStatic {
339 glcore: val.glcore.clone(),
340 buffer: ManuallyDrop::new(val),
341 num_items: 0,
342 capacity,
343 cache: UnsafeCell::new(BufferVecStaticCache::None),
344 }
345 }
346}
347
348#[derive(Debug, Clone)]
350pub struct BufferVecDynamic<T: BufferVecItem> {
351 pub glcore: Rc<GLCore>,
352 buffer: BufferVecStatic<T>,
353 num_items: usize,
354 capacity: usize,
355 cache: Vec<T>,
356 cache_modified_bitmap: BitVec,
357 cache_modified: bool,
358}
359
360impl<T: BufferVecItem> BufferVecDynamic<T> {
361 pub fn get_name(&self) -> u32 {
363 self.buffer.get_name()
364 }
365
366 pub fn new(mut buffer: BufferVecStatic<T>) -> Result<Self, GLCoreError> {
368 buffer.flush()?;
369 let capacity = buffer.capacity();
370 let mut cache_modified_bitmap = BitVec::new();
371 let cache = buffer.get_slice_of_data(0, capacity)?;
372 cache_modified_bitmap.resize(capacity, false);
373 let num_items = buffer.len();
374 Ok(Self {
375 glcore: buffer.glcore.clone(),
376 buffer,
377 cache,
378 cache_modified_bitmap,
379 cache_modified: false,
380 num_items,
381 capacity
382 })
383 }
384}
385
386impl<T: BufferVecItem> BufferVec<T> for BufferVecDynamic<T> {
387 fn get_buffer(&self) -> &Buffer {
388 self.buffer.get_buffer()
389 }
390
391 fn get_buffer_mut(&mut self) -> &mut Buffer {
392 self.buffer.get_buffer_mut()
393 }
394
395 fn get_target(&self) -> BufferTarget {
396 self.buffer.get_target()
397 }
398
399 fn set_target(&mut self, target: BufferTarget) {
400 self.buffer.set_target(target)
401 }
402
403 fn len(&self) -> usize {
404 self.num_items
405 }
406
407 fn capacity(&self) -> usize {
408 self.capacity
409 }
410
411 fn resize(&mut self, new_len: usize, value: T) -> Result<(), GLCoreError> {
412 self.cache.resize(new_len, value);
413 self.num_items = new_len;
414 if new_len > self.capacity {
415 self.cache_modified_bitmap.clear(); self.cache_modified_bitmap.resize(new_len, false);
417 self.buffer.resize(new_len, value)?;
418 self.capacity = new_len;
419 self.cache_modified = false;
420 } else {
421 self.cache_modified_bitmap.resize(new_len, false);
422 }
423 Ok(())
424 }
425
426 fn shrink_to_fit(&mut self) -> Result<(), GLCoreError> {
427 if self.capacity > self.num_items {
428 self.cache.shrink_to_fit();
429 self.cache_modified_bitmap.clear(); self.cache_modified_bitmap.resize(self.num_items, false);
431 self.buffer.resize(self.num_items, T::default())?;
432 self.capacity = self.num_items;
433 self.cache_modified = false;
434 }
435 Ok(())
436 }
437
438 fn get(&self, index: usize) -> Result<T, GLCoreError> {
439 Ok(self.cache[index])
440 }
441
442 fn set(&mut self, index: usize, data: &T) -> Result<(), GLCoreError> {
443 self.cache[index] = *data;
444 self.cache_modified = true;
445 self.cache_modified_bitmap.set(index, true);
446 Ok(())
447 }
448
449 fn get_slice_of_data(&self, start_index: usize, len: usize) -> Result<Vec<T>, GLCoreError> {
450 let end_index = start_index + len;
451 Ok(self.cache[start_index..end_index].to_vec())
452 }
453
454 fn set_slice_of_data(&mut self, start_index: usize, data: &[T]) -> Result<(), GLCoreError> {
455 let end_index = start_index + data.len();
456 self.cache_modified = true;
457 for i in start_index..end_index {
458 self.cache[i] = data[i - start_index];
459 self.cache_modified_bitmap.set(i, true);
460 }
461 Ok(())
462 }
463
464 fn flush(&mut self) -> Result<(), GLCoreError> {
465 if !self.cache_modified {
466 return Ok(());
467 }
468
469 const MAXIMUM_GAP: usize = 16;
470
471 let mut is_in: bool = false;
472 let mut start_index: usize = 0;
473 let mut end_index: usize = 0;
474 let mut gap_length: usize = 0;
475 for i in 0..self.num_items {
476 if self.cache_modified_bitmap[i] {
477 if !is_in {
478 is_in = true;
479 start_index = i;
480 }
481 gap_length = 0;
482 end_index = i;
483 self.cache_modified_bitmap.set(i, false);
484 } else if is_in {
485 if gap_length < MAXIMUM_GAP {
486 gap_length += 1;
487 } else {
488 self.buffer.set_slice_of_data(0, &self.cache[start_index..=end_index])?;
489 is_in = false;
490 }
491 }
492 }
493 if is_in {
494 self.buffer.set_slice_of_data(0, &self.cache[start_index..=end_index])?;
495 }
496
497 self.cache_modified = false;
498 Ok(())
499 }
500}
501
502impl<T> BufferVecItemRef<T>
503where
504 T: BufferVecItem {
505 fn new(buffer: &BufferVecStatic<T>, index: usize) -> Result<Self, GLCoreError> {
506 let item = buffer.get(index)?;
507 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
508 ref_buffer.resize(buffer.len(), T::default())?;
509 Ok(Self {
510 item,
511 index,
512 buffer: ref_buffer,
513 })
514 }
515
516 fn as_ref(&self) -> &T {
517 &self.item
518 }
519}
520
521impl<T> BufferVecItemRefMut<T>
522where
523 T: BufferVecItem {
524 fn new(buffer: &mut BufferVecStatic<T>, index: usize) -> Result<Self, GLCoreError> {
525 let item = buffer.get(index)?;
526 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
527 ref_buffer.resize(buffer.len(), T::default())?;
528 Ok(Self {
529 item,
530 index,
531 buffer: ref_buffer,
532 })
533 }
534
535 fn as_mut(&mut self) -> &mut T {
536 &mut self.item
537 }
538}
539
540impl<T> BufferVecSliceRef<T>
541where
542 T: BufferVecItem {
543 fn as_ref(&self) -> &[T] {
544 self.slice.as_ref()
545 }
546
547 fn new_range(buffer: &BufferVecStatic<T>, range: Range<usize>) -> Result<Self, GLCoreError> {
548 let slice = buffer.get_slice_of_data(range.start, range.end - range.start)?;
549 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
550 ref_buffer.resize(buffer.len(), T::default())?;
551 Ok(Self {
552 slice,
553 start_index: range.start,
554 buffer: ref_buffer,
555 })
556 }
557
558 fn new_range_from(buffer: &BufferVecStatic<T>, range: RangeFrom<usize>) -> Result<Self, GLCoreError> {
559 let slice = buffer.get_slice_of_data(range.start, buffer.len() - range.start)?;
560 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
561 ref_buffer.resize(buffer.len(), T::default())?;
562 Ok(Self {
563 slice,
564 start_index: range.start,
565 buffer: ref_buffer,
566 })
567 }
568
569 fn new_range_to(buffer: &BufferVecStatic<T>, range: RangeTo<usize>) -> Result<Self, GLCoreError> {
570 let slice = buffer.get_slice_of_data(0, range.end)?;
571 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
572 ref_buffer.resize(buffer.len(), T::default())?;
573 Ok(Self {
574 slice,
575 start_index: 0,
576 buffer: ref_buffer,
577 })
578 }
579
580 fn new_range_full(buffer: &BufferVecStatic<T>) -> Result<Self, GLCoreError> {
581 let slice = buffer.get_slice_of_data(0, buffer.len())?;
582 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
583 ref_buffer.resize(buffer.len(), T::default())?;
584 Ok(Self {
585 slice,
586 start_index: 0,
587 buffer: ref_buffer,
588 })
589 }
590
591 fn new_range_inclusive(buffer: &BufferVecStatic<T>, range: RangeInclusive<usize>) -> Result<Self, GLCoreError> {
592 let slice = buffer.get_slice_of_data(*range.start(), *range.end() + 1 - *range.start())?;
593 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
594 ref_buffer.resize(buffer.len(), T::default())?;
595 Ok(Self {
596 slice,
597 start_index: *range.start(),
598 buffer: ref_buffer,
599 })
600 }
601
602 fn new_range_to_inclusive(buffer: &BufferVecStatic<T>, range: RangeToInclusive<usize>) -> Result<Self, GLCoreError> {
603 let slice = buffer.get_slice_of_data(0, range.end + 1)?;
604 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
605 ref_buffer.resize(buffer.len(), T::default())?;
606 Ok(Self {
607 slice,
608 start_index: 0,
609 buffer: ref_buffer,
610 })
611 }
612}
613
614impl<T> BufferVecSliceRefMut<T>
615where
616 T: BufferVecItem {
617 fn as_mut(&mut self) -> &mut [T] {
618 self.slice.as_mut()
619 }
620
621 fn new_range(buffer: &mut BufferVecStatic<T>, range: Range<usize>) -> Result<Self, GLCoreError> {
622 let slice = buffer.get_slice_of_data(range.start, range.end - range.start)?;
623 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
624 ref_buffer.resize(buffer.len(), T::default())?;
625 Ok(Self {
626 slice,
627 start_index: range.start,
628 buffer: ref_buffer,
629 })
630 }
631
632 fn new_range_from(buffer: &mut BufferVecStatic<T>, range: RangeFrom<usize>) -> Result<Self, GLCoreError> {
633 let slice = buffer.get_slice_of_data(range.start, buffer.len() - range.start)?;
634 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
635 ref_buffer.resize(buffer.len(), T::default())?;
636 Ok(Self {
637 slice,
638 start_index: range.start,
639 buffer: ref_buffer,
640 })
641 }
642
643 fn new_range_to(buffer: &mut BufferVecStatic<T>, range: RangeTo<usize>) -> Result<Self, GLCoreError> {
644 let slice = buffer.get_slice_of_data(0, range.end)?;
645 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
646 ref_buffer.resize(buffer.len(), T::default())?;
647 Ok(Self {
648 slice,
649 start_index: 0,
650 buffer: ref_buffer,
651 })
652 }
653
654 fn new_range_full(buffer: &mut BufferVecStatic<T>) -> Result<Self, GLCoreError> {
655 let slice = buffer.get_slice_of_data(0, buffer.len())?;
656 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
657 ref_buffer.resize(buffer.len(), T::default())?;
658 Ok(Self {
659 slice,
660 start_index: 0,
661 buffer: ref_buffer,
662 })
663 }
664
665 fn new_range_inclusive(buffer: &mut BufferVecStatic<T>, range: RangeInclusive<usize>) -> Result<Self, GLCoreError> {
666 let slice = buffer.get_slice_of_data(*range.start(), *range.end() + 1 - *range.start())?;
667 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
668 ref_buffer.resize(buffer.len(), T::default())?;
669 Ok(Self {
670 slice,
671 start_index: *range.start(),
672 buffer: ref_buffer,
673 })
674 }
675
676 fn new_range_to_inclusive(buffer: &mut BufferVecStatic<T>, range: RangeToInclusive<usize>) -> Result<Self, GLCoreError> {
677 let slice = buffer.get_slice_of_data(0, range.end + 1)?;
678 let mut ref_buffer = Box::new(BufferVecStatic::new(unsafe {Buffer::from_raw(buffer.glcore.clone(), buffer.get_name(), buffer.get_target())}?));
679 ref_buffer.resize(buffer.len(), T::default())?;
680 Ok(Self {
681 slice,
682 start_index: 0,
683 buffer: ref_buffer,
684 })
685 }
686}
687
688impl<T> Drop for BufferVecItemRefMut<T>
689where
690 T: BufferVecItem {
691 fn drop(&mut self) {
692 self.buffer.set(self.index, &self.item).unwrap();
693 unsafe {
694 let buffer = ManuallyDrop::take(&mut self.buffer.buffer);
695 buffer.to_raw();
696 }
697 }
698}
699
700impl<T> Drop for BufferVecSliceRefMut<T>
701where
702 T: BufferVecItem {
703 fn drop(&mut self) {
704 self.buffer.set_slice_of_data(self.start_index, self.slice.as_ref()).unwrap();
705 unsafe {
706 let buffer = ManuallyDrop::take(&mut self.buffer.buffer);
707 buffer.to_raw();
708 }
709 }
710}
711
712impl<T: BufferVecItem> From<BufferVecStatic<T>> for BufferVecDynamic<T> {
713 fn from(mut val: BufferVecStatic<T>) -> Self {
714 val.flush().unwrap();
715 BufferVecDynamic::new(val).unwrap()
716 }
717}
718
719impl<T: BufferVecItem> From<BufferVecDynamic<T>> for BufferVecStatic<T> {
720 fn from(mut val: BufferVecDynamic<T>) -> Self {
721 val.flush().unwrap();
722 val.buffer
723 }
724}
725
726impl<T: BufferVecItem> From<BufferVecDynamic<T>> for Buffer {
727 fn from(mut val: BufferVecDynamic<T>) -> Self {
728 unsafe {ManuallyDrop::take(&mut val.buffer.buffer)}
729 }
730}
731
732impl<T: BufferVecItem> From<Buffer> for BufferVecDynamic<T> {
733 fn from(val: Buffer) -> Self {
734 let ab: BufferVecStatic<T> = val.into();
735 ab.into()
736 }
737}
738
739impl<T: BufferVecItem> Index<usize> for BufferVecStatic<T> {
740 type Output = T;
741 fn index(&self, i: usize) -> &T {
742 let cache = unsafe{&mut *self.cache.get()};
743 *cache = BufferVecStaticCache::Item(BufferVecItemRef::new(self, i).unwrap());
744 cache.get_item()
745 }
746}
747
748impl<T: BufferVecItem> IndexMut<usize> for BufferVecStatic<T> {
749 fn index_mut(&mut self, i: usize) -> &mut T {
750 let cache = unsafe{&mut *self.cache.get()};
751 *cache = BufferVecStaticCache::ItemMut(BufferVecItemRefMut::new(self, i).unwrap());
752 cache.get_item_mut()
753 }
754}
755
756impl<T: BufferVecItem> Index<Range<usize>> for BufferVecStatic<T> {
757 type Output = [T];
758 fn index(&self, r: Range<usize>) -> &[T] {
759 let cache = unsafe{&mut *self.cache.get()};
760 *cache = BufferVecStaticCache::Slice(BufferVecSliceRef::new_range(self, r).unwrap());
761 cache.get_slice()
762 }
763}
764
765impl<T: BufferVecItem> IndexMut<Range<usize>> for BufferVecStatic<T> {
766 fn index_mut(&mut self, r: Range<usize>) -> &mut [T] {
767 let cache = unsafe{&mut *self.cache.get()};
768 *cache = BufferVecStaticCache::SliceMut(BufferVecSliceRefMut::new_range(self, r).unwrap());
769 cache.get_slice_mut()
770 }
771}
772
773impl<T: BufferVecItem> Index<RangeFrom<usize>> for BufferVecStatic<T> {
774 type Output = [T];
775 fn index(&self, r: RangeFrom<usize>) -> &[T] {
776 let cache = unsafe{&mut *self.cache.get()};
777 *cache = BufferVecStaticCache::Slice(BufferVecSliceRef::new_range_from(self, r).unwrap());
778 cache.get_slice()
779 }
780}
781
782impl<T: BufferVecItem> IndexMut<RangeFrom<usize>> for BufferVecStatic<T> {
783 fn index_mut(&mut self, r: RangeFrom<usize>) -> &mut [T] {
784 let cache = unsafe{&mut *self.cache.get()};
785 *cache = BufferVecStaticCache::SliceMut(BufferVecSliceRefMut::new_range_from(self, r).unwrap());
786 cache.get_slice_mut()
787 }
788}
789
790impl<T: BufferVecItem> Index<RangeTo<usize>> for BufferVecStatic<T> {
791 type Output = [T];
792 fn index(&self, r: RangeTo<usize>) -> &[T] {
793 let cache = unsafe{&mut *self.cache.get()};
794 *cache = BufferVecStaticCache::Slice(BufferVecSliceRef::new_range_to(self, r).unwrap());
795 cache.get_slice()
796 }
797}
798
799impl<T: BufferVecItem> IndexMut<RangeTo<usize>> for BufferVecStatic<T> {
800 fn index_mut(&mut self, r: RangeTo<usize>) -> &mut [T] {
801 let cache = unsafe{&mut *self.cache.get()};
802 *cache = BufferVecStaticCache::SliceMut(BufferVecSliceRefMut::new_range_to(self, r).unwrap());
803 cache.get_slice_mut()
804 }
805}
806
807impl<T: BufferVecItem> Index<RangeFull> for BufferVecStatic<T> {
808 type Output = [T];
809 fn index(&self, _: RangeFull) -> &[T] {
810 let cache = unsafe{&mut *self.cache.get()};
811 *cache = BufferVecStaticCache::Slice(BufferVecSliceRef::new_range_full(self).unwrap());
812 cache.get_slice()
813 }
814}
815
816impl<T: BufferVecItem> IndexMut<RangeFull> for BufferVecStatic<T> {
817 fn index_mut(&mut self, _: RangeFull) -> &mut [T] {
818 let cache = unsafe{&mut *self.cache.get()};
819 *cache = BufferVecStaticCache::SliceMut(BufferVecSliceRefMut::new_range_full(self).unwrap());
820 cache.get_slice_mut()
821 }
822}
823
824impl<T: BufferVecItem> Index<RangeInclusive<usize>> for BufferVecStatic<T> {
825 type Output = [T];
826 fn index(&self, r: RangeInclusive<usize>) -> &[T] {
827 let cache = unsafe{&mut *self.cache.get()};
828 *cache = BufferVecStaticCache::Slice(BufferVecSliceRef::new_range_inclusive(self, r).unwrap());
829 cache.get_slice()
830 }
831}
832
833impl<T: BufferVecItem> IndexMut<RangeInclusive<usize>> for BufferVecStatic<T> {
834 fn index_mut(&mut self, r: RangeInclusive<usize>) -> &mut [T] {
835 let cache = unsafe{&mut *self.cache.get()};
836 *cache = BufferVecStaticCache::SliceMut(BufferVecSliceRefMut::new_range_inclusive(self, r).unwrap());
837 cache.get_slice_mut()
838 }
839}
840
841impl<T: BufferVecItem> Index<RangeToInclusive<usize>> for BufferVecStatic<T> {
842 type Output = [T];
843 fn index(&self, r: RangeToInclusive<usize>) -> &[T] {
844 let cache = unsafe{&mut *self.cache.get()};
845 *cache = BufferVecStaticCache::Slice(BufferVecSliceRef::new_range_to_inclusive(self, r).unwrap());
846 cache.get_slice()
847 }
848}
849
850impl<T: BufferVecItem> IndexMut<RangeToInclusive<usize>> for BufferVecStatic<T> {
851 fn index_mut(&mut self, r: RangeToInclusive<usize>) -> &mut [T] {
852 let cache = unsafe{&mut *self.cache.get()};
853 *cache = BufferVecStaticCache::SliceMut(BufferVecSliceRefMut::new_range_to_inclusive(self, r).unwrap());
854 cache.get_slice_mut()
855 }
856}
857
858impl<T: BufferVecItem> Index<usize> for BufferVecDynamic<T> {
859 type Output = T;
860 fn index(&self, i: usize) -> &T {
861 &self.cache[i]
862 }
863}
864
865impl<T: BufferVecItem> IndexMut<usize> for BufferVecDynamic<T> {
866 fn index_mut(&mut self, i: usize) -> &mut T {
867 self.cache_modified = true;
868 self.cache_modified_bitmap.set(i, true);
869 &mut self.cache[i]
870 }
871}
872
873impl<T: BufferVecItem> Index<Range<usize>> for BufferVecDynamic<T> {
874 type Output = [T];
875 fn index(&self, r: Range<usize>) -> &[T] {
876 &self.cache[r]
877 }
878}
879
880impl<T: BufferVecItem> IndexMut<Range<usize>> for BufferVecDynamic<T> {
881 fn index_mut(&mut self, r: Range<usize>) -> &mut [T] {
882 self.cache_modified = true;
883 for i in r.clone() {
884 self.cache_modified_bitmap.set(i, true);
885 }
886 &mut self.cache[r]
887 }
888}
889
890impl<T: BufferVecItem> Index<RangeFrom<usize>> for BufferVecDynamic<T> {
891 type Output = [T];
892 fn index(&self, r: RangeFrom<usize>) -> &[T] {
893 &self.cache[r]
894 }
895}
896
897impl<T: BufferVecItem> IndexMut<RangeFrom<usize>> for BufferVecDynamic<T> {
898 fn index_mut(&mut self, r: RangeFrom<usize>) -> &mut [T] {
899 self.cache_modified = true;
900 for i in r.clone() {
901 self.cache_modified_bitmap.set(i, true);
902 }
903 &mut self.cache[r]
904 }
905}
906
907impl<T: BufferVecItem> Index<RangeTo<usize>> for BufferVecDynamic<T> {
908 type Output = [T];
909 fn index(&self, r: RangeTo<usize>) -> &[T] {
910 &self.cache[r]
911 }
912}
913
914impl<T: BufferVecItem> IndexMut<RangeTo<usize>> for BufferVecDynamic<T> {
915 fn index_mut(&mut self, r: RangeTo<usize>) -> &mut [T] {
916 self.cache_modified = true;
917 for i in 0..r.end {
918 self.cache_modified_bitmap.set(i, true);
919 }
920 &mut self.cache[r]
921 }
922}
923
924impl<T: BufferVecItem> Index<RangeFull> for BufferVecDynamic<T> {
925 type Output = [T];
926 fn index(&self, _: RangeFull) -> &[T] {
927 &self.cache[..]
928 }
929}
930
931impl<T: BufferVecItem> IndexMut<RangeFull> for BufferVecDynamic<T> {
932 fn index_mut(&mut self, _: RangeFull) -> &mut [T] {
933 self.cache_modified = true;
934 for i in 0..self.num_items {
935 self.cache_modified_bitmap.set(i, true);
936 }
937 &mut self.cache[..]
938 }
939}
940
941impl<T: BufferVecItem> Index<RangeInclusive<usize>> for BufferVecDynamic<T> {
942 type Output = [T];
943 fn index(&self, r: RangeInclusive<usize>) -> &[T] {
944 &self.cache[r]
945 }
946}
947
948impl<T: BufferVecItem> IndexMut<RangeInclusive<usize>> for BufferVecDynamic<T> {
949 fn index_mut(&mut self, r: RangeInclusive<usize>) -> &mut [T] {
950 self.cache_modified = true;
951 for i in r.clone() {
952 self.cache_modified_bitmap.set(i, true);
953 }
954 &mut self.cache[r]
955 }
956}
957
958impl<T: BufferVecItem> Index<RangeToInclusive<usize>> for BufferVecDynamic<T> {
959 type Output = [T];
960 fn index(&self, r: RangeToInclusive<usize>) -> &[T] {
961 &self.cache[r]
962 }
963}
964
965impl<T: BufferVecItem> IndexMut<RangeToInclusive<usize>> for BufferVecDynamic<T> {
966 fn index_mut(&mut self, r: RangeToInclusive<usize>) -> &mut [T] {
967 self.cache_modified = true;
968 for i in 0..=r.end {
969 self.cache_modified_bitmap.set(i, true);
970 }
971 &mut self.cache[r]
972 }
973}