1use core::alloc::Layout;
2use core::any::TypeId;
3use core::fmt::{Debug, Formatter};
4use core::marker::PhantomData;
5use core::mem::{ManuallyDrop, MaybeUninit};
6use core::ops::{Deref, DerefMut, Range, RangeBounds};
7use core::ptr::NonNull;
8use core::{fmt, ptr, slice};
9use core::slice::{from_raw_parts, from_raw_parts_mut};
10use crate::{AnyVecTyped, into_range, mem, ops, assert_types_equal};
11use crate::any_value::{AnyValue, AnyValueSizeless, Unknown};
12use crate::any_vec_raw::{AnyVecRaw, DropFn};
13use crate::ops::{TempValue, Remove, SwapRemove, remove, swap_remove, Pop, pop};
14use crate::ops::{Drain, Splice, drain, splice};
15use crate::any_vec::traits::{None};
16use crate::clone_type::{CloneFn, CloneFnTrait, CloneType};
17use crate::element::{ElementPointer, ElementMut, ElementRef};
18use crate::any_vec_ptr::AnyVecPtr;
19use crate::iter::{Iter, IterMut, IterRef};
20use crate::mem::{Mem, MemBuilder, MemBuilderSizeable, MemRawParts, MemResizable};
21use crate::traits::{Cloneable, Trait};
22
23pub mod traits{
35 pub trait Trait: 'static + crate::clone_type::CloneType{}
40 impl Trait for dyn None {}
41 impl Trait for dyn Sync{}
42 impl Trait for dyn Send{}
43 impl Trait for dyn Sync + Send{}
44 impl Trait for dyn Cloneable{}
45 impl Trait for dyn Cloneable + Send{}
46 impl Trait for dyn Cloneable + Sync{}
47 impl Trait for dyn Cloneable + Send+ Sync{}
48
49 pub trait None {}
51
52 pub use core::marker::Sync;
53
54 pub use core::marker::Send;
55
56 pub trait Cloneable{}
58}
59
60pub trait SatisfyTraits<Traits: ?Sized>: CloneFnTrait<Traits> {}
84impl<T> SatisfyTraits<dyn None> for T{}
85impl<T: Clone> SatisfyTraits<dyn Cloneable> for T{}
86impl<T: Send> SatisfyTraits<dyn Send> for T{}
87impl<T: Sync> SatisfyTraits<dyn Sync> for T{}
88impl<T: Send + Sync> SatisfyTraits<dyn Send + Sync> for T{}
89impl<T: Clone + Send> SatisfyTraits<dyn Cloneable + Send> for T{}
90impl<T: Clone + Sync> SatisfyTraits<dyn Cloneable + Sync> for T{}
91impl<T: Clone + Send + Sync> SatisfyTraits<dyn Cloneable + Send + Sync> for T{}
92
93pub struct RawParts<M: MemBuilder>
99where
100 M::Mem: MemRawParts
101{
102 pub mem_builder: M,
103 pub mem_handle: <M::Mem as MemRawParts>::Handle,
104 pub capacity: usize,
105 pub len: usize,
106 pub element_layout: Layout,
107 pub element_typeid: TypeId,
108 pub element_drop: Option<DropFn>,
109
110 pub element_clone: CloneFn,
112}
113
114impl<M: MemBuilder> Clone for RawParts<M>
115where
116 M::Mem: MemRawParts,
117 <M::Mem as MemRawParts>::Handle: Clone
118{
119 #[inline]
120 fn clone(&self) -> Self {
121 Self{
122 mem_builder: self.mem_builder.clone(),
123 mem_handle: self.mem_handle.clone(),
124 capacity: self.capacity,
125 len: self.capacity,
126 element_layout: self.element_layout,
127 element_typeid: self.element_typeid,
128 element_drop: self.element_drop,
129 element_clone: self.element_clone,
130 }
131 }
132}
133
134pub struct AnyVec<Traits: ?Sized + Trait = dyn None, M: MemBuilder = mem::Default>
149{
150 pub(crate) raw: AnyVecRaw<M>,
151 clone_fn: <Traits as CloneType>::Type, phantom: PhantomData<Traits>
153}
154
155impl<Traits: ?Sized + Trait, M: MemBuilder> AnyVec<Traits, M>
156{
157 #[inline]
158 fn build<T: SatisfyTraits<Traits>>(raw: AnyVecRaw<M>) -> Self {
159 let clone_fn = <T as CloneFnTrait<Traits>>::CLONE_FN;
160 Self{
161 raw,
162 clone_fn: <Traits as CloneType>::new(clone_fn),
163 phantom: PhantomData
164 }
165 }
166
167 #[inline]
174 #[must_use]
175 pub fn new<T: 'static>() -> Self
176 where
177 T: SatisfyTraits<Traits>,
178 M: Default
179 {
180 Self::new_in::<T>(Default::default())
181 }
182
183 #[inline]
188 #[must_use]
189 pub fn new_in<T: 'static>(mut mem_builder: M) -> Self
190 where T: SatisfyTraits<Traits>
191 {
192 let mem = mem_builder.build(Layout::new::<T>());
193 let raw = AnyVecRaw::new::<T>(mem_builder, mem);
194 Self::build::<T>(raw)
195 }
196
197 #[inline]
205 #[must_use]
206 pub fn with_capacity<T: 'static>(capacity: usize) -> Self
207 where
208 T: SatisfyTraits<Traits>,
209 M: MemBuilderSizeable,
210 M: Default
211 {
212 Self::with_capacity_in::<T>(capacity, Default::default())
213 }
214
215 #[inline]
223 #[must_use]
224 pub fn with_capacity_in<T: 'static>(capacity: usize, mut mem_builder: M) -> Self
225 where
226 T: SatisfyTraits<Traits>,
227 M: MemBuilderSizeable
228 {
229 let mem = mem_builder.build_with_size(Layout::new::<T>(), capacity);
230 let raw = AnyVecRaw::new::<T>(mem_builder, mem);
231 Self::build::<T>(raw)
232 }
233
234 #[inline]
236 #[must_use]
237 pub fn into_raw_parts(self) -> RawParts<M>
238 where
239 M::Mem: MemRawParts
240 {
241 let this = ManuallyDrop::new(self);
242
243 let mem_builder = unsafe{ ptr::read(&this.raw.mem_builder) };
244 let mem = unsafe{ ptr::read(&this.raw.mem) };
245 let (mem_handle, element_layout, capacity) = mem.into_raw_parts();
246 RawParts{
247 mem_builder,
248 mem_handle,
249 capacity,
250 len: this.raw.len,
251 element_layout,
252 element_typeid: this.raw.type_id,
253 element_drop: this.raw.drop_fn,
254 element_clone: this.clone_fn()
255 }
256 }
257
258 #[inline]
273 #[must_use]
274 pub unsafe fn from_raw_parts(raw_parts: RawParts<M>) -> Self
275 where
276 M::Mem: MemRawParts
277 {
278 Self{
279 raw: AnyVecRaw{
280 mem_builder: raw_parts.mem_builder,
281 mem: MemRawParts::from_raw_parts(
282 raw_parts.mem_handle,
283 raw_parts.element_layout,
284 raw_parts.capacity
285 ),
286 len: raw_parts.len,
287 type_id: raw_parts.element_typeid,
288 drop_fn: raw_parts.element_drop
289 },
290 clone_fn: <Traits as CloneType>::new(raw_parts.element_clone),
291 phantom: PhantomData
292 }
293 }
294
295 #[inline]
300 #[must_use]
301 pub fn clone_empty(&self) -> Self {
302 Self {
303 raw: self.raw.clone_empty(),
304 clone_fn: self.clone_fn,
305 phantom: PhantomData
306 }
307 }
308
309 #[inline]
328 #[must_use]
329 pub fn clone_empty_in<NewM: MemBuilder>(&self, mem_builder: NewM) -> AnyVec<Traits, NewM> {
330 AnyVec {
331 raw: self.raw.clone_empty_in(mem_builder),
332 clone_fn: self.clone_fn,
333 phantom: PhantomData
334 }
335 }
336
337 #[inline]
338 pub(crate) fn clone_fn(&self) -> CloneFn{
339 <Traits as CloneType>::get(self.clone_fn)
340 }
341
342 #[inline]
354 pub fn reserve(&mut self, additional: usize)
355 where M::Mem: MemResizable
356 {
357 self.raw.reserve(additional)
358 }
359
360 #[inline]
378 pub fn reserve_exact(&mut self, additional: usize)
379 where M::Mem: MemResizable
380 {
381 self.raw.reserve_exact(additional)
382 }
383
384 #[inline]
393 pub fn shrink_to_fit(&mut self)
394 where M::Mem: MemResizable
395 {
396 self.raw.shrink_to_fit()
397 }
398
399 #[inline]
412 pub fn shrink_to(&mut self, min_capacity: usize)
413 where M::Mem: MemResizable
414 {
415 self.raw.shrink_to(min_capacity)
416 }
417
418 #[inline]
419 pub unsafe fn set_len(&mut self, new_len: usize) {
420 self.raw.set_len(new_len);
421 }
422
423 #[inline]
426 pub fn downcast_ref<T: 'static>(&self) -> Option<AnyVecRef<'_, T, M>> {
427 if self.element_typeid() == TypeId::of::<T>() {
428 unsafe{ Some(self.downcast_ref_unchecked()) }
429 } else {
430 None
431 }
432 }
433
434 #[inline]
441 pub unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> AnyVecRef<'_, T, M> {
442 AnyVecRef(AnyVecTyped::new(NonNull::from(&self.raw)))
443 }
444
445 #[inline]
448 pub fn downcast_mut<T: 'static>(&mut self) -> Option<AnyVecMut<'_, T, M>> {
449 if self.element_typeid() == TypeId::of::<T>() {
450 unsafe{ Some(self.downcast_mut_unchecked()) }
451 } else {
452 None
453 }
454 }
455
456 #[inline]
463 pub unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> AnyVecMut<'_, T, M> {
464 AnyVecMut(AnyVecTyped::new(NonNull::from(&mut self.raw)))
465 }
466
467 #[inline]
468 pub fn as_bytes(&self) -> &[u8] {
469 unsafe{from_raw_parts(
470 self.raw.mem.as_ptr(),
471 self.len() * self.element_layout().size()
472 )}
473 }
474
475 #[inline]
476 pub fn as_bytes_mut(&mut self) -> &mut [u8]{
477 unsafe{from_raw_parts_mut(
478 self.raw.mem.as_mut_ptr(),
479 self.len() * self.element_layout().size()
480 )}
481 }
482
483 #[inline]
484 pub fn spare_bytes_mut(&mut self) -> &mut [MaybeUninit<u8>]{
485 unsafe{from_raw_parts_mut(
486 self.raw.mem.as_mut_ptr().add(self.len()) as *mut MaybeUninit<u8>,
487 (self.capacity() - self.len()) * self.element_layout().size()
488 )}
489 }
490
491 #[inline]
492 pub fn iter(&self) -> IterRef<'_, Traits, M>{
493 Iter::new(AnyVecPtr::from(self), 0, self.len())
494 }
495
496 #[inline]
497 pub fn iter_mut(&mut self) -> IterMut<'_, Traits, M>{
498 let len = self.len();
499 Iter::new(AnyVecPtr::from(self), 0, len)
500 }
501
502 #[inline]
508 pub fn at(&self, index: usize) -> ElementRef<'_, Traits, M>{
509 self.get(index).unwrap()
510 }
511
512 #[inline]
513 pub fn get(&self, index: usize) -> Option<ElementRef<'_, Traits, M>>{
514 if index < self.len(){
515 Some(unsafe{ self.get_unchecked(index) })
516 } else {
517 None
518 }
519 }
520
521 #[inline]
522 pub unsafe fn get_unchecked(&self, index: usize) -> ElementRef<'_, Traits, M>{
523 let element_ptr = self.raw.get_unchecked(index) as *mut u8;
524 ElementRef(
525 ManuallyDrop::new(ElementPointer::new(
526 AnyVecPtr::from(self),
527 NonNull::new_unchecked(element_ptr)
528 ))
529 )
530 }
531
532 #[inline]
538 pub fn at_mut(&mut self, index: usize) -> ElementMut<'_, Traits, M>{
539 self.get_mut(index).unwrap()
540 }
541
542 #[inline]
543 pub fn get_mut(&mut self, index: usize) -> Option<ElementMut<'_, Traits, M>>{
544 if index < self.len(){
545 Some(unsafe{ self.get_unchecked_mut(index) })
546 } else {
547 None
548 }
549 }
550
551 #[inline]
552 pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> ElementMut<'_, Traits, M> {
553 let element_ptr = self.raw.get_unchecked_mut(index);
554 ElementMut(
555 ManuallyDrop::new(ElementPointer::new(
556 AnyVecPtr::from(self),
557 NonNull::new_unchecked(element_ptr)
558 ))
559 )
560 }
561
562 #[inline]
568 pub fn insert<V: AnyValue>(&mut self, index: usize, value: V) {
569 self.raw.type_check(&value);
570 unsafe{
571 self.raw.insert_unchecked(index, value);
572 }
573 }
574
575 #[inline]
588 pub unsafe fn insert_unchecked<V: AnyValueSizeless>(&mut self, index: usize, value: V) {
589 self.raw.insert_unchecked(index, value);
590 }
591
592 #[inline]
597 pub fn push<V: AnyValue>(&mut self, value: V) {
598 self.raw.type_check(&value);
599 unsafe{
600 self.raw.push_unchecked(value);
601 }
602 }
603
604 #[inline]
616 pub unsafe fn push_unchecked<V: AnyValueSizeless>(&mut self, value: V) {
617 self.raw.push_unchecked(value);
618 }
619
620 #[inline]
628 pub fn pop(&mut self) -> Option<Pop<'_, Traits, M>> {
629 if self.is_empty(){
630 None
631 } else {
632 Some(TempValue::new(
633 pop::Pop::new(AnyVecPtr::from(self))
634 ))
635 }
636 }
637
638 #[inline]
651 pub fn remove(&mut self, index: usize) -> Remove<'_, Traits, M> {
652 self.raw.index_check(index);
653 TempValue::new(remove::Remove::new(
654 AnyVecPtr::from(self),
655 index
656 ))
657 }
658
659 #[inline]
672 pub fn swap_remove(&mut self, index: usize) -> SwapRemove<'_, Traits, M> {
673 self.raw.index_check(index);
674 TempValue::new(swap_remove::SwapRemove::new(
675 AnyVecPtr::from(self),
676 index
677 ))
678 }
679
680 pub fn append<OtherTraits, OtherM>(
687 &mut self, other: &mut AnyVec<OtherTraits, OtherM>
688 ) where
689 OtherTraits: ?Sized + Trait,
690 OtherM: MemBuilder
691 {
692 assert_types_equal(other.element_typeid(), self.element_typeid());
693 unsafe{
694 self.raw.append_unchecked::<Unknown, _>(&mut other.raw);
695 }
696 }
697
698 #[inline]
718 pub fn drain(&mut self, range: impl RangeBounds<usize>) -> Drain<'_, Traits, M> {
719 let Range{start, end} = into_range(self.len(), range);
720 ops::Iter(drain::Drain::new(
721 AnyVecPtr::from(self),
722 start,
723 end
724 ))
725 }
726
727 #[inline]
749 pub fn splice<I: IntoIterator>(&mut self, range: impl RangeBounds<usize>, replace_with: I)
750 -> Splice<'_, Traits, M, I::IntoIter>
751 where
752 I::IntoIter: ExactSizeIterator,
753 I::Item: AnyValue
754 {
755 let Range{start, end} = into_range(self.len(), range);
756 ops::Iter(splice::Splice::new(
757 AnyVecPtr::from(self),
758 start,
759 end,
760 replace_with.into_iter()
761 ))
762 }
763
764 #[inline]
765 pub fn clear(&mut self){
766 self.raw.clear()
767 }
768
769 #[inline]
771 pub fn element_typeid(&self) -> TypeId{
772 self.raw.type_id
773 }
774
775 #[inline]
777 pub fn element_layout(&self) -> Layout {
778 self.raw.element_layout()
779 }
780
781 #[inline]
786 pub fn element_drop(&self) -> Option<DropFn> {
787 self.raw.drop_fn
788 }
789
790 #[inline]
794 pub fn element_clone(&self) -> CloneFn
795 where
796 Traits: Cloneable
797 {
798 self.clone_fn()
799 }
800
801 #[inline]
802 pub fn len(&self) -> usize {
803 self.raw.len
804 }
805
806 #[inline]
807 pub fn is_empty(&self) -> bool {
808 self.len() == 0
809 }
810
811 #[inline]
812 pub fn capacity(&self) -> usize {
813 self.raw.capacity()
814 }
815}
816
817unsafe impl<Traits: ?Sized + Send + Trait, M: MemBuilder + Send> Send for AnyVec<Traits, M>
818 where M::Mem: Send
819{}
820unsafe impl<Traits: ?Sized + Sync + Trait, M: MemBuilder + Sync> Sync for AnyVec<Traits, M>
821 where M::Mem: Sync
822{}
823impl<Traits: ?Sized + Cloneable + Trait, M: MemBuilder> Clone for AnyVec<Traits, M>
824{
825 fn clone(&self) -> Self {
826 Self{
827 raw: unsafe{ self.raw.clone(self.clone_fn()) },
828 clone_fn: self.clone_fn,
829 phantom: PhantomData
830 }
831 }
832}
833
834impl<Traits, M, A> Extend<A> for AnyVec<Traits, M>
835where
836 Traits: ?Sized + Trait,
837 M: MemBuilder,
838 A: AnyValue,
839{
840 fn extend<T: IntoIterator<Item=A>>(&mut self, iter: T) {
845 let iter = iter.into_iter();
846 self.raw.reserve(iter.size_hint().0);
847 for v in iter {
848 self.push(v);
849 }
850 }
851}
852
853impl<Traits: ?Sized + Trait, M: MemBuilder> Debug for AnyVec<Traits, M>{
854 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
855 f.debug_struct("AnyVec")
856 .field("typeid", &self.element_typeid())
857 .field("len", &self.len())
858 .finish()
859 }
860}
861
862impl<'a, Traits: ?Sized + Trait, M: MemBuilder> IntoIterator for &'a AnyVec<Traits, M>{
863 type Item = ElementRef<'a, Traits, M>;
864 type IntoIter = IterRef<'a, Traits, M>;
865
866 #[inline]
867 fn into_iter(self) -> Self::IntoIter {
868 self.iter()
869 }
870}
871
872impl<'a, Traits: ?Sized + Trait, M: MemBuilder> IntoIterator for &'a mut AnyVec<Traits, M>{
873 type Item = ElementMut<'a, Traits, M>;
874 type IntoIter = IterMut<'a, Traits, M>;
875
876 #[inline]
877 fn into_iter(self) -> Self::IntoIter {
878 self.iter_mut()
879 }
880}
881
882pub struct AnyVecRef<'a, T: 'static, M: MemBuilder + 'a>(pub(crate) AnyVecTyped<'a, T, M>);
889impl<'a, T: 'static, M: MemBuilder + 'a> Clone for AnyVecRef<'a, T, M>{
890 #[inline]
891 fn clone(&self) -> Self {
892 Self(self.0.clone())
893 }
894}
895impl<'a, T: 'static, M: MemBuilder + 'a> Deref for AnyVecRef<'a, T, M>{
896 type Target = AnyVecTyped<'a, T, M>;
897
898 #[inline]
899 fn deref(&self) -> &Self::Target {
900 &self.0
901 }
902}
903impl<'a, T: 'static, M: MemBuilder + 'a> IntoIterator for AnyVecRef<'a, T, M>{
904 type Item = &'a T;
905 type IntoIter = slice::Iter<'a, T>;
906
907 #[inline]
908 fn into_iter(self) -> Self::IntoIter {
909 self.iter()
910 }
911}
912impl<'a, T: 'static + Debug, M: MemBuilder + 'a> Debug for AnyVecRef<'a, T, M>{
913 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
914 self.0.fmt(f)
915 }
916}
917
918pub struct AnyVecMut<'a, T: 'static, M: MemBuilder + 'a>(pub(crate) AnyVecTyped<'a, T, M>);
925impl<'a, T: 'static, M: MemBuilder + 'a> Deref for AnyVecMut<'a, T, M>{
926 type Target = AnyVecTyped<'a, T, M>;
927
928 #[inline]
929 fn deref(&self) -> &Self::Target {
930 &self.0
931 }
932}
933impl<'a, T: 'static, M: MemBuilder + 'a> DerefMut for AnyVecMut<'a, T, M>{
934 #[inline]
935 fn deref_mut(&mut self) -> &mut Self::Target {
936 &mut self.0
937 }
938}
939impl<'a, T: 'static, M: MemBuilder + 'a> IntoIterator for AnyVecMut<'a, T, M>{
940 type Item = &'a mut T;
941 type IntoIter = slice::IterMut<'a, T>;
942
943 #[inline]
944 fn into_iter(mut self) -> Self::IntoIter {
945 self.iter_mut()
946 }
947}
948impl<'a, T: 'static + Debug, M: MemBuilder + 'a> Debug for AnyVecMut<'a, T, M>{
949 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
950 self.0.fmt(f)
951 }
952}
953impl<'a, T: 'static, M: MemBuilder + 'a> Extend<T> for AnyVecMut<'a, T, M>{
954 #[inline]
955 fn extend<I: IntoIterator<Item=T>>(&mut self, iter: I) {
956 self.0.extend(iter)
957 }
958}