------------------------------------------------------------------------------ -- -- -- OCARINA COMPONENTS -- -- -- -- OCARINA.CHECKER.QUERIES.RELATIONAL_PREDICATES -- -- -- -- B o d y -- -- -- -- Copyright (C) 2007, GET-Telecom Paris. -- -- -- -- Ocarina 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 2, or (at your option) any -- -- later version. Ocarina 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 Ocarina; see file COPYING. -- -- If not, write to the Free Software Foundation, 51 Franklin Street, Fifth -- -- Floor, Boston, MA 02111-1301, USA. -- -- -- -- As a special exception, if other files instantiate generics from this -- -- unit, or you link this unit with other files to produce an executable, -- -- this unit does not by itself cause the resulting executable to be -- -- covered by the GNU General Public License. This exception does not -- -- however invalidate any other reasons why the executable file might be -- -- covered by the GNU Public License. -- -- -- -- Ocarina is maintained by the Ocarina team -- -- (ocarina-users@listes.enst.fr) -- -- -- ------------------------------------------------------------------------------ with Ocarina.Nodes; package body Ocarina.Checker.Queries.Relational_Predicates is --------------------------------------- -- Get_Instances_Verifying_Predicate -- --------------------------------------- function Get_Instances_Verifying_Predicate (D : Node_Id; Option : Predicates_Search_Options := PSO_Direct) return Result_Set is use Ocarina.Nodes; Result : Result_Set; begin for N in 1 .. Entries.Last loop if Predicate (N, D, Option) then Result.Cardinal := Result.Cardinal + 1; Result.Elements (Result.Cardinal) := N; end if; end loop; return Result; end Get_Instances_Verifying_Predicate; --------------------------------------- -- Get_Instances_Verifying_Predicate -- --------------------------------------- function Get_Instances_Verifying_Predicate (Set : Result_Set; D : Node_Id; Option : Predicates_Search_Options := PSO_Direct) return Result_Set is Result : Result_Set; begin for N in 1 .. Set.Cardinal loop if Predicate (Set.Elements (N), D, Option) then Result.Cardinal := Result.Cardinal + 1; Result.Elements (Result.Cardinal) := Set.Elements (N); end if; end loop; return Result; end Get_Instances_Verifying_Predicate; ----------- -- Apply -- ----------- function Apply (Set_1 : Result_Set; Set_2 : Result_Set; Reversed : Boolean := False; Distinct : Boolean := False; Option : Predicates_Search_Options := PSO_Direct) return Result_Set is M : Cardinal_Size; Result : Result_Set; Found : Boolean; begin for N in 1 .. Set_1.Cardinal loop M := 1; Found := False; while M < (Set_2.Cardinal + 1) and then (not Distinct or else not found) loop if Predicate (Set_1.Elements (N), Set_2.Elements (M), Option) then Result.Cardinal := Result.Cardinal + 1; if not Reversed then Result.Elements (Result.Cardinal) := Set_1.Elements (N); else Result.Elements (Result.Cardinal) := Set_2.Elements (M); end if; Found := True; end if; M := M + 1; end loop; end loop; return Result; end Apply; end Ocarina.Checker.Queries.Relational_Predicates;