@@ -3159,7 +3159,21 @@ impl<T, A: Allocator> Vec<T, A> {
31593159 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
31603160 #[ track_caller]
31613161 pub fn insert ( & mut self , index : usize , element : T )
3162- //@ req true;
3162+ /*@
3163+ req thread_token(?t) &*& t == currentThread &*&
3164+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
3165+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
3166+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _) &*&
3167+ own(t)(element) &*&
3168+ if index > length {
3169+ ens false
3170+ } else {
3171+ ens thread_token(t) &*&
3172+ *self |-> ?self1 &*& Vec(t, self1, ?alloc_id1, ?ptr1, ?capacity1, length + 1) &*&
3173+ array_at_lft(alloc_id1.lft, ptr1, length + 1, ?vs1) &*& foreach(vs1, own(t)) &*&
3174+ array_at_lft_(alloc_id1.lft, ptr1 + length + 1, capacity1 - (length + 1), _)
3175+ };
3176+ @*/
31633177 //@ ens true;
31643178 /*@ safety_proof { assume(false); } @*/
31653179 {
@@ -3260,7 +3274,21 @@ impl<T, A: Allocator> Vec<T, A> {
32603274 #[ track_caller]
32613275 #[ rustc_confusables( "delete" , "take" ) ]
32623276 pub fn remove ( & mut self , index : usize ) -> T
3263- //@ req true;
3277+ /*@
3278+ req thread_token(?t) &*& t == currentThread &*&
3279+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
3280+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
3281+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _) &*&
3282+ if index >= length {
3283+ ens false
3284+ } else {
3285+ ens thread_token(t) &*&
3286+ *self |-> ?self1 &*& Vec(t, self1, alloc_id, ptr, capacity, length - 1) &*&
3287+ array_at_lft(alloc_id.lft, ptr, length - 1, ?vs1) &*& foreach(vs1, own(t)) &*&
3288+ array_at_lft_(alloc_id.lft, ptr + length - 1, capacity - (length - 1), _) &*&
3289+ result == nth(index, vs)
3290+ };
3291+ @*/
32643292 //@ ens true;
32653293 /*@
32663294 safety_proof {
@@ -3523,11 +3551,22 @@ impl<T, A: Allocator> Vec<T, A> {
35233551 pub fn dedup_by < F > ( & mut self , mut same_bucket : F )
35243552 where
35253553 F : FnMut ( & mut T , & mut T ) -> bool ,
3526- //@ req true;
3527- //@ ens true;
3554+ /*@
3555+ req thread_token(?t) &*& t == currentThread &*&
3556+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
3557+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
3558+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _);
3559+ @*/
3560+ /*@
3561+ ens thread_token(t) &*&
3562+ *self |-> ?self1 &*& Vec(t, self1, alloc_id, ptr, capacity, ?new_length) &*&
3563+ new_length <= length &*&
3564+ array_at_lft(alloc_id.lft, ptr, new_length, ?vs1) &*& foreach(vs1, own(t)) &*&
3565+ array_at_lft_(alloc_id.lft, ptr + new_length, capacity - new_length, _);
3566+ @*/
35283567 /*@
35293568 safety_proof {
3530- assume(false);
3569+ assume(false); // TODO: needs closure/FnMut support in VeriFast
35313570 }
35323571 @*/
35333572 {
@@ -3680,9 +3719,24 @@ impl<T, A: Allocator> Vec<T, A> {
36803719 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
36813720 #[ rustc_confusables( "push_back" , "put" , "append" ) ]
36823721 pub fn push ( & mut self , value : T )
3683- //@ req true;
3684- //@ ens true;
3685- /*@ safety_proof { assume(false); } @*/
3722+ /*@
3723+ req thread_token(?t) &*& t == currentThread &*&
3724+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
3725+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
3726+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _) &*&
3727+ own(t)(value);
3728+ @*/
3729+ /*@
3730+ ens thread_token(t) &*&
3731+ *self |-> ?self1 &*& Vec(t, self1, ?alloc_id1, ?ptr1, ?capacity1, length + 1) &*&
3732+ array_at_lft(alloc_id1.lft, ptr1, length + 1, ?vs1) &*& foreach(vs1, own(t)) &*&
3733+ array_at_lft_(alloc_id1.lft, ptr1 + length + 1, capacity1 - (length + 1), _);
3734+ @*/
3735+ /*@
3736+ safety_proof {
3737+ assume(false); // TODO: needs push_mut spec + grow_one spec chain
3738+ }
3739+ @*/
36863740 {
36873741 //@ assume(false);
36883742 let _ = self . push_mut ( value) ;
@@ -3831,11 +3885,29 @@ impl<T, A: Allocator> Vec<T, A> {
38313885 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
38323886
38333887 pub fn pop ( & mut self ) -> Option < T >
3834- //@ req true;
3835- //@ ens true;
3888+ /*@
3889+ req thread_token(?t) &*& t == currentThread &*&
3890+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
3891+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
3892+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _);
3893+ @*/
3894+ /*@
3895+ ens thread_token(t) &*&
3896+ if length == 0 {
3897+ *self |-> self0 &*& Vec(t, self0, alloc_id, ptr, capacity, 0) &*&
3898+ array_at_lft(alloc_id.lft, ptr, 0, nil) &*& foreach(nil, own(t)) &*&
3899+ array_at_lft_(alloc_id.lft, ptr, capacity, _) &*&
3900+ result == std::option::Option::None
3901+ } else {
3902+ *self |-> ?self1 &*& Vec(t, self1, alloc_id, ptr, capacity, length - 1) &*&
3903+ array_at_lft(alloc_id.lft, ptr, length - 1, take(length - 1, vs)) &*& foreach(take(length - 1, vs), own(t)) &*&
3904+ array_at_lft_(alloc_id.lft, ptr + length - 1, capacity - (length - 1), _) &*&
3905+ result == std::option::Option::Some(nth(length - 1, vs))
3906+ };
3907+ @*/
38363908 /*@
38373909 safety_proof {
3838- assume(false);
3910+ assume(false); // TODO: shared ref management for as_ptr() + len()
38393911 }
38403912 @*/
38413913 {
@@ -3916,8 +3988,23 @@ impl<T, A: Allocator> Vec<T, A> {
39163988 #[ inline]
39173989 #[ stable( feature = "append" , since = "1.4.0" ) ]
39183990 pub fn append ( & mut self , other : & mut Self )
3919- //@ req true;
3920- //@ ens true;
3991+ /*@
3992+ req thread_token(?t) &*& t == currentThread &*&
3993+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
3994+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
3995+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _) &*&
3996+ *other |-> ?other0 &*& Vec(t, other0, ?alloc_id2, ?ptr2, ?capacity2, ?length2) &*&
3997+ array_at_lft(alloc_id2.lft, ptr2, length2, ?vs2) &*& foreach(vs2, own(t)) &*&
3998+ array_at_lft_(alloc_id2.lft, ptr2 + length2, capacity2 - length2, _);
3999+ @*/
4000+ /*@
4001+ ens thread_token(t) &*&
4002+ *self |-> ?self1 &*& Vec(t, self1, ?alloc_id1, ?ptr1, ?capacity1, length + length2) &*&
4003+ array_at_lft(alloc_id1.lft, ptr1, length + length2, ?vs1) &*& foreach(vs1, own(t)) &*&
4004+ array_at_lft_(alloc_id1.lft, ptr1 + length + length2, capacity1 - (length + length2), _) &*&
4005+ *other |-> ?other1 &*& Vec(t, other1, alloc_id2, ptr2, capacity2, 0) &*&
4006+ array_at_lft_(alloc_id2.lft, ptr2, capacity2, _);
4007+ @*/
39214008 /*@ safety_proof { assume(false); } @*/
39224009 {
39234010 //@ assume(false);
@@ -3930,10 +4017,7 @@ impl<T, A: Allocator> Vec<T, A> {
39304017 /// Appends elements to `self` from other buffer.
39314018 #[ inline]
39324019 unsafe fn append_elements ( & mut self , other : * const [ T ] )
3933- //@ req true;
3934- //@ ens true;
39354020 {
3936- //@ assume(false);
39374021 let count = other. len ( ) ;
39384022 self . reserve ( count) ;
39394023 let len = self . len ( ) ;
@@ -4021,11 +4105,20 @@ impl<T, A: Allocator> Vec<T, A> {
40214105 #[ inline]
40224106 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
40234107 pub fn clear ( & mut self )
4024- //@ req true;
4025- //@ ens true;
4108+ /*@
4109+ req thread_token(?t) &*& t == currentThread &*&
4110+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
4111+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
4112+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _);
4113+ @*/
4114+ /*@
4115+ ens thread_token(t) &*&
4116+ *self |-> ?self1 &*& Vec(t, self1, alloc_id, ptr, capacity, 0) &*&
4117+ array_at_lft_(alloc_id.lft, ptr, capacity, _);
4118+ @*/
40264119 /*@
40274120 safety_proof {
4028- assume(false);
4121+ assume(false); // TODO: needs as_mut_slice + drop_in_place specs
40294122 }
40304123 @*/
40314124 {
@@ -4135,7 +4228,21 @@ impl<T, A: Allocator> Vec<T, A> {
41354228 pub fn split_off ( & mut self , at : usize ) -> Self
41364229 where
41374230 A : Clone ,
4138- //@ req true;
4231+ /*@
4232+ req thread_token(?t) &*& t == currentThread &*&
4233+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
4234+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
4235+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _) &*&
4236+ if at > length {
4237+ ens false
4238+ } else {
4239+ ens thread_token(t) &*&
4240+ *self |-> ?self1 &*& Vec(t, self1, alloc_id, ptr, capacity, at) &*&
4241+ array_at_lft(alloc_id.lft, ptr, at, take(at, vs)) &*& foreach(take(at, vs), own(t)) &*&
4242+ array_at_lft_(alloc_id.lft, ptr + at, capacity - at, _) &*&
4243+ <Vec<T, A>>.own(t, result)
4244+ };
4245+ @*/
41394246 //@ ens true;
41404247 /*@ safety_proof { assume(false); } @*/
41414248 {
@@ -5225,11 +5332,19 @@ impl<T: Ord, A: Allocator> Ord for Vec<T, A> {
52255332#[ stable( feature = "rust1" , since = "1.0.0" ) ]
52265333unsafe impl < #[ may_dangle] T , A : Allocator > Drop for Vec < T , A > {
52275334 fn drop ( & mut self )
5228- //@ req true;
5229- //@ ens true;
5335+ /*@
5336+ req thread_token(?t) &*& t == currentThread &*&
5337+ *self |-> ?self0 &*& Vec(t, self0, ?alloc_id, ?ptr, ?capacity, ?length) &*&
5338+ array_at_lft(alloc_id.lft, ptr, length, ?vs) &*& foreach(vs, own(t)) &*&
5339+ array_at_lft_(alloc_id.lft, ptr + length, capacity - length, _);
5340+ @*/
5341+ /*@
5342+ ens thread_token(t) &*&
5343+ *self |-> ?self1;
5344+ @*/
52305345 /*@
52315346 safety_proof {
5232- assume(false);
5347+ assume(false); // TODO: needs drop_in_place + RawVec dealloc
52335348 }
52345349 @*/
52355350 {
0 commit comments