Jump to content

Queue/Definition: Difference between revisions

Line 1,300:
(*------------------------------------------------------------------*)
 
vtypedef queue_tqueue_vt (vt : vt@ype+, n : int) =
(* A list that forms the queue, and a pointer to its last node. *)
@(list_vt (vt, n), ptr)
Line 1,308:
 
fn {}
queue_t_nilqueue_vt_nil {vt : vt@ype}
() :
queue_tqueue_vt (vt, 0) =
@(NIL, the_null_ptr)
 
fn {}
queue_vt_is_empty
queue_t_is_empty
{n : int}
{vt : vt@ype}
(q : !queue_tqueue_vt (vt, n)) :
[is_empty : bool | is_empty == (n == 0)]
bool is_empty =
Line 1,325:
 
fn {vt : vt@ype}
queue_vt_enqueue
queue_t_enqueue
{n : int}
(q : queue_tqueue_vt (vt, n),
x : vt) :
(* Returns the new queue. *)
[m : int | 1 <= m; m == n + 1]
queue_tqueue_vt (vt, m) =
let
val @(lst, tail_ptr) = q
Line 1,367:
 
(* The dequeue routine simply CANNOT BE CALLED with an empty queue.
It requires a queue of type queue_tqueue_vt (vt, n) where n is positive. *)
fn {vt : vt@ype}
queue_vt_dequeue
queue_t_dequeue
{n : int | 1 <= n}
(q : queue_tqueue_vt (vt, n)) :
(* Returns a tuple: the dequeued element and the new queue. *)
[m : int | 0 <= m; m == n - 1]
@(vt, queue_tqueue_vt (vt, m)) =
case+ q.0 of
| ~ (x :: lst) => @(x, @(lst, q.1))
 
(* queue_tqueue_vt is a linear type that must be freed. *)
extern fun {vt : vt@ype}
queue_tqueue_vt$element_free : vt -> void
fn {vt : vt@ype}
queue_t_freequeue_vt_free {n : int}
(q : queue_tqueue_vt (vt, n)) :
void =
let
Line 1,392:
| ~ (hd :: tl) =>
begin
queue_tqueue_vt$element_free<vt> hd;
loop tl
end
Line 1,403:
(* An example: a queue of nonlinear strings. *)
 
vtypedef strq_tstrq_vt (n : int) = queue_tqueue_vt (string, n)
 
fn {} (* A parameterless template, for efficiency. *)
strq_t_nilstrq_vt_nil () : strq_tstrq_vt 0 =
queue_t_nilqueue_vt_nil ()
 
fn {} (* A parameterless template, for efficiency. *)
strq_t_is_emptystrq_vt_is_empty {n : int} (q : !strq_tstrq_vt n) :
[is_empty : bool | is_empty == (n == 0)] bool is_empty =
queue_t_is_emptyqueue_vt_is_empty<> q
 
fn
strq_t_enqueuestrq_vt_enqueue {n : int} (q : strq_tstrq_vt n, x : string) :
[m : int | 1 <= m; m == n + 1] strq_tstrq_vt m =
queue_t_enqueuequeue_vt_enqueue<string> (q, x)
 
fn (* Impossible to... VVVVVV ...call with an empty queue. *)
strq_t_dequeuestrq_vt_dequeue {n : int | 1 <= n} (q : strq_tstrq_vt n) :
[m : int | 0 <= m; m == n - 1] @(string, strq_tstrq_vt m) =
queue_t_dequeuequeue_vt_dequeue<string> q
 
fn
strq_t_freestrq_vt_free {n : int} (q : strq_tstrq_vt n) : void =
let
implement
queue_tqueue_vt$element_free<string> x =
(* A nonlinear string will be allowed to leak. (It might be
collected as garbage, however.) *)
begin end
in
queue_t_freequeue_vt_free<string> q
end
 
macdef qnil = strq_t_nilstrq_vt_nil ()
overload iseqz with strq_t_is_emptystrq_vt_is_empty
overload << with strq_t_enqueuestrq_vt_enqueue
overload pop with strq_t_dequeuestrq_vt_dequeue
overload free with strq_t_freestrq_vt_free
 
implement
Line 1,488:
x = four
iseqz q = true</pre>
 
 
=={{header|AutoHotkey}}==
1,448

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.