Library zoo_saturn.bqueue_mpmc__code
Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.domain.
Require Import zoo.options.
Notation "'bqueue_mpmc٠Null'" := (
in_type "zoo_saturn.bqueue_mpmc.node" 0
)(in custom zoo_tag
).
Notation "'bqueue_mpmc٠Node'" := (
in_type "zoo_saturn.bqueue_mpmc.node" 1
)(in custom zoo_tag
).
Notation "'bqueue_mpmc٠next'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 0
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠data'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 1
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠index'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 2
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠estimated_capacity'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 3
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠capacity'" := (
in_type "zoo_saturn.bqueue_mpmc.t" 0
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠front'" := (
in_type "zoo_saturn.bqueue_mpmc.t" 1
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠back'" := (
in_type "zoo_saturn.bqueue_mpmc.t" 2
)(in custom zoo_field
).
Definition bqueue_mpmc٠create : val :=
𝗳𝘂𝗻 "cap" →
𝗹𝗲𝘁 "front" =
‘bqueue_mpmc٠Node{ §bqueue_mpmc٠Null, (), 0, "cap" }
𝗶𝗻
{ "cap", "front", "front" }.
Definition bqueue_mpmc٠capacity : val :=
𝗳𝘂𝗻 "t" →
"t".{bqueue_mpmc٠capacity}.
Definition bqueue_mpmc٠size : val :=
𝗿𝗲𝗰 "size" "t" →
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠front} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front" →
𝗹𝗲𝘁 "front_r" = "front" 𝗶𝗻
𝗹𝗲𝘁 "proph" = 𝗽𝗿𝗼𝗽𝗵 𝗶𝗻
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠back} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back" →
𝗹𝗲𝘁 "back_r" = "back" 𝗶𝗻
𝗺𝗮𝘁𝗰𝗵
"back_r".{bqueue_mpmc٠next}
𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "node" →
𝗰𝗮𝘀 "t".[bqueue_mpmc٠back] "back" "node" ⍮
"size" "t"
| bqueue_mpmc٠Null →
𝗶𝗳
𝗿𝗲𝘀𝗼𝗹𝘃𝗲
"t".{bqueue_mpmc٠front}
"proph"
()
==
"front"
𝘁𝗵𝗲𝗻 (
"back_r".{bqueue_mpmc٠index}
-
"front_r".{bqueue_mpmc٠index}
) 𝗲𝗹𝘀𝗲 (
"size" "t"
)
𝗲𝗻𝗱
𝗲𝗻𝗱
𝗲𝗻𝗱.
Definition bqueue_mpmc٠is_empty : val :=
𝗳𝘂𝗻 "t" →
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠front} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front_r" →
"front_r".{bqueue_mpmc٠next} == §bqueue_mpmc٠Null
𝗲𝗻𝗱.
Definition bqueue_mpmc٠fix_back : val :=
𝗿𝗲𝗰 "fix_back" "t" "back" "new_back" →
𝗺𝗮𝘁𝗰𝗵 "new_back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "new_back_r" →
𝗶𝗳
"new_back_r".{bqueue_mpmc٠next} == §bqueue_mpmc٠Null
𝗮𝗻𝗱
¬ 𝗰𝗮𝘀 "t".[bqueue_mpmc٠back] "back" "new_back"
𝘁𝗵𝗲𝗻 (
domain٠yield () ⍮
"fix_back" "t" "t".{bqueue_mpmc٠back} "new_back"
)
𝗲𝗻𝗱.
#[local] Definition __zoo_recs_0 :=
( 𝗿𝗲𝗰𝘀 "push_1" "t" "back" "cap" "new_back" →
𝗺𝗮𝘁𝗰𝗵 "back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back_r" →
𝗺𝗮𝘁𝗰𝗵 "new_back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "new_back" →
𝗹𝗲𝘁 "new_back_r" = "new_back" 𝗶𝗻
𝗶𝗳 "cap" == 0 𝘁𝗵𝗲𝗻 (
𝗺𝗮𝘁𝗰𝗵
"t".{bqueue_mpmc٠front}
𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front_r" →
𝗹𝗲𝘁 "cap" =
"t".{bqueue_mpmc٠capacity}
-
("back_r".{bqueue_mpmc٠index}
-
"front_r".{bqueue_mpmc٠index})
𝗶𝗻
𝗶𝗳 "cap" == 0 𝘁𝗵𝗲𝗻 (
false
) 𝗲𝗹𝘀𝗲 (
"back_r" <-{bqueue_mpmc٠estimated_capacity} "cap" ⍮
"push_1" "t" "back" "cap" "new_back"
)
𝗲𝗻𝗱
) 𝗲𝗹𝘀𝗲 (
"new_back_r" <-{bqueue_mpmc٠index}
"back_r".{bqueue_mpmc٠index} + 1 ⍮
"new_back_r" <-{bqueue_mpmc٠estimated_capacity} "cap" - 1 ⍮
𝗶𝗳
𝗰𝗮𝘀
"back_r".[bqueue_mpmc٠next]
§bqueue_mpmc٠Null
"new_back"
𝘁𝗵𝗲𝗻 (
bqueue_mpmc٠fix_back "t" "back" "new_back" ⍮
true
) 𝗲𝗹𝘀𝗲 (
𝗺𝗮𝘁𝗰𝗵
"back_r".{bqueue_mpmc٠next}
𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Null →
𝗳𝗮𝗶𝗹
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back" →
"push_2" "t" "back" "new_back"
𝗲𝗻𝗱
)
)
𝗲𝗻𝗱
𝗲𝗻𝗱
𝘄𝗶𝘁𝗵 "push_2" "t" "back" "new_back" →
𝗺𝗮𝘁𝗰𝗵 "back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back" →
𝗹𝗲𝘁 "back_r" = "back" 𝗶𝗻
"push_1"
"t"
"back"
"back_r".{bqueue_mpmc٠estimated_capacity}
"new_back"
𝗲𝗻𝗱
)%zoo_recs.
Definition bqueue_mpmc٠push_1 :=
ValRecs 0 __zoo_recs_0.
Definition bqueue_mpmc٠push_2 :=
ValRecs 1 __zoo_recs_0.
#[global] Instance :
AsValRecs' bqueue_mpmc٠push_1 0 __zoo_recs_0 [
bqueue_mpmc٠push_1 ;
bqueue_mpmc٠push_2
].
#[global] Instance :
AsValRecs' bqueue_mpmc٠push_2 1 __zoo_recs_0 [
bqueue_mpmc٠push_1 ;
bqueue_mpmc٠push_2
].
Definition bqueue_mpmc٠push : val :=
𝗳𝘂𝗻 "t" "v" →
𝗹𝗲𝘁 "new_back" =
‘bqueue_mpmc٠Node{ §bqueue_mpmc٠Null, "v", 0, 0 }
𝗶𝗻
bqueue_mpmc٠push_2 "t" "t".{bqueue_mpmc٠back} "new_back".
Definition bqueue_mpmc٠pop : val :=
𝗿𝗲𝗰 "pop" "t" →
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠front} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front" →
𝗹𝗲𝘁 "front_r" = "front" 𝗶𝗻
𝗺𝗮𝘁𝗰𝗵 "front_r".{bqueue_mpmc٠next} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Null →
§None
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "new_front" →
𝗹𝗲𝘁 "new_front_r" = "new_front" 𝗶𝗻
𝗶𝗳
𝗰𝗮𝘀 "t".[bqueue_mpmc٠front] "front" "new_front"
𝘁𝗵𝗲𝗻 (
𝗹𝗲𝘁 "v" = "new_front_r".{bqueue_mpmc٠data} 𝗶𝗻
"new_front_r" <-{bqueue_mpmc٠data} () ⍮
‘Some( "v" )
) 𝗲𝗹𝘀𝗲 (
domain٠yield () ⍮
"pop" "t"
)
𝗲𝗻𝗱
𝗲𝗻𝗱.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.domain.
Require Import zoo.options.
Notation "'bqueue_mpmc٠Null'" := (
in_type "zoo_saturn.bqueue_mpmc.node" 0
)(in custom zoo_tag
).
Notation "'bqueue_mpmc٠Node'" := (
in_type "zoo_saturn.bqueue_mpmc.node" 1
)(in custom zoo_tag
).
Notation "'bqueue_mpmc٠next'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 0
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠data'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 1
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠index'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 2
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠estimated_capacity'" := (
in_type "zoo_saturn.bqueue_mpmc.node.Node" 3
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠capacity'" := (
in_type "zoo_saturn.bqueue_mpmc.t" 0
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠front'" := (
in_type "zoo_saturn.bqueue_mpmc.t" 1
)(in custom zoo_field
).
Notation "'bqueue_mpmc٠back'" := (
in_type "zoo_saturn.bqueue_mpmc.t" 2
)(in custom zoo_field
).
Definition bqueue_mpmc٠create : val :=
𝗳𝘂𝗻 "cap" →
𝗹𝗲𝘁 "front" =
‘bqueue_mpmc٠Node{ §bqueue_mpmc٠Null, (), 0, "cap" }
𝗶𝗻
{ "cap", "front", "front" }.
Definition bqueue_mpmc٠capacity : val :=
𝗳𝘂𝗻 "t" →
"t".{bqueue_mpmc٠capacity}.
Definition bqueue_mpmc٠size : val :=
𝗿𝗲𝗰 "size" "t" →
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠front} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front" →
𝗹𝗲𝘁 "front_r" = "front" 𝗶𝗻
𝗹𝗲𝘁 "proph" = 𝗽𝗿𝗼𝗽𝗵 𝗶𝗻
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠back} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back" →
𝗹𝗲𝘁 "back_r" = "back" 𝗶𝗻
𝗺𝗮𝘁𝗰𝗵
"back_r".{bqueue_mpmc٠next}
𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "node" →
𝗰𝗮𝘀 "t".[bqueue_mpmc٠back] "back" "node" ⍮
"size" "t"
| bqueue_mpmc٠Null →
𝗶𝗳
𝗿𝗲𝘀𝗼𝗹𝘃𝗲
"t".{bqueue_mpmc٠front}
"proph"
()
==
"front"
𝘁𝗵𝗲𝗻 (
"back_r".{bqueue_mpmc٠index}
-
"front_r".{bqueue_mpmc٠index}
) 𝗲𝗹𝘀𝗲 (
"size" "t"
)
𝗲𝗻𝗱
𝗲𝗻𝗱
𝗲𝗻𝗱.
Definition bqueue_mpmc٠is_empty : val :=
𝗳𝘂𝗻 "t" →
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠front} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front_r" →
"front_r".{bqueue_mpmc٠next} == §bqueue_mpmc٠Null
𝗲𝗻𝗱.
Definition bqueue_mpmc٠fix_back : val :=
𝗿𝗲𝗰 "fix_back" "t" "back" "new_back" →
𝗺𝗮𝘁𝗰𝗵 "new_back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "new_back_r" →
𝗶𝗳
"new_back_r".{bqueue_mpmc٠next} == §bqueue_mpmc٠Null
𝗮𝗻𝗱
¬ 𝗰𝗮𝘀 "t".[bqueue_mpmc٠back] "back" "new_back"
𝘁𝗵𝗲𝗻 (
domain٠yield () ⍮
"fix_back" "t" "t".{bqueue_mpmc٠back} "new_back"
)
𝗲𝗻𝗱.
#[local] Definition __zoo_recs_0 :=
( 𝗿𝗲𝗰𝘀 "push_1" "t" "back" "cap" "new_back" →
𝗺𝗮𝘁𝗰𝗵 "back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back_r" →
𝗺𝗮𝘁𝗰𝗵 "new_back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "new_back" →
𝗹𝗲𝘁 "new_back_r" = "new_back" 𝗶𝗻
𝗶𝗳 "cap" == 0 𝘁𝗵𝗲𝗻 (
𝗺𝗮𝘁𝗰𝗵
"t".{bqueue_mpmc٠front}
𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front_r" →
𝗹𝗲𝘁 "cap" =
"t".{bqueue_mpmc٠capacity}
-
("back_r".{bqueue_mpmc٠index}
-
"front_r".{bqueue_mpmc٠index})
𝗶𝗻
𝗶𝗳 "cap" == 0 𝘁𝗵𝗲𝗻 (
false
) 𝗲𝗹𝘀𝗲 (
"back_r" <-{bqueue_mpmc٠estimated_capacity} "cap" ⍮
"push_1" "t" "back" "cap" "new_back"
)
𝗲𝗻𝗱
) 𝗲𝗹𝘀𝗲 (
"new_back_r" <-{bqueue_mpmc٠index}
"back_r".{bqueue_mpmc٠index} + 1 ⍮
"new_back_r" <-{bqueue_mpmc٠estimated_capacity} "cap" - 1 ⍮
𝗶𝗳
𝗰𝗮𝘀
"back_r".[bqueue_mpmc٠next]
§bqueue_mpmc٠Null
"new_back"
𝘁𝗵𝗲𝗻 (
bqueue_mpmc٠fix_back "t" "back" "new_back" ⍮
true
) 𝗲𝗹𝘀𝗲 (
𝗺𝗮𝘁𝗰𝗵
"back_r".{bqueue_mpmc٠next}
𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Null →
𝗳𝗮𝗶𝗹
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back" →
"push_2" "t" "back" "new_back"
𝗲𝗻𝗱
)
)
𝗲𝗻𝗱
𝗲𝗻𝗱
𝘄𝗶𝘁𝗵 "push_2" "t" "back" "new_back" →
𝗺𝗮𝘁𝗰𝗵 "back" 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "back" →
𝗹𝗲𝘁 "back_r" = "back" 𝗶𝗻
"push_1"
"t"
"back"
"back_r".{bqueue_mpmc٠estimated_capacity}
"new_back"
𝗲𝗻𝗱
)%zoo_recs.
Definition bqueue_mpmc٠push_1 :=
ValRecs 0 __zoo_recs_0.
Definition bqueue_mpmc٠push_2 :=
ValRecs 1 __zoo_recs_0.
#[global] Instance :
AsValRecs' bqueue_mpmc٠push_1 0 __zoo_recs_0 [
bqueue_mpmc٠push_1 ;
bqueue_mpmc٠push_2
].
#[global] Instance :
AsValRecs' bqueue_mpmc٠push_2 1 __zoo_recs_0 [
bqueue_mpmc٠push_1 ;
bqueue_mpmc٠push_2
].
Definition bqueue_mpmc٠push : val :=
𝗳𝘂𝗻 "t" "v" →
𝗹𝗲𝘁 "new_back" =
‘bqueue_mpmc٠Node{ §bqueue_mpmc٠Null, "v", 0, 0 }
𝗶𝗻
bqueue_mpmc٠push_2 "t" "t".{bqueue_mpmc٠back} "new_back".
Definition bqueue_mpmc٠pop : val :=
𝗿𝗲𝗰 "pop" "t" →
𝗺𝗮𝘁𝗰𝗵 "t".{bqueue_mpmc٠front} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "front" →
𝗹𝗲𝘁 "front_r" = "front" 𝗶𝗻
𝗺𝗮𝘁𝗰𝗵 "front_r".{bqueue_mpmc٠next} 𝘄𝗶𝘁𝗵
| bqueue_mpmc٠Null →
§None
| bqueue_mpmc٠Node ⎽ ⎽ ⎽ ⎽ 𝗮𝘀 "new_front" →
𝗹𝗲𝘁 "new_front_r" = "new_front" 𝗶𝗻
𝗶𝗳
𝗰𝗮𝘀 "t".[bqueue_mpmc٠front] "front" "new_front"
𝘁𝗵𝗲𝗻 (
𝗹𝗲𝘁 "v" = "new_front_r".{bqueue_mpmc٠data} 𝗶𝗻
"new_front_r" <-{bqueue_mpmc٠data} () ⍮
‘Some( "v" )
) 𝗲𝗹𝘀𝗲 (
domain٠yield () ⍮
"pop" "t"
)
𝗲𝗻𝗱
𝗲𝗻𝗱.