------------------------------------------------------------------------------ -- -- -- TGen -- -- -- -- Copyright (C) 2023, AdaCore -- -- -- -- TGen is free software; you can redistribute it and/or modify it under -- -- 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. This software 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. -- -- -- -- As a special exception under Section 7 of GPL version 3, you are -- -- granted additional permissions described in the GCC Runtime Library -- -- Exception, version 3.1, as published by the Free Software Foundation. -- -- -- -- You should have received a copy of the GNU General Public License and a -- -- copy of the GCC Runtime Library Exception along with this program; see -- -- the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -- . -- ------------------------------------------------------------------------------ with Ada.Containers.Ordered_Maps; with TGen.Context; use TGen.Context; with TGen.Types; use TGen.Types; package TGen.Dependency_Graph is package Typ_Maps is new Ada.Containers.Ordered_Maps (Key_Type => SP.Ref, Element_Type => Typ_Set, "=" => Typ_Sets."="); subtype Typ_Map is Typ_Maps.Map; function Type_Dependencies (T : SP.Ref; Transitive : Boolean := False) return Typ_Set; -- Return all the types that T needs to have visibility on (i.e. index/ -- component / discriminant types). If transitive is True, this returns -- the transitive closure of types on which self depends. type Graph_Type is record Nodes : Typ_Set; Succ, Pred : Typ_Map; end record; procedure Create_Node (G : in out Graph_Type; New_Node : SP.Ref); procedure Create_Edge (G : in out Graph_Type; From, To : SP.Ref) with Pre => G.Nodes.Contains (From) and then G.Nodes.Contains (To); procedure Traverse (G : Graph_Type; Callback : access procedure (N : SP.Ref)); -- Traverse the graph in the topological order and call callback on every -- node. function Sort (Types : Typ_Sets.Set) return Typ_List; -- Sort the types in their dependency order end TGen.Dependency_Graph;