1impl<E:Clone> Clone for FileVec<E>{
2 fn clone(&self)->Self{
3 let mut result=FileVec::new();
4
5 result.extend_from_slice(&self);
6 result.set_persistent(self.persistent);
7 result
8 }
9 fn clone_from(&mut self,other:&Self){
10 self.clear();
11 self.extend_from_slice(other);
12 }
13}
14impl<E:Clone> From<&[E]> for FileVec<E>{
15 fn from(slice:&[E])->Self{slice.iter().cloned().collect()}
16}
17impl<E,const N:usize> FileVec<[E;N]>{
18 pub fn into_flattened(mut self)->FileVec<E>{
20 FileVec{
21 len:mem::take(&mut self.len).checked_mul(N).unwrap(),
22 map:self.map.take(),
23 path:self.path.take(),
24 persistent:mem::take(&mut self.persistent),
25 phantom:PhantomData
26 }
27 }
28}
29impl<E,const N:usize> From<[E;N]> for FileVec<E>{
30 fn from(slice:[E;N])->Self{slice.into_iter().collect()}
31}
32impl<E> AsMut<[E]> for FileVec<E>{
33 fn as_mut(&mut self)->&mut [E]{self.as_mut_slice()}
34}
35impl<E> AsMut<Self> for FileVec<E>{
36 fn as_mut(&mut self)->&mut Self{self}
37}
38impl<E> AsRef<[E]> for FileVec<E>{
39 fn as_ref(&self)->&[E]{self.as_slice()}
40}
41impl<E> AsRef<Self> for FileVec<E>{
42 fn as_ref(&self)->&Self{self}
43}
44impl<E> Borrow<[E]> for FileVec<E>{
45 fn borrow(&self)->&[E]{self.as_slice()}
46}
47impl<E> BorrowMut<[E]> for FileVec<E>{
48 fn borrow_mut(&mut self)->&mut [E]{self.as_mut_slice()}
49}
50impl<E> Deref for FileVec<E>{
51 fn deref(&self)->&Self::Target{self.as_slice()}
52 type Target=[E];
53}
54impl<E> DerefMut for FileVec<E>{
55 fn deref_mut(&mut self)->&mut Self::Target{self.as_mut_slice()}
56}
57impl<E> Default for FileVec<E>{
58 fn default()->Self{Self::new()}
59}
60impl<E> Drop for FileVec<E>{
61 fn drop(&mut self){self.close()}
62}
63impl<E> Extend<E> for FileVec<E>{
64 fn extend<I:IntoIterator<Item=E>>(&mut self,iter:I){ let iter=iter.into_iter();
66 let unknownreservelimit=1_00000_00000/mem::size_of::<E>();
67 let (low,high)=iter.size_hint();
69 let mut cap=self.len;
70 let mut p=0 as *mut E;
71 let res=if Some(low)==high{low}else{high.unwrap_or(low).min(unknownreservelimit)}.max(1);
72
73 iter.for_each(|x|unsafe{ if cap<=self.len{ self.reserve(res);
76 cap=self.capacity();
78 p=self.as_mut_ptr().add(self.len);
79 }
80 ptr::write(p,x);
82 p=p.add(1);
83 self.len+=1;
84 });
85 }
86}
87impl<E> FileVec<E>{
88 pub (crate) unsafe fn len_mut(&mut self)->&mut usize{&mut self.len}
90 pub fn append(&mut self,other:&mut Self){
92 assert_ne!(self.as_mut_ptr(),other.as_mut_ptr());
93 self.reserve(other.len);
94 unsafe{ptr::copy_nonoverlapping(other.as_mut_ptr() as *const E,self.as_mut_ptr().add(self.len),other.len)}
96 self.len+=other.len;
97 other.len=0;
98 }
99 pub fn as_mut_slice(&mut self)->&mut [E]{
101 let bytes:&mut [u8]=if let Some(m)=&mut self.map{m}else{return &mut []};
102 let items=unsafe{ bytes.align_to_mut::<MaybeUninit<E>>()
104 };
105 assert_eq!(items.0.len(),0);
107 assert_eq!(items.2.len(),0);
108
109 unsafe{ mem::transmute(&mut items.1[..self.len])
111 }
112 }
113 pub fn as_mut_ptr(&mut self)->*mut E{self.as_mut_slice().as_mut_ptr()}
115 pub fn as_ptr(&self)->*const E{self.as_slice().as_ptr()}
117 pub fn as_slice(&self)->&[E]{
119 let bytes:&[u8]=if let Some(m)=&self.map{m}else{return &[]};
120 let items=unsafe{ bytes.align_to::<MaybeUninit<E>>()
122 };
123 assert_eq!(items.0.len(),0);
125 assert_eq!(items.2.len(),0);
126
127 unsafe{ mem::transmute(&items.1[..self.len])
129 }
130 }
131 pub fn capacity(&self)->usize{self.map.as_ref().map(|x|x.len()/mem::size_of::<E>()).unwrap_or(0)}
133 pub fn clear(&mut self){
135 if mem::needs_drop::<E>(){
136 let p=self.as_mut_ptr();
137 while self.len>0{ self.len-=1;
139 unsafe{ptr::drop_in_place(p.add(self.len))}
140 }
141 }else{
142 self.len=0;
143 }
144 }
145 pub fn close(&mut self){ let l=self.len;
148 let path=if let Some(p)=self.path.take(){p}else{return};
149 self.clear();
151 self.map=None;
153 if self.persistent{
155 let file=OpenOptions::new().create(true).write(true).open(&path).unwrap();
156 file.set_len((mem::size_of::<E>()*l).try_into().unwrap()).unwrap();
157 }else{
158 fs::remove_file(&path).unwrap();
159 }
160 }
161 pub fn dedup(&mut self) where E:PartialEq{self.dedup_by(|x,y|x==y)}
163 pub fn dedup_by<F:FnMut(&mut E,&mut E)->bool>(&mut self,mut f:F){
165 let remaining=Cell::new(self.len);
166 if remaining.get()<=1{return}else{remaining.update(|r|r-1)}
167 let l:Cell<usize> =Cell::new(1);let r:Cell<*mut E>=Cell::new(unsafe{self.as_mut_ptr().add(1)});
170 let w:Cell<*mut E>=Cell::new(r.get());
171 let finalize=FinalizeDrop::new(||unsafe{
173 let remainder=remaining.get();
174 if remainder>0{ ptr::copy(r.get(),w.get(),remainder);
176 l.update(|l|l+remainder);
177 }
178 self.len=l.get();
179 }); while remaining.get()>0{
181 unsafe{ let current=&mut *r.get();
183 let previous=&mut *r.get().sub(1);
184 let f=f(current,previous);
186 r.update(|r|r.add(1));
188 remaining.update(|r|r-1);
189 if f{
191 ptr::drop_in_place(r.get());
192 }else{
193 ptr::copy(current,w.get(),1);
194 l.update(|l|l+1);
196 w.update(|w|w.add(1));
197 }
198 }
199 }
200 mem::drop(finalize);
202 }
203 pub fn dedup_by_key<F:FnMut(&mut E)->K,K:PartialEq>(&mut self,mut f:F){self.dedup_by(|x,y|f(x)==f(y))}
205 pub fn drain<R:RangeBounds<usize>>(&mut self,range:R)->Drain<'_,E>{Drain::new(self,range)}
207 pub fn extend_from_slice(&mut self,slice:&[E]) where E:Clone{
209 let l=slice.len();
210 self.reserve(l);
211 let mut p=unsafe{self.as_mut_ptr().add(self.len)};
213 let mut s=slice.as_ptr();
214 for _ in 0..l{
216 unsafe{
217 ptr::write(p,s.as_ref().unwrap_unchecked().clone());
218 self.len+=1;
219 p=p.add(1);
221 s=s.add(1);
222 }
223 }
224 }
225 pub fn extend_from_within<R:RangeBounds<usize>>(&mut self,range:R) where E:Clone{
227 let begin=range.start_bound();
228 let end=range.end_bound();
229 let start=match begin{ Bound::Excluded(&n)=>n.saturating_add(1),
231 Bound::Included(&n)=>n,
232 Bound::Unbounded =>0
233 };
234 let stop= match end{
235 Bound::Excluded(&n)=>n,
236 Bound::Included(&n)=>n.saturating_add(1),
237 Bound::Unbounded =>self.len
238 };
239 assert!(start<=self.len);
241 assert!(start<=stop);
242 assert!(stop <=self.len);
243 self.reserve(stop-start);
245 let v=self.as_mut_ptr();
246 let mut p=unsafe{v.add(self.len)};
248 let mut s=unsafe{v.add(start)};
249 for _ in 0..stop-start{
251 unsafe{
252 ptr::write(p,s.as_ref().unwrap_unchecked().clone());
253 self.len+=1;
254 p=p.add(1);
256 s=s.add(1);
257 }
258 }
259 }
260 pub fn extract_if<R:RangeBounds<usize>,F:FnMut(&mut E)->bool>(&mut self,r:R,f:F)->ExtractIf<'_,E,F>{ExtractIf::new(self,r,f)}
262 pub fn from_fn<F:FnMut(usize)->E>(length:usize,f:F)->Self{(0..length).map(f).collect()}
264 pub fn insert(&mut self,index:usize,item:E){
266 self.insert_mut(index,item);
267 }
268 pub fn insert_mut(&mut self,index:usize,item:E)->&mut E{
270 assert!(index<=self.len);
271 self.reserve(1);
272 unsafe{ let p=self.as_mut_ptr().add(index);
274 ptr::copy(p,p.add(1),self.len-index);
276 ptr::write(p,item);
277 self.len+=1;
279 p.as_mut().unwrap_unchecked()
280 }
281 }
282 pub fn into_chunks<const N:usize>(mut self)->FileVec<[E;N]>{
284 self.truncate(self.len-self.len%N);
285
286 FileVec{
287 len:mem::take(&mut self.len)/N,
288 map:self.map.take(),
289 path:self.path.take(),
290 persistent:mem::take(&mut self.persistent),
291 phantom:PhantomData
292 }
293 }
294 pub fn is_empty(&self)->bool{self.len==0}
296 pub fn is_persistent(&self)->bool{self.persistent}
298 pub fn len(&self)->usize{self.len}
300 pub fn new()->Self{
302 assert_eq!(page_size::get()%mem::align_of::<E>(),0);
303 assert_ne!(mem::size_of::<E>(),0);
304
305 Self{
306 len:0,
307 map:None,
308 path:None,
309 persistent:false,
310 phantom:PhantomData
311 }
312 }
313 pub fn path(&self)->Option<&Path>{self.path.as_deref()}
315 pub fn pop(&mut self)->Option<E>{
317 let l=self.len;
318 if l==0{return None}
319
320 self.len=l-1;
321 Some(unsafe{ptr::read(self.as_mut_ptr().add(l-1))})
322 }
323 pub fn pop_if<F:FnOnce(&mut E)->bool>(&mut self,f:F)->Option<E>{
325 let l=self.len;
326 if l==0{return None}
327
328 unsafe{
329 let p=self.as_mut_ptr().add(l-1);
330 if !f(p.as_mut().unwrap_unchecked()){return None}
331
332 self.len=l-1;
333 Some(ptr::read(p))
334 }
335 }
336 pub fn push(&mut self,item:E){
338 self.reserve(1);
339 unsafe{ptr::write(self.as_mut_ptr().add(self.len),item)}
341
342 self.len+=1;
343 }
344 pub fn push_mut(&mut self,item:E)->&mut E{
346 self.reserve(1);
347 unsafe{
348 let p=self.as_mut_ptr().add(self.len);
349 ptr::write(p,item);
350
351 self.len+=1;
352 p.as_mut().unwrap_unchecked()
353 }
354 }
355 pub fn push_within_capacity(&mut self,item:E)->Result<&mut E,E>{
357 if self.len()<self.capacity(){
358 Ok(unsafe{
359 let p=self.as_mut_ptr().add(self.len);
360 ptr::write(p,item);
361
362 self.len+=1;
363 p.as_mut().unwrap_unchecked()
364 })
365 }else{
366 Err(item)
367 }
368 }
369 pub fn remove(&mut self,index:usize)->E{
371 let l=self.len;
372 assert!(index<l);
373
374 unsafe{
375 let p=self.as_mut_ptr().add(index);
376 let item=ptr::read(p);
377
378 self.len=l-1;
379 ptr::copy(p.add(1),p,l-index);
380 item
381 }
382 }
383 pub fn remove_range<R:RangeBounds<usize>>(&mut self,range:R){
385 Drain::new(self,range);
386 }
387 pub fn reserve(&mut self,additional:usize){
389 let required=additional.saturating_add(self.len());
390 assert!(required<isize::MAX as usize);
391 let newcapacity=if required<=self.capacity(){return}else{required.next_power_of_two()};
393 if self.path.is_none(){ let uid:u64=rand::random();
395 self.path=Some(format!(".file-vec_{uid:x}").into());
396 }
397 self.map=None;
399 let file=OpenOptions::new().create(true).read(true).write(true).open(self.path.as_ref().unwrap()).unwrap();
400 file.set_len((mem::size_of::<E>()*newcapacity).try_into().unwrap()).unwrap();
402 unsafe{self.map=Some(MmapMut::map_mut(&file).unwrap())}
403 }
404 pub fn reserve_exect(&mut self,additional:usize){
406 let required=additional.saturating_add(self.len());
407 assert!(required<isize::MAX as usize);
408 let newcapacity=if required<=self.capacity(){return}else{required};
410 if self.path.is_none(){ let uid:u64=rand::random();
412 self.path=Some(format!(".file-vec_{uid:x}").into());
413 }
414 self.map=None;
416 let file=OpenOptions::new().create(true).read(true).write(true).open(self.path.as_ref().unwrap()).unwrap();
417 file.set_len((mem::size_of::<E>()*newcapacity).try_into().unwrap()).unwrap();
419 unsafe{self.map=Some(MmapMut::map_mut(&file).unwrap())}
420 }
421 pub fn resize(&mut self,len:usize,val:E) where E:Clone{
423 if len<self.len{return self.truncate(len)}else if len==self.len{return};
424
425 self.extend((self.len..len-1).map(|_|val.clone()));
426 self.push(val);
427 }
428 pub fn resize_with<F:FnMut()->E>(&mut self,len:usize,mut f:F){
430 if len<self.len{return self.truncate(len)}else if len==self.len{return};
431 self.extend((self.len..len).map(|_|f()))
432 }
433 pub fn retain<F:FnMut(&E)->bool>(&mut self,mut f:F){self.retain_mut(|x|f(x))}
435 pub fn retain_mut<F:FnMut(&mut E)->bool>(&mut self,mut f:F){
437 let remaining=Cell::new(self.len);
438 if remaining.get()==0{return}
439 let l:Cell<usize> =Cell::new(0);
441 let r:Cell<*mut E>=Cell::new(self.as_mut_ptr());
442 let w:Cell<*mut E>=Cell::new(r.get());
443 let finalize=FinalizeDrop::new(||unsafe{
445 let remainder=remaining.get();
446 if remainder>0{ ptr::copy(r.get(),w.get(),remainder);
448 l.update(|l|l+remainder);
449 }
450 self.len=l.get();
451 }); while remaining.get()>0{
453 unsafe{ let current=&mut *r.get();
455 let f=f(current);
456 r.update(|r|r.add(1));
458 remaining.update(|r|r-1);
459 if f{
461 ptr::copy(current,w.get(),1);
462 l.update(|l|l+1);
464 w.update(|w|w.add(1));
465 }else{
466 ptr::drop_in_place(r.get());
467 }
468 }
469 }
470 mem::drop(finalize);
472 }
473 pub fn set_persistent(&mut self,persistent:bool){self.persistent=persistent}
475 pub fn shrink_to(&mut self,mut mincap:usize){
477 if mincap>=self.capacity(){return}
478 if mincap<self.len{mincap=self.len}
479 let path=if let Some(p)=self.path.take(){p}else{return};
481 self.map=None;
482 let file=OpenOptions::new().create(true).write(true).open(&path).unwrap();
484 file.set_len((mem::size_of::<E>()*mincap).try_into().unwrap()).unwrap();
485 self.path=Some(path);
487 unsafe{self.map=Some(MmapMut::map_mut(&file).unwrap())}
488 }
489 pub fn shrink_to_fit(&mut self){self.shrink_to(self.len)}
491 pub fn spare_capacity_mut(&mut self)->&mut [MaybeUninit<E>]{self.split_at_spare_mut().1}
493 pub fn split_at_spare_mut(&mut self)->(&mut [E],&mut [MaybeUninit<E>]){
495 let bytes:&mut [u8]=if let Some(m)=&mut self.map{m}else{return (&mut [],&mut [])};
496 let items=unsafe{ bytes.align_to_mut::<MaybeUninit<E>>()
498 };
499 assert_eq!(items.0.len(),0);
501 assert_eq!(items.2.len(),0);
502
503 unsafe{ mem::transmute(items.1.split_at_mut(self.len))
505 }
506 }
507 pub fn split_off(&mut self,a:usize)->Self{self.drain(a..).collect()}
509 pub fn swap_remove(&mut self,index:usize)->E{
511 assert!(index<self.len);
512
513 let last=self.pop().unwrap();
514 mem::replace(&mut self[index],last)
515 }
516 pub fn truncate(&mut self,n:usize){
518 if mem::needs_drop::<E>(){
519 unsafe{
520 let p=self.as_mut_ptr();
521 while n<self.len{
522 self.len-=1;
523 ptr::drop_in_place(p.add(self.len));
524 }
525 }
526 }else{
527 self.len=self.len.min(n);
528 }
529 }
530 pub fn with_capacity(cap:usize)->Self{
532 let mut result=Self::new();
533
534 result.reserve(cap);
535 result
536 }
537 pub unsafe fn open<P:AsRef<Path>>(path:P)->IOResult<Self>{
539 assert_eq!(page_size::get()%mem::align_of::<E>(),0);
540 assert_ne!(mem::size_of::<E>(),0);
541
542 let path:PathBuf=path.as_ref().into();
543 let persistent=true;
544 let phantom=PhantomData;
545
546 let map=match OpenOptions::new().read(true).write(true).open(&path){
547 Err(e)=>if e.kind()==IOErrorKind::NotFound{
548 None
549 }else{
550 return Err(e)
551 },
552 Ok(file)=>Some(unsafe{MmapMut::map_mut(&file)?}),
553 };
554
555 let len=map.as_ref().map(|x|x.len()/mem::size_of::<E>()).unwrap_or(0);
556 let path=Some(path);
557
558 Ok(Self{len,map,path,persistent,phantom})
559 }
560 pub unsafe fn set_len(&mut self,len:usize){self.len=len}
562 pub unsafe fn set_path<P:AsRef<Path>>(&mut self,path:P)->IOResult<()>{
564 if let Some(p)=self.path(){
565 if p==path.as_ref(){return Ok(())}
566 }
567
568 let old=self.path.clone();
569 let persistent=self.is_persistent();
570 self.set_persistent(true);
572 self.close();
573 if let Some(old)=old{
575 fs::copy(&old,&path)?;
576 if !persistent{fs::remove_file(old)?}
577 }
578 *self=unsafe{Self::open(path)?};
580 self.set_persistent(persistent);
581
582 Ok(())
583 }
584}
585impl<E> FromIterator<E> for FileVec<E>{
586 fn from_iter<I:IntoIterator<Item=E>>(collection:I)->Self{
587 let mut result=Self::new();
588
589 result.extend(collection);
590 result
591 }
592}
593
594#[derive(Debug)]
595pub struct FileVec<E>{len:usize,map:Option<MmapMut>,path:Option<PathBuf>,persistent:bool,phantom:PhantomData<E>}
597
598use crate::{
599 FinalizeDrop,iter::{Drain,ExtractIf}
600};
601use memmap2::MmapMut;
602use std::{
603 borrow::{Borrow,BorrowMut},cell::Cell,cmp::PartialEq,fs::{OpenOptions,self},io::{ErrorKind as IOErrorKind,Result as IOResult},iter::FromIterator,marker::PhantomData,mem::{MaybeUninit,self},ops::{Bound,Deref,DerefMut,RangeBounds},path::{PathBuf,Path},ptr
604};