Library zoo_std.inf_array__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_std.mutex.
Require Import zoo.options.
Notation "'inf_arrayู data'" := (
in_type "zoo_std.inf_array.t" 0
)(in custom zoo_field
).
Notation "'inf_arrayู default'" := (
in_type "zoo_std.inf_array.t" 1
)(in custom zoo_field
).
Notation "'inf_arrayู mutex'" := (
in_type "zoo_std.inf_array.t" 2
)(in custom zoo_field
).
Definition inf_arrayู create : val :=
๐ณ๐๐ป "default" โ
๐น๐ฒ๐ "data" = arrayู create () ๐ถ๐ป
๐น๐ฒ๐ "mutex" = mutexู create () ๐ถ๐ป
{ "data", "default", "mutex" }.
Definition inf_arrayู next_capacity : val :=
๐ณ๐๐ป "n" โ
intู max
8
๐ถ๐ณ "n" โค 512 ๐๐ต๐ฒ๐ป (
2 ร "n"
) ๐ฒ๐น๐๐ฒ (
"n" + "n" ๐พ๐๐ผ๐ 2
).
Definition inf_arrayู reserve : val :=
๐ณ๐๐ป "t" "n" โ
๐น๐ฒ๐ "data" = "t".{inf_arrayู data} ๐ถ๐ป
๐น๐ฒ๐ "cap" = arrayู size "data" ๐ถ๐ป
๐ถ๐ณ "cap" < "n" ๐๐ต๐ฒ๐ป (
๐น๐ฒ๐ "cap" =
intู max "n" (inf_arrayู next_capacity "cap")
๐ถ๐ป
๐น๐ฒ๐ "data" =
arrayู unsafe_grow "data" "cap" "t".{inf_arrayู default}
๐ถ๐ป
"t" <-{inf_arrayู data} "data"
).
Definition inf_arrayู get : val :=
๐ณ๐๐ป "t" "i" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
๐น๐ฒ๐ "data" = "t".{inf_arrayู data} ๐ถ๐ป
๐ถ๐ณ "i" < arrayู size "data" ๐๐ต๐ฒ๐ป (
arrayู unsafe_get "data" "i"
) ๐ฒ๐น๐๐ฒ (
"t".{inf_arrayู default}
)).
Definition inf_arrayู update : val :=
๐ณ๐๐ป "t" "i" "fn" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "v" =
arrayู unsafe_get "t".{inf_arrayู data} "i"
๐ถ๐ป
arrayู unsafe_set "t".{inf_arrayู data} "i" ("fn" "v") โฎ
"v").
Definition inf_arrayู xchg : val :=
๐ณ๐๐ป "t" "i" "v" โ
inf_arrayู update "t" "i" (๐ณ๐๐ป โฝ โ "v").
Definition inf_arrayู xchg_resolve : val :=
๐ณ๐๐ป "t" "i" "v" "proph" "v_resolve" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "old_v" =
arrayู unsafe_get "t".{inf_arrayู data} "i"
๐ถ๐ป
arrayู unsafe_set "t".{inf_arrayู data} "i" "v" โฎ
๐ฟ๐ฒ๐๐ผ๐น๐๐ฒ ๐๐ธ๐ถ๐ฝ "proph" "v_resolve" โฎ
"old_v").
Definition inf_arrayู set : val :=
๐ณ๐๐ป "t" "i" "v" โ
inf_arrayู xchg "t" "i" "v" โฎ
().
Definition inf_arrayู cas : val :=
๐ณ๐๐ป "t" "i" "v1" "v2" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "res" =
arrayู unsafe_get "t".{inf_arrayู data} "i" == "v1"
๐ถ๐ป
๐ถ๐ณ "res" ๐๐ต๐ฒ๐ป (
arrayู unsafe_set "t".{inf_arrayู data} "i" "v2"
) ๐ฒ๐น๐๐ฒ (
()
) โฎ
"res").
Definition inf_arrayู cas_resolve : val :=
๐ณ๐๐ป "t" "i" "v1" "v2" "proph" "v_resolve" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "res" =
arrayู unsafe_get "t".{inf_arrayู data} "i" == "v1"
๐ถ๐ป
๐ถ๐ณ "res" ๐๐ต๐ฒ๐ป (
arrayู unsafe_set "t".{inf_arrayู data} "i" "v2"
) ๐ฒ๐น๐๐ฒ (
()
) โฎ
๐ฟ๐ฒ๐๐ผ๐น๐๐ฒ ๐๐ธ๐ถ๐ฝ "proph" "v_resolve" โฎ
"res").
Definition inf_arrayู faa : val :=
๐ณ๐๐ป "t" "i" "incr" โ
inf_arrayู update "t" "i" (๐ณ๐๐ป "n" โ "n" + "incr").
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.array.
Require Import zoo_std.int.
Require Import zoo_std.mutex.
Require Import zoo.options.
Notation "'inf_arrayู data'" := (
in_type "zoo_std.inf_array.t" 0
)(in custom zoo_field
).
Notation "'inf_arrayู default'" := (
in_type "zoo_std.inf_array.t" 1
)(in custom zoo_field
).
Notation "'inf_arrayู mutex'" := (
in_type "zoo_std.inf_array.t" 2
)(in custom zoo_field
).
Definition inf_arrayู create : val :=
๐ณ๐๐ป "default" โ
๐น๐ฒ๐ "data" = arrayู create () ๐ถ๐ป
๐น๐ฒ๐ "mutex" = mutexู create () ๐ถ๐ป
{ "data", "default", "mutex" }.
Definition inf_arrayู next_capacity : val :=
๐ณ๐๐ป "n" โ
intู max
8
๐ถ๐ณ "n" โค 512 ๐๐ต๐ฒ๐ป (
2 ร "n"
) ๐ฒ๐น๐๐ฒ (
"n" + "n" ๐พ๐๐ผ๐ 2
).
Definition inf_arrayู reserve : val :=
๐ณ๐๐ป "t" "n" โ
๐น๐ฒ๐ "data" = "t".{inf_arrayู data} ๐ถ๐ป
๐น๐ฒ๐ "cap" = arrayู size "data" ๐ถ๐ป
๐ถ๐ณ "cap" < "n" ๐๐ต๐ฒ๐ป (
๐น๐ฒ๐ "cap" =
intู max "n" (inf_arrayู next_capacity "cap")
๐ถ๐ป
๐น๐ฒ๐ "data" =
arrayู unsafe_grow "data" "cap" "t".{inf_arrayู default}
๐ถ๐ป
"t" <-{inf_arrayู data} "data"
).
Definition inf_arrayู get : val :=
๐ณ๐๐ป "t" "i" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
๐น๐ฒ๐ "data" = "t".{inf_arrayู data} ๐ถ๐ป
๐ถ๐ณ "i" < arrayู size "data" ๐๐ต๐ฒ๐ป (
arrayู unsafe_get "data" "i"
) ๐ฒ๐น๐๐ฒ (
"t".{inf_arrayู default}
)).
Definition inf_arrayู update : val :=
๐ณ๐๐ป "t" "i" "fn" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "v" =
arrayู unsafe_get "t".{inf_arrayู data} "i"
๐ถ๐ป
arrayู unsafe_set "t".{inf_arrayู data} "i" ("fn" "v") โฎ
"v").
Definition inf_arrayู xchg : val :=
๐ณ๐๐ป "t" "i" "v" โ
inf_arrayู update "t" "i" (๐ณ๐๐ป โฝ โ "v").
Definition inf_arrayู xchg_resolve : val :=
๐ณ๐๐ป "t" "i" "v" "proph" "v_resolve" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "old_v" =
arrayู unsafe_get "t".{inf_arrayู data} "i"
๐ถ๐ป
arrayู unsafe_set "t".{inf_arrayู data} "i" "v" โฎ
๐ฟ๐ฒ๐๐ผ๐น๐๐ฒ ๐๐ธ๐ถ๐ฝ "proph" "v_resolve" โฎ
"old_v").
Definition inf_arrayู set : val :=
๐ณ๐๐ป "t" "i" "v" โ
inf_arrayู xchg "t" "i" "v" โฎ
().
Definition inf_arrayู cas : val :=
๐ณ๐๐ป "t" "i" "v1" "v2" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "res" =
arrayู unsafe_get "t".{inf_arrayู data} "i" == "v1"
๐ถ๐ป
๐ถ๐ณ "res" ๐๐ต๐ฒ๐ป (
arrayู unsafe_set "t".{inf_arrayู data} "i" "v2"
) ๐ฒ๐น๐๐ฒ (
()
) โฎ
"res").
Definition inf_arrayู cas_resolve : val :=
๐ณ๐๐ป "t" "i" "v1" "v2" "proph" "v_resolve" โ
mutexู protect "t".{inf_arrayู mutex}
(๐ณ๐๐ป โฝ โ
inf_arrayู reserve "t" ("i" + 1) โฎ
๐น๐ฒ๐ "res" =
arrayู unsafe_get "t".{inf_arrayู data} "i" == "v1"
๐ถ๐ป
๐ถ๐ณ "res" ๐๐ต๐ฒ๐ป (
arrayู unsafe_set "t".{inf_arrayู data} "i" "v2"
) ๐ฒ๐น๐๐ฒ (
()
) โฎ
๐ฟ๐ฒ๐๐ผ๐น๐๐ฒ ๐๐ธ๐ถ๐ฝ "proph" "v_resolve" โฎ
"res").
Definition inf_arrayู faa : val :=
๐ณ๐๐ป "t" "i" "incr" โ
inf_arrayู update "t" "i" (๐ณ๐๐ป "n" โ "n" + "incr").