@@ -201,3 +201,88 @@ fn _extern_spec_i32_is_positive(x: i32) -> bool {
201201fn _extern_spec_i32_is_negative ( x : i32 ) -> bool {
202202 i32:: is_negative ( x)
203203}
204+
205+ #[ thrust:: extern_spec_fn]
206+ #[ thrust:: requires( true ) ]
207+ #[ thrust:: ensures( result. 1 == 0 ) ]
208+ fn _extern_spec_vec_new < T > ( ) -> Vec < T > {
209+ Vec :: < T > :: new ( )
210+ }
211+
212+ #[ thrust:: extern_spec_fn]
213+ #[ thrust:: requires( true ) ]
214+ #[ thrust:: ensures( ^vec == ( ( * vec) . 0 . store( ( * vec) . 1 , elem) , ( * vec) . 1 + 1 ) ) ]
215+ fn _extern_spec_vec_push < T > ( vec : & mut Vec < T > , elem : T ) {
216+ Vec :: push ( vec, elem)
217+ }
218+
219+ #[ thrust:: extern_spec_fn]
220+ #[ thrust:: requires( true ) ]
221+ #[ thrust:: ensures( result == ( * vec) . 1 ) ]
222+ fn _extern_spec_vec_len < T > ( vec : & Vec < T > ) -> usize {
223+ Vec :: len ( vec)
224+ }
225+
226+ #[ thrust:: extern_spec_fn]
227+ #[ thrust:: requires( index < ( * vec) . 1 ) ]
228+ #[ thrust:: ensures( * result == ( * vec) . 0 . select( index) ) ]
229+ fn _extern_spec_vec_index < T > ( vec : & Vec < T > , index : usize ) -> & T {
230+ <Vec < T > as std:: ops:: Index < usize > >:: index ( vec, index)
231+ }
232+
233+ #[ thrust:: extern_spec_fn]
234+ #[ thrust:: requires( index < ( * vec) . 1 ) ]
235+ #[ thrust:: ensures(
236+ * result == ( * vec) . 0 . select( index) &&
237+ ^result == ( ^vec) . 0 . select( index) &&
238+ ^vec == ( ( * vec) . 0 . store( index, ^result) , ( * vec) . 1 )
239+ ) ]
240+ fn _extern_spec_vec_index_mut < T > ( vec : & mut Vec < T > , index : usize ) -> & mut T {
241+ <Vec < T > as std:: ops:: IndexMut < usize > >:: index_mut ( vec, index)
242+ }
243+
244+ #[ thrust:: extern_spec_fn]
245+ #[ thrust:: requires( true ) ]
246+ #[ thrust:: ensures( ( ^vec) . 1 == 0 ) ]
247+ fn _extern_spec_vec_clear < T > ( vec : & mut Vec < T > ) {
248+ Vec :: clear ( vec)
249+ }
250+
251+ #[ thrust:: extern_spec_fn]
252+ #[ thrust:: requires( true ) ]
253+ #[ thrust:: ensures(
254+ (
255+ ( * vec) . 1 > 0 &&
256+ ( ^vec) . 1 == ( * vec) . 1 - 1 &&
257+ result == std:: option:: Option :: <T0 >:: Some ( ( * vec) . 0 . select( ( * vec) . 1 - 1 ) )
258+ ) || (
259+ ( * vec) . 1 == 0 &&
260+ ( ^vec) . 1 == 0 &&
261+ result == std:: option:: Option :: <T0 >:: None ( )
262+ )
263+ ) ]
264+ fn _extern_spec_vec_pop < T > ( vec : & mut Vec < T > ) -> Option < T > {
265+ Vec :: pop ( vec)
266+ }
267+
268+ #[ thrust:: extern_spec_fn]
269+ #[ thrust:: requires( true ) ]
270+ #[ thrust:: ensures( result == ( ( * vec) . 1 == 0 ) ) ]
271+ fn _extern_spec_vec_is_empty < T > ( vec : & Vec < T > ) -> bool {
272+ Vec :: is_empty ( vec)
273+ }
274+
275+ #[ thrust:: extern_spec_fn]
276+ #[ thrust:: requires( true ) ]
277+ #[ thrust:: ensures(
278+ (
279+ ( * vec) . 1 > len &&
280+ ^vec == ( ( * vec) . 0 , len)
281+ ) || (
282+ ( * vec) . 1 <= len &&
283+ ^vec == * vec
284+ )
285+ ) ]
286+ fn _extern_spec_vec_truncate < T > ( vec : & mut Vec < T > , len : usize ) {
287+ Vec :: truncate ( vec, len)
288+ }
0 commit comments