/* * An interface to arrays * * 15-122 Principles of Imperative Computation */ #use #use /* Interface */ typedef struct arr_header* arr_t; // typedef ______* arr_t; int arr_len(arr_t A) /*@requires A != NULL; @*/; arr_t arr_new(int limit) /*@requires 0 <= limit; @*/ /*@ensures \result != NULL; @*/ /*@ensures arr_len(\result) == limit; @*/; string arr_get(arr_t A, int i) /*@requires A != NULL; @*/ /*@requires 0 <= i && i < arr_len(A); @*/; void arr_set(arr_t A, int i, string x) /*@requires A != NULL; @*/ /*@requires 0 <= i && i < arr_len(A); @*/; /* Implementation */ typedef struct arr_header arr; struct arr_header { int limit; string[] data; }; bool is_arr_expected_length(string[] A, int length) { //@assert \length(A) == length; return true; } bool is_arr(arr* AH) { return AH != NULL && is_arr_expected_length(AH->data, AH->limit); } int arr_len(arr* A) //@requires is_arr(A); //@ensures \result == \length(A->data); { return A->limit; } string arr_get(arr* A, int i) //@requires is_arr(A); //@requires 0 <= i && i < arr_len(A); { return A->data[i]; } void arr_set(arr* A, int i, string x) //@requires is_arr(A); //@requires 0 <= i && i < arr_len(A); //@ensures is_arr(A); { A->data[i] = x; } arr* arr_new(int limit) //@requires 0 <= limit; //@ensures is_arr(\result); //@ensures arr_len(\result) == limit; { arr* A = alloc(arr); A->data = alloc_array(string, limit); A->limit = limit; return A; }