Library zoo_std.dynarray_1__code
Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.array.
Require Import zoo_std.int.
Require Import zoo.options.
Notation "'dynarray_1ู size'" := (
in_type "zoo_std.dynarray_1.t" 0
)(in custom zoo_field
).
Notation "'dynarray_1ู data'" := (
in_type "zoo_std.dynarray_1.t" 1
)(in custom zoo_field
).
Definition dynarray_1ู create : val :=
๐ณ๐๐ป โฝ โ
{ 0, arrayู create () }.
Definition dynarray_1ู make : val :=
๐ณ๐๐ป "sz" "v" โ
{ "sz", arrayู unsafe_make "sz" "v" }.
Definition dynarray_1ู initi : val :=
๐ณ๐๐ป "sz" "fn" โ
{ "sz", arrayู unsafe_initi "sz" "fn" }.
Definition dynarray_1ู size : val :=
๐ณ๐๐ป "t" โ
"t".{dynarray_1ู size}.
Definition dynarray_1ู capacity : val :=
๐ณ๐๐ป "t" โ
arrayู size "t".{dynarray_1ู data}.
Definition dynarray_1ู is_empty : val :=
๐ณ๐๐ป "t" โ
dynarray_1ู size "t" == 0.
Definition dynarray_1ู get : val :=
๐ณ๐๐ป "t" "i" โ
arrayู unsafe_get "t".{dynarray_1ู data} "i".
Definition dynarray_1ู set : val :=
๐ณ๐๐ป "t" "i" "v" โ
arrayู unsafe_set "t".{dynarray_1ู data} "i" "v".
Definition dynarray_1ู next_capacity : val :=
๐ณ๐๐ป "n" โ
intู max
8
๐ถ๐ณ "n" โค 512 ๐๐ต๐ฒ๐ป (
2 ร "n"
) ๐ฒ๐น๐๐ฒ (
"n" + "n" ๐พ๐๐ผ๐ 2
).
Definition dynarray_1ู reserve : val :=
๐ณ๐๐ป "t" "n" โ
๐น๐ฒ๐ "data" = "t".{dynarray_1ู data} ๐ถ๐ป
๐น๐ฒ๐ "cap" = arrayู size "data" ๐ถ๐ป
๐ถ๐ณ "cap" < "n" ๐๐ต๐ฒ๐ป (
๐น๐ฒ๐ "new_cap" =
intู max "n" (dynarray_1ู next_capacity "cap")
๐ถ๐ป
๐น๐ฒ๐ "new_data" = arrayู unsafe_alloc "new_cap" ๐ถ๐ป
arrayู unsafe_copy_slice "data" 0 "new_data" 0 "t".{dynarray_1ู size} โฎ
"t" <-{dynarray_1ู data} "new_data"
).
Definition dynarray_1ู reserve_extra : val :=
๐ณ๐๐ป "t" "n" โ
dynarray_1ู reserve "t" ("t".{dynarray_1ู size} + "n").
Definition dynarray_1ู grow : val :=
๐ณ๐๐ป "t" "sz" "v" โ
๐น๐ฒ๐ "old_sz" = "t".{dynarray_1ู size} ๐ถ๐ป
๐ถ๐ณ "old_sz" < "sz" ๐๐ต๐ฒ๐ป (
dynarray_1ู reserve "t" "sz" โฎ
arrayู unsafe_fill_slice
"t".{dynarray_1ู data}
"old_sz"
("sz" - "old_sz")
"v" โฎ
"t" <-{dynarray_1ู size} "sz"
).
Definition dynarray_1ู push : val :=
๐ณ๐๐ป "t" "v" โ
dynarray_1ู reserve_extra "t" 1 โฎ
๐น๐ฒ๐ "sz" = "t".{dynarray_1ู size} ๐ถ๐ป
"t" <-{dynarray_1ู size} "sz" + 1 โฎ
arrayู unsafe_set "t".{dynarray_1ู data} "sz" "v".
Definition dynarray_1ู pop : val :=
๐ณ๐๐ป "t" โ
๐น๐ฒ๐ "sz" = "t".{dynarray_1ู size} - 1 ๐ถ๐ป
"t" <-{dynarray_1ู size} "sz" โฎ
๐น๐ฒ๐ "data" = "t".{dynarray_1ู data} ๐ถ๐ป
๐น๐ฒ๐ "v" = arrayู unsafe_get "data" "sz" ๐ถ๐ป
arrayู unsafe_set "data" "sz" () โฎ
"v".
Definition dynarray_1ู fit_capacity : val :=
๐ณ๐๐ป "t" โ
๐น๐ฒ๐ "sz" = "t".{dynarray_1ู size} ๐ถ๐ป
๐น๐ฒ๐ "data" = "t".{dynarray_1ู data} ๐ถ๐ป
๐ถ๐ณ "sz" != arrayู size "data" ๐๐ต๐ฒ๐ป (
"t" <-{dynarray_1ู data} arrayู unsafe_shrink "data" "sz"
).
Definition dynarray_1ู reset : val :=
๐ณ๐๐ป "t" โ
"t" <-{dynarray_1ู size} 0 โฎ
"t" <-{dynarray_1ู data} arrayู create ().
Definition dynarray_1ู iteri : val :=
๐ณ๐๐ป "fn" "t" โ
arrayู unsafe_iteri_slice
"fn"
"t".{dynarray_1ู data}
0
"t".{dynarray_1ู size}.
Definition dynarray_1ู iter : val :=
๐ณ๐๐ป "fn" โ
dynarray_1ู iteri (๐ณ๐๐ป "_i" โ "fn").
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.array.
Require Import zoo_std.int.
Require Import zoo.options.
Notation "'dynarray_1ู size'" := (
in_type "zoo_std.dynarray_1.t" 0
)(in custom zoo_field
).
Notation "'dynarray_1ู data'" := (
in_type "zoo_std.dynarray_1.t" 1
)(in custom zoo_field
).
Definition dynarray_1ู create : val :=
๐ณ๐๐ป โฝ โ
{ 0, arrayู create () }.
Definition dynarray_1ู make : val :=
๐ณ๐๐ป "sz" "v" โ
{ "sz", arrayู unsafe_make "sz" "v" }.
Definition dynarray_1ู initi : val :=
๐ณ๐๐ป "sz" "fn" โ
{ "sz", arrayู unsafe_initi "sz" "fn" }.
Definition dynarray_1ู size : val :=
๐ณ๐๐ป "t" โ
"t".{dynarray_1ู size}.
Definition dynarray_1ู capacity : val :=
๐ณ๐๐ป "t" โ
arrayู size "t".{dynarray_1ู data}.
Definition dynarray_1ู is_empty : val :=
๐ณ๐๐ป "t" โ
dynarray_1ู size "t" == 0.
Definition dynarray_1ู get : val :=
๐ณ๐๐ป "t" "i" โ
arrayู unsafe_get "t".{dynarray_1ู data} "i".
Definition dynarray_1ู set : val :=
๐ณ๐๐ป "t" "i" "v" โ
arrayู unsafe_set "t".{dynarray_1ู data} "i" "v".
Definition dynarray_1ู next_capacity : val :=
๐ณ๐๐ป "n" โ
intู max
8
๐ถ๐ณ "n" โค 512 ๐๐ต๐ฒ๐ป (
2 ร "n"
) ๐ฒ๐น๐๐ฒ (
"n" + "n" ๐พ๐๐ผ๐ 2
).
Definition dynarray_1ู reserve : val :=
๐ณ๐๐ป "t" "n" โ
๐น๐ฒ๐ "data" = "t".{dynarray_1ู data} ๐ถ๐ป
๐น๐ฒ๐ "cap" = arrayู size "data" ๐ถ๐ป
๐ถ๐ณ "cap" < "n" ๐๐ต๐ฒ๐ป (
๐น๐ฒ๐ "new_cap" =
intู max "n" (dynarray_1ู next_capacity "cap")
๐ถ๐ป
๐น๐ฒ๐ "new_data" = arrayู unsafe_alloc "new_cap" ๐ถ๐ป
arrayู unsafe_copy_slice "data" 0 "new_data" 0 "t".{dynarray_1ู size} โฎ
"t" <-{dynarray_1ู data} "new_data"
).
Definition dynarray_1ู reserve_extra : val :=
๐ณ๐๐ป "t" "n" โ
dynarray_1ู reserve "t" ("t".{dynarray_1ู size} + "n").
Definition dynarray_1ู grow : val :=
๐ณ๐๐ป "t" "sz" "v" โ
๐น๐ฒ๐ "old_sz" = "t".{dynarray_1ู size} ๐ถ๐ป
๐ถ๐ณ "old_sz" < "sz" ๐๐ต๐ฒ๐ป (
dynarray_1ู reserve "t" "sz" โฎ
arrayู unsafe_fill_slice
"t".{dynarray_1ู data}
"old_sz"
("sz" - "old_sz")
"v" โฎ
"t" <-{dynarray_1ู size} "sz"
).
Definition dynarray_1ู push : val :=
๐ณ๐๐ป "t" "v" โ
dynarray_1ู reserve_extra "t" 1 โฎ
๐น๐ฒ๐ "sz" = "t".{dynarray_1ู size} ๐ถ๐ป
"t" <-{dynarray_1ู size} "sz" + 1 โฎ
arrayู unsafe_set "t".{dynarray_1ู data} "sz" "v".
Definition dynarray_1ู pop : val :=
๐ณ๐๐ป "t" โ
๐น๐ฒ๐ "sz" = "t".{dynarray_1ู size} - 1 ๐ถ๐ป
"t" <-{dynarray_1ู size} "sz" โฎ
๐น๐ฒ๐ "data" = "t".{dynarray_1ู data} ๐ถ๐ป
๐น๐ฒ๐ "v" = arrayู unsafe_get "data" "sz" ๐ถ๐ป
arrayู unsafe_set "data" "sz" () โฎ
"v".
Definition dynarray_1ู fit_capacity : val :=
๐ณ๐๐ป "t" โ
๐น๐ฒ๐ "sz" = "t".{dynarray_1ู size} ๐ถ๐ป
๐น๐ฒ๐ "data" = "t".{dynarray_1ู data} ๐ถ๐ป
๐ถ๐ณ "sz" != arrayู size "data" ๐๐ต๐ฒ๐ป (
"t" <-{dynarray_1ู data} arrayู unsafe_shrink "data" "sz"
).
Definition dynarray_1ู reset : val :=
๐ณ๐๐ป "t" โ
"t" <-{dynarray_1ู size} 0 โฎ
"t" <-{dynarray_1ู data} arrayู create ().
Definition dynarray_1ู iteri : val :=
๐ณ๐๐ป "fn" "t" โ
arrayู unsafe_iteri_slice
"fn"
"t".{dynarray_1ู data}
0
"t".{dynarray_1ู size}.
Definition dynarray_1ู iter : val :=
๐ณ๐๐ป "fn" โ
dynarray_1ู iteri (๐ณ๐๐ป "_i" โ "fn").