Code coverage for profil_list.li
///////////////////////////////////////////////////////////////////////////////
// Lisaac Compiler //
// //
// LSIIT - ULP - CNRS - INRIA - FRANCE //
// //
// This program is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// (at your option) any later version. //
// //
// This program 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 //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
// //
// http://isaacproject.u-strasbg.fr/ //
///////////////////////////////////////////////////////////////////////////////
Section Header
+ name := PROFIL_LIST;
- copyright := "2003-2007 Benoit Sonntag";
- author := "Sonntag Benoit (bsonntag@loria.fr)";
- comment := "Profil list manager.";
Section Inherit
+ parent_any:Expanded ANY;
Section LISAAC
- profil_list:FAST_ARRAY(PROFIL) := FAST_ARRAY(PROFIL).create_with_capacity 65536;
- life_limit:INTEGER;
- life_limit_base:INTEGER;
- current:INTEGER;
- swap i1:INTEGER with i2:INTEGER <-
(
profil_list.item i2.set_life_index i1;
profil_list.item i1.set_life_index i2;
profil_list.swap i1 with i2;
);
- clean <-
(
reduce_profil := profil_list.upper >= life_limit;
{profil_list.upper >= life_limit}.while_do {
profil_list.last.remove;
profil_list.remove_last;
};
);
Section Public
- reduce_profil:BOOLEAN := TRUE;
- add p:PROFIL <-
(
(p.is_external).if {
profil_list.add_first p;
life_limit_base := life_limit_base + 1;
p.set_life_index (profil_list.lower);
(profil_list.lower+1).to (profil_list.upper) do { i:INTEGER;
profil_list.item i.set_life_index i;
};
} else {
profil_list.add_last p;
p.set_life_index (profil_list.upper);
};
);
- set_life p:PROFIL <-
[
-? { p.life_index != -1 };
-? { profil_list.item (p.life_index) = p };
]
( + idx:INTEGER;
idx := p.life_index;
(idx = life_limit).if {
life_limit := life_limit + 1;
}.elseif {idx > life_limit} then {
swap idx with life_limit;
life_limit := life_limit + 1;
};
)
[
+? { profil_list.item (p.life_index) = p };
+? { p.life_index < life_limit };
];
- unset_life p:PROFIL <-
[
-? { p.life_index != -1 };
]
( + idx:INTEGER;
idx := p.life_index;
(idx < life_limit).if {
life_limit := life_limit - 1;
(idx < life_limit).if {
(idx > current).if {
swap idx with life_limit;
} else {
swap idx with current;
swap current with life_limit;
current := current - 1;
};
};
};
);
- remove p:PROFIL <-
[
-? { p.life_index != -1 };
]
( + idx:INTEGER;
unset_life p;
idx := p.life_index;
(idx != profil_list.upper).if {
swap idx with (profil_list.upper);
};
profil_list.remove_last;
// Debug.
! {p.set_life_index (-1)};
);
- execute_pass_recursive <-
(
(profil_list.lower).to (profil_list.upper) do { i:INTEGER;
profil_list.item i.reset_recursive;
};
VARIABLE.update;
life_limit := life_limit_base;
PROFIL.set_mode_recursive TRUE;
profil_current := profil_slot := NULL;
list_current := NULL;
list_main.execute;
PROFIL.set_mode_recursive FALSE;
clean;
reduce_profil := TRUE;
);
- inline_level_current:INTEGER := 3;
- execute_pass <-
(
VARIABLE.update;
life_limit := life_limit_base;
profil_slot := NULL;
list_current := NULL;
list_main.execute;
current := profil_list.lower;
{current < life_limit}.while_do {
profil_current := profil_list.item current;
profil_current.execute inline_level_current;
current := current + 1;
};
current := 0;
clean;
((! reduce_profil) && {inline_level_current < inline_level}).if {
inline_level_current := inline_level_current + 3;
new_execute_pass;
};
(TYPE.is_alias_struct).if {
TYPE.detect_alias;
TYPE_GENERIC.detect_alias;
};
);
//
// Genere.
//
- genere_handler buffer:STRING <-
(
(profil_list.lower).to (profil_list.upper) do { j:INTEGER;
profil_list.item j.genere_handler buffer;
};
);
- genere buffer:STRING <-
(
(profil_list.lower).to (profil_list.upper) do { j:INTEGER;
profil_list.item j.genere buffer;
};
);
//
// Display.
//
- display <-
(
string_tmp.clear;
(profil_list.upper).downto (profil_list.lower) do { j:INTEGER;
profil_list.item j.display_all string_tmp;
};
string_tmp.print;
);