aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-12-07 17:27:41 +0100
committerCharles <sircharlesaze@gmail.com>2019-12-07 17:27:41 +0100
commite0dd50831fd19e1145897de8af909002c2821376 (patch)
treed3d4dd827b4d55f243b3664ac878e944146f720b
parentacfbdcefdbc60e97a9e3447afed204b3e40d991e (diff)
downloadsnake-e0dd50831fd19e1145897de8af909002c2821376.tar.gz
snake-e0dd50831fd19e1145897de8af909002c2821376.tar.bz2
snake-e0dd50831fd19e1145897de8af909002c2821376.zip
Basic Queue package
-rw-r--r--main.adb2
-rw-r--r--queue.adb50
-rw-r--r--queue.ads28
-rw-r--r--snake.gpr2
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;