From e0dd50831fd19e1145897de8af909002c2821376 Mon Sep 17 00:00:00 2001 From: Charles Date: Sat, 7 Dec 2019 17:27:41 +0100 Subject: Basic Queue package --- main.adb | 2 ++ queue.adb | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ queue.ads | 28 ++++++++++++++++------------ snake.gpr | 2 +- 4 files changed, 69 insertions(+), 13 deletions(-) diff --git a/main.adb b/main.adb index 65c37f1..59d6fe7 100644 --- a/main.adb +++ b/main.adb @@ -4,6 +4,8 @@ use Ada.Text_IO; with Graphics; use Graphics; +with Queue; + procedure Main is state: T_State; begin diff --git a/queue.adb b/queue.adb index e69de29..2869984 100644 --- a/queue.adb +++ b/queue.adb @@ -0,0 +1,50 @@ +package body Queue is + + procedure Enqueue(queue: in out T_Queue; data: T_Data) is + element: T_List_Node; + new_back: T_List; + begin + element.data := data; + element.next := null; + new_back := new T_List_Node'(element); + + if Empty(queue) then + queue.front := new_back; + queue.back := new_back; + return; + end if; + + queue.back.next := new_back; + queue.back := new_back; + end Enqueue; + + procedure Dequeue(queue: in out T_Queue) is + begin + if Empty(queue) then + return; + end if; + if queue.front.next = null then + queue.front := null; + queue.back := null; + return; + end if; + queue.front := queue.front.next; + end Dequeue; + + function Length(queue: T_Queue) return Natural is + tmp: T_List := queue.front; + i: Natural := 0; + begin + while tmp /= null loop + tmp := tmp.next; + i := i + 1; + end loop; + return i; + end Length; + + function Empty(queue: T_Queue) return Boolean is + begin + return queue.front = null and queue.back = null; + end Empty; + +end Queue; diff --git a/queue.ads b/queue.ads index e0da54c..d573490 100644 --- a/queue.ads +++ b/queue.ads @@ -1,21 +1,25 @@ generic - type T_Data is limited private; + type T_Data is private; package Queue is - type T_Queue is record - front: T_List; - back: T_List; - end record; - - type T_List_Cell; - type T_List is access T_List_Cell; - type T_List_Cell is record + type T_List_Node; + type T_List is access all T_List_Node; + type T_List_Node is record data: T_Data; next: T_List; end record; - procedure Enqueue(queue: T_Queue; - data: T_Data); - procedure Dequeue(queue: T_Queue); + type T_Queue is record + front: T_List := null; + back: T_List := null; + end record; + + procedure Enqueue(queue: in out T_Queue; data: T_Data); + procedure Dequeue(queue: in out T_Queue); + function Length(queue: T_Queue) return Natural; + +private + + function Empty(queue: T_Queue) return Boolean; end Queue; diff --git a/snake.gpr b/snake.gpr index d3f1454..06b348d 100644 --- a/snake.gpr +++ b/snake.gpr @@ -2,6 +2,6 @@ with "./vendor/sdlada/share/gpr/sdlada.gpr"; project Snake is for Source_Dirs use ("./"); - for Source_Files use ("main.adb", "graphics.adb", "game.adb"); + for Source_Files use ("main.adb", "graphics.adb", "game.adb", "queue.adb"); for Main use ("main.adb"); end Snake; -- cgit