File: heap.adb

package info (click to toggle)
spark 2012.0.deb-9
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 29,260 kB
  • ctags: 3,098
  • sloc: ada: 186,243; cpp: 13,497; makefile: 685; yacc: 440; lex: 176; ansic: 119; sh: 16
file content (151 lines) | stat: -rw-r--r-- 5,669 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
-------------------------------------------------------------------------------
-- (C) Altran Praxis Limited
-------------------------------------------------------------------------------
--
-- The SPARK toolset is free software; you can redistribute it and/or modify it
-- under terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 3, or (at your option) any later
-- version. The SPARK toolset is distributed in the hope that it will be
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-- Public License for more details. You should have received a copy of the GNU
-- General Public License distributed with the SPARK toolset; see file
-- COPYING3. If not, go to http://www.gnu.org/licenses for a complete copy of
-- the license.
--
--=============================================================================

package body Heap
--158 refinement clause removed
is

   --158 new procedure
   procedure Initialize (TheHeap : out HeapRecord) is
   begin
      TheHeap.HighMark     := Atom (0);
      TheHeap.NextFreeAtom := Atom (0);
      --# accept F, 23, TheHeap.ListOfAtoms, "Partial initialization" &
      --#        F, 602, TheHeap, TheHeap.ListOfAtoms, "Partial initialization";
      TheHeap.ListOfAtoms (0).PointerA := 0;
      TheHeap.ListOfAtoms (0).PointerB := 0;

   end Initialize;

   --------------------------------------------------------------------

   procedure CreateAtom (TheHeap : in out HeapRecord;
                         NewAtom :    out Atom;
                         Success :    out Boolean) is
      A : Atom;
   begin
      --160--new if part
      if TheHeap.HighMark < Atom (ListLength) then
         --haven't used up array yet
         TheHeap.HighMark                 := TheHeap.HighMark + 1;
         A                                := TheHeap.HighMark;
         TheHeap.ListOfAtoms (A).PointerA := 0;
         TheHeap.ListOfAtoms (A).PointerB := 0;
         NewAtom                          := A;
         Success                          := True;
      elsif TheHeap.NextFreeAtom = 0 then
         --160--if turned into elsif
         --array and returned atoms in free list both used up
         Success := False;
         NewAtom := 0;
      else
         --array used up but there are atoms in the returned free list
         A                                := TheHeap.NextFreeAtom;
         TheHeap.NextFreeAtom             := TheHeap.ListOfAtoms (TheHeap.NextFreeAtom).PointerA;
         TheHeap.ListOfAtoms (A).PointerA := 0;
         TheHeap.ListOfAtoms (A).PointerB := 0;
         NewAtom                          := A;
         Success                          := True;
      end if;
   end CreateAtom;

   --------------------------------------------------------------------

   procedure DisposeOfAtom (TheHeap : in out HeapRecord;
                            OldAtom : in     Atom) is
   begin
      TheHeap.ListOfAtoms (OldAtom).PointerA := TheHeap.NextFreeAtom;
      TheHeap.NextFreeAtom                   := OldAtom;
   end DisposeOfAtom;

   --------------------------------------------------------------------

   function APointer (TheHeap : HeapRecord;
                      A       : Atom) return Atom is
   begin
      return TheHeap.ListOfAtoms (A).PointerA;
   end APointer;

   --------------------------------------------------------------------

   function BPointer (TheHeap : HeapRecord;
                      A       : Atom) return Atom is
   begin
      return TheHeap.ListOfAtoms (A).PointerB;
   end BPointer;

   --------------------------------------------------------------------

   function AValue (TheHeap : HeapRecord;
                    A       : Atom) return HeapIndex.IndexType is
   begin
      return TheHeap.ListOfAtoms (A).ValueA;
   end AValue;

   --------------------------------------------------------------------

   function BValue (TheHeap : HeapRecord;
                    A       : Atom) return HeapIndex.IndexType is
   begin
      return TheHeap.ListOfAtoms (A).ValueB;
   end BValue;

   --------------------------------------------------------------------

   procedure UpdateAPointer (TheHeap : in out HeapRecord;
                             A       : in     Atom;
                             Pointer : in     Atom) is
   begin
      TheHeap.ListOfAtoms (A).PointerA := Pointer;
   end UpdateAPointer;

   --------------------------------------------------------------------

   procedure UpdateBPointer (TheHeap : in out HeapRecord;
                             A       : in     Atom;
                             Pointer : in     Atom) is
   begin
      TheHeap.ListOfAtoms (A).PointerB := Pointer;
   end UpdateBPointer;

   --------------------------------------------------------------------

   procedure UpdateAValue (TheHeap : in out HeapRecord;
                           A       : in     Atom;
                           Value   : in     HeapIndex.IndexType) is
   begin
      TheHeap.ListOfAtoms (A).ValueA := Value;
   end UpdateAValue;

   --------------------------------------------------------------------

   procedure UpdateBValue (TheHeap : in out HeapRecord;
                           A       : in     Atom;
                           Value   : in     HeapIndex.IndexType) is
   begin
      TheHeap.ListOfAtoms (A).ValueB := Value;
   end UpdateBValue;

   --------------------------------------------------------------------

   --159 new function used in RefList
   function IsNullPointer (A : Atom) return Boolean is
   begin
      return (A = 0);
   end IsNullPointer;

end Heap;