Premier commit
[powerfractal.git] / CD / Src / Power_List.adb
1 ------------------------------------------------------------------------------------------------
2 -- Nom : Power_List / fait partie du programme Power Fractal --
3 -- --
4 -- Auteurs : Gregory Burri & Adrien Crivelli --
5 ------------------------------------------------------------------------------------------------
6 -- But : Outils pour creer et gerer des liste de fractals --
7 ------------------------------------------------------------------------------------------------
8
9 with Power_Types; use Power_Types;
10 with Ada.Unchecked_Deallocation;
11
12 package body Power_List is
13
14 ------------------------------------------------------------------------------------------------
15 -- Nom : Ajouter --
16 -- But : Ajouter une fractal a la suite de la liste --
17 -- Parametres ----------------------------------------------------------------------------------
18 -- In : * La liste de fractals --
19 -- * La Fractal A Ajouter --
20 ------------------------------------------------------------------------------------------------
21 procedure Ajouter (Liste_Fractals : in out T_Liste_Fractals; Fractal : Cara_Fractal) is
22
23 --Pour pouvoir parcourir la liste
24 Pointeur : T_Lien := Liste_Fractals.Tete;
25
26 begin --Ajouter
27
28 if Liste_Fractals.Tete = null then
29
30 Liste_Fractals.Tete := new T_Fractal'(Fractal, null);
31
32 else
33
34 while Pointeur.Suiv /= null loop
35 Pointeur := Pointeur.Suiv;
36 end loop;
37
38 Pointeur.Suiv := new T_Fractal'(Fractal, null);
39
40 end if;
41
42 Liste_Fractals.Nb_Fractals := Liste_Fractals.Nb_Fractals + 1;
43
44 end Ajouter;
45
46 ------------------------------------------------------------------------------------------------
47 -- Nom : Effacer --
48 -- But : Effacer une fractal de la liste --
49 -- Parametres ----------------------------------------------------------------------------------
50 -- In : * La liste de fractals --
51 -- * Le numeros de la fractal a effacer : Num --
52 ------------------------------------------------------------------------------------------------
53 procedure Effacer (Liste_Fractals : in out T_Liste_Fractals; Num : Natural) is
54
55 --Pour pouvoir parcourir la liste
56 Pointeur : T_Lien := Liste_Fractals.Tete;
57 Pointeur_Avant : T_Lien := Liste_Fractals.Tete;
58
59 procedure Liberer is new Ada.Unchecked_Deallocation ( T_Fractal , T_Lien);
60
61 begin --Effacer
62
63 --Si la liste ne comporte qu'un seul element alors propage une erreur
64 if Liste_Fractals.Nb_Fractals = 1 then
65 raise Liste_Une_Fractal;
66 end if;
67
68 --Si l'element a supprimer est le premier de la liste alors
69 if Num = 1 then
70 Liste_Fractals.Tete := Liste_Fractals.Tete.Suiv; --La tete pointe sur le deuxieme element
71 Liberer(Pointeur);
72 else
73
74 --Pointeur pointe sur le deuxieme element de la liste
75 Pointeur := Liste_Fractals.Tete.Suiv;
76
77 --Cherche l'element numero 'num'
78 for I in 3..Num loop
79
80 --Decale les pointeurs
81 Pointeur_Avant := Pointeur;
82 Pointeur := Pointeur.Suiv;
83 --
84
85 --Si pas trouve alors propage une erreur
86 if Pointeur = null then raise Fractal_Inexistante; end if;
87
88 end loop;
89
90 Pointeur_Avant.Suiv := Pointeur.Suiv; --Refais le lien en sautant l'element a supprimer
91 Liberer(Pointeur); --Efface de la memoire l'element a supprimer
92
93 end if;
94
95 --Un element a ete enleve :
96 Liste_Fractals.Nb_Fractals := Liste_Fractals.Nb_Fractals - 1;
97
98 end Effacer;
99
100
101 ------------------------------------------------------------------------------------------------
102 -- Nom : Fractal_Num --
103 -- But : Retourner un pointeur sur la fractal correspondante a un numeros --
104 -- Parametres ----------------------------------------------------------------------------------
105 -- In : * La liste de fractals --
106 -- * Le numeros de la fractal a chercher : Num --
107 -- --
108 -- return : * Le pointeur sur La fractal correspondante au numero --
109 ------------------------------------------------------------------------------------------------
110 function Fractal_Num (Liste_Fractals : T_Liste_Fractals; Num : Natural) return T_Lien is
111
112 Pointeur : T_Lien := Liste_Fractals.Tete; --Pour pouvoir parcourir la liste
113
114 begin --Fractal_Num
115
116 for I in 2..Num loop
117
118 --Si pas trouve alors propage une erreur
119 if Pointeur = null then raise Fractal_Inexistante; end if;
120 Pointeur := Pointeur.Suiv; --Decale le pointeur
121
122 end loop;
123
124 return Pointeur; --Retourne la fractal trouvee
125
126 end Fractal_Num;
127
128
129 ------------------------------------------------------------------------------------------------
130 -- Nom : Vider_Liste --
131 -- But : vider completement la liste des fractals --
132 -- Parametres ----------------------------------------------------------------------------------
133 -- In-out : * La liste de fractals a vider --
134 ------------------------------------------------------------------------------------------------
135 procedure Vider_Liste(Liste_Fractals : in out T_Liste_Fractals) is
136
137 Pointeur : T_Lien; --Pour pouvoir parcourir la liste
138 procedure Liberer is new Ada.Unchecked_Deallocation ( T_Fractal , T_Lien);
139
140 begin --Vider_Liste
141
142 --Efface tout les elements de la liste
143 while Liste_Fractals.Tete /= null loop
144 Pointeur := Liste_Fractals.Tete;
145 Liste_Fractals.Tete := Liste_Fractals.Tete.Suiv;
146 Liberer (Pointeur);
147 end loop;
148
149 Liste_Fractals.Nb_Fractals := 0;
150
151 end Vider_Liste;
152
153 ------------------------------------------------------------------------------------------------
154 -- Nom : Liste_Defaut --
155 -- But : Mettre dans la liste en parametre des fractals d'exemple --
156 -- Parametres ----------------------------------------------------------------------------------
157 -- In-out : * La liste de fractals a remplir --
158 ------------------------------------------------------------------------------------------------
159 function Liste_Defaut return T_Liste_Fractals is
160 Liste : T_Liste_Fractals;
161
162 begin --Liste_Defaut
163
164 --Les fractales par defaut
165 Ajouter(Liste, Fractal_Initial_Mandel);
166 Ajouter(Liste, Fractal_Initial_Julia);
167
168
169 --D'autre fractal exemple
170 Ajouter(Liste, (Mandelbrot, 4, 30, 4.0, 1.0/4.0, (-0.6, 0.0), 60.0,
171 ( (2,203,253), (0,0,255), (255,255,0), (0,0,0) ),
172 False, False));
173
174 Ajouter(Liste, (Julia, 4, 40, 4.0, 1.0/4.0, (0.0, 0.0), -40.0,
175 ( (0,0,0), (247,91,43), (209,207,30), (255,12,0) ),
176 False, False, -0.277, 0.968));
177
178 Ajouter(Liste, (Mandelbrot, 4, 70, 4.0, 1.0/4.0, (-0.6, 0.0), -90.0,
179 ((180,200,255), (200,250,0), (0,0,255), (0,0,140) ),
180 False, False));
181
182 Ajouter(Liste, (Julia, 4, 40, 4.0, 1.0/4.0, (0.0, 0.0), 0.0,
183 ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ),
184 False, False, 0.4, 0.02));
185
186 Ajouter(Liste, (Mandelbrot, 4, 33, 4.0, 87.0634, (0.4147, 0.1589), -46.0,
187 ( (0,0,0), (0,255,0), (0,0,255), (0,0,0) ),
188 False, False));
189
190 Ajouter(Liste, (Julia, 4, 30, 1.2, 1.0/4.0, (0.0, 0.0), 0.0,
191 ( (237,89,173), (138,164,237), (0,0,255), (22,23,23) ),
192 False, False, 0.44, 0.2));
193
194 Ajouter(Liste, (Mandelbrot, 4, 180, 3.2, 10.2903, (-1.761, -0.0), -26.0,
195 ( (0,0,0), (0,255,0), (255,20,20), (0,0,0) ),
196 False, False));
197
198 Ajouter(Liste, (Julia, 4, 80, 4.0, 1.0/4.0, (0.0, 0.0), 10.0,
199 ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ),
200 False, False, -0.757, -0.08));
201
202 Ajouter(Liste, (Mandelbrot, 4, 50, 2.3, 1.0/4.0, (-0.6, 0.0), 180.0,
203 ( (0,100,0), (34,55,0), (0,0,255), (0,32,244) ),
204 False, False));
205
206 Ajouter(Liste, (Julia, 4, 50, 4.0, 1.026, (-0.3471, 0.4628), 0.0,
207 ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ),
208 False, False, 0.44, -0.14));
209
210 return Liste;
211
212 end Liste_Defaut;
213
214
215 ------------------------------------------------------------------------------------------------
216 -- Nb_Fractals --
217 ------------------------------------------------------------------------------------------------
218 function Nb_Fractals (Liste_Fractals : in T_Liste_Fractals) return Natural is
219
220 begin --Nb_Fractals
221
222 return Liste_Fractals.Nb_Fractals;
223
224 end Nb_Fractals;
225
226 end Power_List;