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 | --
-- Copyright (C) 2019-2023, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-Exception
--
-- This container is designed to contain the set of imports for a specific
-- project. It is used to detect duplicate imported projects in with clauses
-- for example. We also have fast check/access for any imported project name.
with Ada.Iterator_Interfaces;
with GPR2.Containers;
private with Ada.Containers.Indefinite_Ordered_Maps;
package GPR2.Project.Import.Set is
type Object is tagged private
with Constant_Indexing => Constant_Reference,
Default_Iterator => Iterate,
Iterator_Element => Project.Import.Object;
function Is_Empty (Self : Object) return Boolean;
procedure Clear (Self : in out Object);
function Length (Self : Object) return Containers.Count_Type;
procedure Insert (Self : in out Object; Import : Project.Import.Object);
procedure Delete (Self : in out Object; Path_Name : GPR2.Path_Name.Object)
with Pre => Self.Contains (Path_Name);
function Contains
(Self : Object; Path_Name : GPR2.Path_Name.Object) return Boolean;
function Contains (Self : Object; Base_Name : Name_Type) return Boolean;
function Element
(Self : Object; Base_Name : Name_Type) return Import.Object
with Pre => Self.Contains (Base_Name);
function Element
(Self : Object; Path_Name : GPR2.Path_Name.Object) return Import.Object
with Pre => Self.Contains (Path_Name);
type Cursor is private;
No_Element : constant Cursor;
function Find
(Self : Object; Path_Name : GPR2.Path_Name.Object) return Cursor;
function Find
(Self : Object; Base_Name : Name_Type) return Cursor;
function Element (Position : Cursor) return Project.Import.Object
with Post =>
(if Has_Element (Position)
then Element'Result.Is_Defined
else not Element'Result.Is_Defined);
function Has_Element (Position : Cursor) return Boolean;
package Import_Iterator is
new Ada.Iterator_Interfaces (Cursor, Has_Element);
type Constant_Reference_Type
(Import : not null access constant Project.Import.Object) is private
with Implicit_Dereference => Import;
function Constant_Reference
(Self : aliased Object;
Position : Cursor) return Constant_Reference_Type;
function Iterate
(Self : Object) return Import_Iterator.Forward_Iterator'Class;
private
package Base_Name_Set is new Ada.Containers.Indefinite_Ordered_Maps
(Name_Type, Project.Import.Object);
type Object is tagged record
Set : Base_Name_Set.Map;
end record;
type Cursor is record
Current : Base_Name_Set.Cursor;
end record;
No_Element : constant Cursor :=
Cursor'(Current => Base_Name_Set.No_Element);
type Constant_Reference_Type
(Import : not null access constant Project.Import.Object) is record
-- We need to keep the underlying reference so that it is not cleared
-- upon return of the getter, and so that the container has the proper
-- busy state
Ref : Base_Name_Set.Constant_Reference_Type (Import);
end record;
function Find
(Self : Object; Path_Name : GPR2.Path_Name.Object) return Cursor
is
((Current => Self.Set.Find (Path_Name.Base_Name)));
function Find
(Self : Object; Base_Name : Name_Type) return Cursor
is
((Current => Self.Set.Find (Base_Name)));
end GPR2.Project.Import.Set;
|