+2012-01-10 Pascal Obry <obry@adacore.com>
+
+ * prj-nmsc.adb (Check_Library_Attributes):
+ Kill check for object/source directories for aggregate libraries.
+
+2012-01-10 Matthew Heaney <heaney@adacore.com>
+
+ * a-cdlili.adb, a-cdlili.ads, a-cihama.adb, a-cihama.ads, a-coinve.adb,
+ a-coinve.ads, a-ciorse.adb, a-ciorse.ads, a-coorma.adb, a-coorma.ads,
+ a-cborma.adb, a-cborma.ads, a-cidlli.adb, a-cidlli.ads, a-cimutr.adb,
+ a-cimutr.ads, a-cihase.adb, a-cihase.ads, a-cohama.adb, a-cohama.ads,
+ a-coorse.adb, a-coorse.ads, a-cbhama.adb, a-cbhama.ads, a-cborse.adb,
+ a-cborse.ads, a-comutr.adb, a-comutr.ads, a-ciorma.adb, a-cobove.adb,
+ a-ciorma.ads, a-cobove.ads, a-convec.adb, a-convec.ads, a-cohase.adb,
+ a-cohase.ads, a-cbdlli.adb, a-cbdlli.ads, a-cbmutr.adb, a-cbmutr.ads,
+ a-cbhase.adb, a-cbhase.ads (Reference, Constant_Reference): Declare
+ container parameter as aliased in/in out.
+ Code clean ups.
+
+2012-01-10 Bob Duff <duff@adacore.com>
+
+ * s-os_lib.ads: Improve comment.
+
+2012-01-10 Geert Bosch <bosch@adacore.com>
+
+ * s-gearop.adb (Forward_Eliminate): Avoid improper aliasing
+ for complex Scalar.
+
2012-01-10 Bob Duff <duff@adacore.com>
* sem_intr.adb (Check_Shift): Use RM_Size instead of Esize, when
Free (Container, X);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased List;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in Constant_Reference");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : List;
- Position : Cursor) return Constant_Reference_Type
- is
- begin
- pragma Unreferenced (Container);
-
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element =>
- Position.Container.Nodes (Position.Node).Element'Unrestricted_Access);
- end Constant_Reference;
-
function Reference
- (Container : List;
+ (Container : aliased in out List;
Position : Cursor) return Reference_Type
is
begin
- pragma Unreferenced (Container);
-
if Position.Container = null then
raise Constraint_Error with "Position cursor has no element";
end if;
- return (Element =>
- Position.Container.Nodes (Position.Node).Element'Unrestricted_Access);
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in function Reference");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
end Reference;
---------------------
Position : Cursor;
Process : not null access procedure (Element : in out Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ type Reference_Type
+ (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ function Constant_Reference
+ (Container : aliased List;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out List;
+ Position : Cursor) return Reference_Type;
+
procedure Assign (Target : in out List; Source : List);
function Copy (Source : List; Capacity : Count_Type := 0) return List;
end Generic_Sorting;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- type Reference_Type (Element : not null access Element_Type) is
- private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- function Constant_Reference
- (Container : List; -- SHOULD BE ALIASED ???
- Position : Cursor) return Constant_Reference_Type;
-
- function Reference
- (Container : List; -- SHOULD BE ALIASED ???
- Position : Cursor) return Reference_Type;
-
private
pragma Inline (Next);
type Node_Type is record
Prev : Count_Type'Base;
Next : Count_Type;
- Element : Element_Type;
+ Element : aliased Element_Type;
end record;
type Node_Array is array (Count_Type range <>) of Node_Type;
HT_Ops.Clear (Container);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert (Vet (Position),
+ "Position cursor in Constant_Reference is bad");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
+ function Constant_Reference
+ (Container : Map;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Count_Type := Key_Ops.Find (Container, Key);
+
+ begin
+ if Node = 0 then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference (Container : Map; Key : Key_Type)
- return Constant_Reference_Type is
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type
+ is
begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
- end Constant_Reference;
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert (Vet (Position),
+ "Position cursor in function Reference is bad");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Reference;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Count_Type := Key_Ops.Find (Container, Key);
- function Reference (Container : Map; Key : Key_Type)
- return Reference_Type is
begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
+ if Node = 0 then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
end Reference;
-------------
-- Calls Process with the key (with only a constant view) and element (with
-- a variable view) of the node designed by the cursor.
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is
+ private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ type Reference_Type (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type;
+
procedure Assign (Target : in out Map; Source : Map);
-- If Target denotes the same object as Source, then the operation has no
-- effect. If the Target capacity is less then the Source length, then
function Iterate (Container : Map)
return Map_Iterator_Interfaces.Forward_Iterator'class;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is
- private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- type Reference_Type (Element : not null access Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- function Constant_Reference
- (Container : Map;
- Key : Key_Type) -- SHOULD BE ALIASED???
- return Constant_Reference_Type;
-
- function Reference (Container : Map; Key : Key_Type) return Reference_Type;
-
private
pragma Inline (Length);
pragma Inline (Is_Empty);
type Node_Type is record
Key : Key_Type;
- Element : Element_Type;
+ Element : aliased Element_Type;
Next : Count_Type;
end record;
HT_Ops.Clear (Container);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in Constant_Reference");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
raise Program_Error with "attempt to stream reference";
end Read;
- ---------------
- -- Reference --
- ---------------
-
- function Constant_Reference
- (Container : aliased Set;
- Position : Cursor) return Constant_Reference_Type
- is
- pragma Unreferenced (Container);
- S : Set renames Position.Container.all;
- N : Node_Type renames S.Nodes (Position.Node);
- begin
- return (Element => N.Element'Unrestricted_Access);
- end Constant_Reference;
-
-------------
-- Replace --
-------------
Hash => Hash,
Equivalent_Keys => Equivalent_Key_Node);
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Count_Type := Key_Keys.Find (Container, Key);
+
+ begin
+ if Node = 0 then
+ raise Constraint_Error with "key not in set";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
return Key (Position.Container.Nodes (Position.Node).Element);
end Key;
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type)
+ is
+ begin
+ raise Program_Error with "attempt to stream reference";
+ end Read;
+
+ ------------------------------
+ -- Reference_Preserving_Key --
+ ------------------------------
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Position : Cursor) return Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert
+ (Vet (Position),
+ "bad cursor in function Reference_Preserving_Key");
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Position has
+ -- not changed. ???
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Reference_Preserving_Key;
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Count_Type := Key_Keys.Find (Container, Key);
+
+ begin
+ if Node = 0 then
+ raise Constraint_Error with "key not in set";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Reference_Preserving_Key;
+
-------------
-- Replace --
-------------
raise Program_Error with "key was modified";
end Update_Element_Preserving_Key;
- ------------------------------
- -- Reference_Preserving_Key --
- ------------------------------
-
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Position : Cursor) return Reference_Type
- is
- N : Node_Type renames Container.Nodes (Position.Node);
- begin
- return (Element => N.Element'Unrestricted_Access);
- end Reference_Preserving_Key;
+ -----------
+ -- Write --
+ -----------
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Reference_Type
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type)
is
- Position : constant Cursor := Find (Container, Key);
- N : Node_Type renames Container.Nodes (Position.Node);
begin
- return (Element => N.Element'Unrestricted_Access);
- end Reference_Preserving_Key;
+ raise Program_Error with "attempt to stream reference";
+ end Write;
end Generic_Keys;
(Container : aliased in out Set;
Position : Cursor) return Reference_Type;
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type;
+
function Reference_Preserving_Key
(Container : aliased in out Set;
Key : Key_Type) return Reference_Type;
type Reference_Type (Element : not null access Element_Type)
is null record;
+ use Ada.Streams;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
end Generic_Keys;
private
pragma Inline (Next);
type Node_Type is record
- Element : Element_Type;
+ Element : aliased Element_Type;
Next : Count_Type;
end record;
pragma Assert (Count = Container_Count);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Tree;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node = Root_Node (Container) then
+ raise Program_Error with "Position cursor designates root";
+ end if;
+
+ -- Implement Vet for multiway tree???
+ -- pragma Assert (Vet (Position),
+ -- "Position cursor in Constant_Reference is bad");
+
+ return (Element => Container.Elements (Position.Node)'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : aliased Tree;
- Position : Cursor) return Constant_Reference_Type
- is
- pragma Unreferenced (Container);
- begin
- return
- (Element =>
- Position.Container.Elements (Position.Node)'Unchecked_Access);
- end Constant_Reference;
-
function Reference
- (Container : aliased Tree;
+ (Container : aliased in out Tree;
Position : Cursor) return Reference_Type
is
- pragma Unreferenced (Container);
begin
- return
- (Element =>
- Position.Container.Elements (Position.Node)'Unchecked_Access);
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node = Root_Node (Container) then
+ raise Program_Error with "Position cursor designates root";
+ end if;
+
+ -- Implement Vet for multiway tree???
+ -- pragma Assert (Vet (Position),
+ -- "Position cursor in Constant_Reference is bad");
+
+ return (Element => Container.Elements (Position.Node)'Access);
end Reference;
--------------------
(Element : not null access Element_Type) is private
with Implicit_Dereference => Element;
+ function Constant_Reference
+ (Container : aliased Tree;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Tree;
+ Position : Cursor) return Reference_Type;
+
procedure Assign (Target : in out Tree; Source : Tree);
function Copy (Source : Tree; Capacity : Count_Type := 0) return Tree;
type Reference_Type
(Element : not null access Element_Type) is null record;
+
procedure Write
(Stream : not null access Root_Stream_Type'Class;
Item : Reference_Type);
Item : out Reference_Type);
for Reference_Type'Read use Read;
- function Constant_Reference
- (Container : aliased Tree;
- Position : Cursor) return Constant_Reference_Type;
-
- function Reference
- (Container : aliased Tree;
- Position : Cursor) return Reference_Type;
-
Empty_Tree : constant Tree := (Capacity => 0, others => <>);
No_Element : constant Cursor := Cursor'(others => <>);
return Node.Color;
end Color;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert (Vet (Container, Position.Node),
+ "Position cursor in Constant_Reference is bad");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
+ function Constant_Reference
+ (Container : Map;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Count_Type := Key_Ops.Find (Container, Key);
+
+ begin
+ if Node = 0 then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : Map;
- Key : Key_Type) return Constant_Reference_Type
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type
is
begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
- end Constant_Reference;
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert (Vet (Container, Position.Node),
+ "Position cursor in function Reference is bad");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Reference;
function Reference
- (Container : Map;
+ (Container : aliased in out Map;
Key : Key_Type) return Reference_Type
is
+ Node : constant Count_Type := Key_Ops.Find (Container, Key);
+
begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
+ if Node = 0 then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
end Reference;
-------------
function Equivalent_Keys (Left, Right : Key_Type) return Boolean;
type Map (Capacity : Count_Type) is tagged private with
- constant_Indexing => Constant_Reference,
+ Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type;
Process : not null access
procedure (Key : Key_Type; Element : in out Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ type Reference_Type (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type;
+
procedure Assign (Target : in out Map; Source : Map);
function Copy (Source : Map; Capacity : Count_Type := 0) return Map;
function ">" (Left : Key_Type; Right : Cursor) return Boolean;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- type Reference_Type (Element : not null access Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- function Constant_Reference
- (Container : Map;
- Key : Key_Type) -- SHOULD BE ALIASED ???
- return Constant_Reference_Type;
-
- function Reference (Container : Map; Key : Key_Type) return Reference_Type;
-
procedure Iterate
(Container : Map;
Process : not null access procedure (Position : Cursor));
Right : Count_Type;
Color : Red_Black_Trees.Color_Type := Red_Black_Trees.Red;
Key : Key_Type;
- Element : Element_Type;
+ Element : aliased Element_Type;
end record;
package Tree_Types is
return Node.Color;
end Color;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert
+ (Vet (Container, Position.Node),
+ "bad cursor in Constant_Reference");
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
else Cursor'(Container'Unrestricted_Access, Node));
end Ceiling;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Count_Type := Key_Keys.Find (Container, Key);
+
+ begin
+ if Node = 0 then
+ raise Constraint_Error with "key not in set";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
return Key (Position.Container.Nodes (Position.Node).Element);
end Key;
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type)
+ is
+ begin
+ raise Program_Error with "attempt to stream reference";
+ end Read;
+
+ ------------------------------
+ -- Reference_Preserving_Key --
+ ------------------------------
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Position : Cursor) return Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert
+ (Vet (Container, Position.Node),
+ "bad cursor in function Reference_Preserving_Key");
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Position has
+ -- not changed. ???
+
+ declare
+ N : Node_Type renames Container.Nodes (Position.Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Reference_Preserving_Key;
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Count_Type := Key_Keys.Find (Container, Key);
+
+ begin
+ if Node = 0 then
+ raise Constraint_Error with "key not in set";
+ end if;
+
+ declare
+ N : Node_Type renames Container.Nodes (Node);
+ begin
+ return (Element => N.Element'Access);
+ end;
+ end Reference_Preserving_Key;
+
-------------
-- Replace --
-------------
raise Program_Error with "key was modified";
end Update_Element_Preserving_Key;
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Constant_Reference_Type
- is
- Position : constant Cursor := Find (Container, Key);
-
- begin
- if Position.Node = 0 then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return
- (Element =>
- Container.Nodes (Position.Node).Element'Unrestricted_Access);
- end Reference_Preserving_Key;
-
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Reference_Type
- is
- Position : constant Cursor := Find (Container, Key);
-
- begin
- if Position.Node = 0 then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return
- (Element =>
- Container.Nodes (Position.Node).Element'Unrestricted_Access);
- end Reference_Preserving_Key;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type)
- is
- begin
- raise Program_Error with "attempt to stream reference";
- end Read;
+ -----------
+ -- Write --
+ -----------
procedure Write
(Stream : not null access Root_Stream_Type'Class;
raise Program_Error with "attempt to stream reference";
end Read;
- ---------------
- -- Reference --
- ---------------
-
- function Constant_Reference (Container : Set; Position : Cursor)
- return Constant_Reference_Type
- is
- begin
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element =>
- Container.Nodes (Position.Node).Element'Unrestricted_Access);
- end Constant_Reference;
-
-------------
-- Replace --
-------------
package Set_Iterator_Interfaces is new
Ada.Iterator_Interfaces (Cursor, Has_Element);
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is
- private
- with
- Implicit_Dereference => Element;
-
- function Constant_Reference
- (Container : Set; Position : Cursor)
- return Constant_Reference_Type;
-
function "=" (Left, Right : Set) return Boolean;
function Equivalent_Sets (Left, Right : Set) return Boolean;
(Position : Cursor;
Process : not null access procedure (Element : Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is
+ private
+ with
+ Implicit_Dereference => Element;
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type;
+
procedure Assign (Target : in out Set; Source : Set);
function Copy (Source : Set; Capacity : Count_Type := 0) return Set;
function Reference_Preserving_Key
(Container : aliased in out Set;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Set;
Key : Key_Type) return Constant_Reference_Type;
function Reference_Preserving_Key
Left : Count_Type;
Right : Count_Type;
Color : Red_Black_Trees.Color_Type := Red_Black_Trees.Red;
- Element : Element_Type;
+ Element : aliased Element_Type;
end record;
package Tree_Types is
pragma Warnings (On);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased List;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in Constant_Reference");
+
+ return (Element => Position.Node.Element'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : List;
- Position : Cursor) return Constant_Reference_Type
- is
- begin
- pragma Unreferenced (Container);
-
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element => Position.Node.Element'Access);
- end Constant_Reference;
-
function Reference
- (Container : List;
+ (Container : aliased in out List;
Position : Cursor) return Reference_Type
is
begin
- pragma Unreferenced (Container);
-
if Position.Container = null then
raise Constraint_Error with "Position cursor has no element";
end if;
+ if Position.Container /= Container'Unchecked_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in function Reference");
+
return (Element => Position.Node.Element'Access);
end Reference;
Position : Cursor;
Process : not null access procedure (Element : in out Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ type Reference_Type
+ (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ function Constant_Reference
+ (Container : aliased List;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out List;
+ Position : Cursor) return Reference_Type;
+
procedure Assign (Target : in out List; Source : List);
function Copy (Source : List) return List;
end Generic_Sorting;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- type Reference_Type (Element : not null access Element_Type) is
- private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- function Constant_Reference
- (Container : List; Position : Cursor) -- SHOULD BE ALIASED
- return Constant_Reference_Type;
-
- function Reference
- (Container : List; Position : Cursor) -- SHOULD BE ALIASED
- return Reference_Type;
-
private
pragma Inline (Next);
Free (X);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased List;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in Constant_Reference");
+
+ return (Element => Position.Node.Element.all'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference (Container : List; Position : Cursor)
- return Constant_Reference_Type is
+ function Reference
+ (Container : aliased in out List;
+ Position : Cursor) return Reference_Type
+ is
begin
- pragma Unreferenced (Container);
-
if Position.Container = null then
raise Constraint_Error with "Position cursor has no element";
end if;
- return (Element => Position.Node.Element.all'Access);
- end Constant_Reference;
-
- function Reference (Container : List; Position : Cursor)
- return Reference_Type is
- begin
- pragma Unreferenced (Container);
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
end if;
+ pragma Assert (Vet (Position), "bad cursor in function Reference");
+
return (Element => Position.Node.Element.all'Access);
end Reference;
Position : Cursor;
Process : not null access procedure (Element : in out Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ type Reference_Type
+ (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ function Constant_Reference
+ (Container : aliased List;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out List;
+ Position : Cursor) return Reference_Type;
+
procedure Assign (Target : in out List; Source : List);
function Copy (Source : List) return List;
Start : Cursor)
return List_Iterator_Interfaces.Reversible_Iterator'class;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- type Reference_Type (Element : not null access Element_Type) is
- private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- function Constant_Reference
- (Container : List;
- Position : Cursor) -- SHOULD BE ALIASED ???
- return Constant_Reference_Type;
-
- function Reference
- (Container : List;
- Position : Cursor) -- SHOULD BE ALIASED ???
- return Reference_Type;
-
generic
with function "<" (Left, Right : Element_Type) return Boolean is <>;
package Generic_Sorting is
HT_Ops.Clear (Container.HT);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with
+ "Position cursor has no element";
+ end if;
+
+ pragma Assert
+ (Vet (Position),
+ "Position cursor in Constant_Reference is bad");
+
+ return (Element => Position.Node.Element.all'Access);
+ end Constant_Reference;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Node_Access := Key_Ops.Find (Container.HT, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "key has no element";
+ end if;
+
+ return (Element => Node.Element.all'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : Map;
- Key : Key_Type) return Constant_Reference_Type
- is
- begin
- return (Element =>
- Container.Find (Key).Node.Element.all'Unrestricted_Access);
- end Constant_Reference;
-
function Reference
- (Container : Map;
- Key : Key_Type) return Reference_Type
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type
is
begin
- return (Element =>
- Container.Find (Key).Node.Element.all'Unrestricted_Access);
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with
+ "Position cursor has no element";
+ end if;
+
+ pragma Assert
+ (Vet (Position),
+ "Position cursor in function Reference is bad");
+
+ return (Element => Position.Node.Element.all'Access);
end Reference;
function Reference
(Container : aliased in out Map;
- Position : Cursor) return Reference_Type
+ Key : Key_Type) return Reference_Type
is
- pragma Unreferenced (Container);
+ Node : constant Node_Access := Key_Ops.Find (Container.HT, Key);
+
begin
- return (Element => Element (Position)'Unrestricted_Access);
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "key has no element";
+ end if;
+
+ return (Element => Node.Element.all'Access);
end Reference;
-------------
-- Calls Process with the key (with only a constant view) and element (with
-- a variable view) of the node designed by the cursor.
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ type Reference_Type (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type;
+
procedure Assign (Target : in out Map; Source : Map);
function Copy (Source : Map; Capacity : Count_Type := 0) return Map;
-- Returns the result of calling Equivalent_Keys with key Left and the node
-- designated by Right.
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- type Reference_Type (Element : not null access Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- function Constant_Reference
- (Container : Map;
- Key : Key_Type) -- SHOULD BE ALIASED ???
- return Constant_Reference_Type;
-
- function Reference
- (Container : Map;
- Key : Key_Type) return Reference_Type;
-
- function Reference
- (Container : aliased in out Map;
- Position : Cursor) return Reference_Type;
-
procedure Iterate
(Container : Map;
Process : not null access procedure (Position : Cursor));
HT_Ops.Clear (Container.HT);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in Constant_Reference");
+
+ return (Element => Position.Node.Element.all'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
raise;
end Read_Node;
- ---------------
- -- Reference --
- ---------------
-
- function Constant_Reference
- (Container : aliased Set;
- Position : Cursor) return Constant_Reference_Type
- is
- pragma Unreferenced (Container);
- begin
- return (Element => Position.Node.Element.all'Access);
- end Constant_Reference;
-
-------------
-- Replace --
-------------
Hash => Hash,
Equivalent_Keys => Equivalent_Key_Node);
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.HT, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "Key not in set";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ return (Element => Node.Element.all'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
return Key (Position.Node.Element.all);
end Key;
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type)
+ is
+ begin
+ raise Program_Error with "attempt to stream reference";
+ end Read;
+
+ ------------------------------
+ -- Reference_Preserving_Key --
+ ------------------------------
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Position : Cursor) return Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ pragma Assert
+ (Vet (Position),
+ "bad cursor in function Reference_Preserving_Key");
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Position has
+ -- not changed. ???
+
+ return (Element => Position.Node.Element.all'Access);
+ end Reference_Preserving_Key;
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.HT, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "Key not in set";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Key has not
+ -- changed. ???
+
+ return (Element => Node.Element.all'Access);
+ end Reference_Preserving_Key;
+
-------------
-- Replace --
-------------
Replace_Element (Container.HT, Node, New_Item);
end Replace;
+ -----------------------------------
+ -- Update_Element_Preserving_Key --
+ -----------------------------------
+
procedure Update_Element_Preserving_Key
(Container : in out Set;
Position : Cursor;
raise Program_Error with "key was modified";
end Update_Element_Preserving_Key;
- ------------------------------
- -- Reference_Preserving_Key --
- ------------------------------
-
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Position : Cursor) return Reference_Type
- is
- pragma Unreferenced (Container);
- begin
- return (Element => Position.Node.Element.all'Access);
- end Reference_Preserving_Key;
+ -----------
+ -- Write --
+ -----------
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Reference_Type
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type)
is
- Position : constant Cursor := Find (Container, Key);
begin
- return (Element => Position.Node.Element.all'Access);
- end Reference_Preserving_Key;
+ raise Program_Error with "attempt to stream reference";
+ end Write;
end Generic_Keys;
function Constant_Reference
(Container : aliased Set;
- Position : Cursor)
- return Constant_Reference_Type;
+ Position : Cursor) return Constant_Reference_Type;
procedure Assign (Target : in out Set; Source : Set);
(Container : aliased in out Set;
Position : Cursor) return Reference_Type;
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type;
+
function Reference_Preserving_Key
(Container : aliased in out Set;
Key : Key_Type) return Reference_Type;
private
type Reference_Type (Element : not null access Element_Type)
is null record;
+
+ use Ada.Streams;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
end Generic_Keys;
private
pragma Assert (Children_Count = Container_Count);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Tree;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node = Root_Node (Container) then
+ raise Program_Error with "Position cursor designates root";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ -- Implement Vet for multiway tree???
+ -- pragma Assert (Vet (Position),
+ -- "Position cursor in Constant_Reference is bad");
+
+ return (Element => Position.Node.Element.all'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : aliased Tree;
- Position : Cursor) return Constant_Reference_Type
- is
- begin
- pragma Unreferenced (Container);
-
- return (Element => Position.Node.Element.all'Unchecked_Access);
- end Constant_Reference;
-
function Reference
- (Container : aliased Tree;
+ (Container : aliased in out Tree;
Position : Cursor) return Reference_Type
is
begin
- pragma Unreferenced (Container);
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node = Root_Node (Container) then
+ raise Program_Error with "Position cursor designates root";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ -- Implement Vet for multiway tree???
+ -- pragma Assert (Vet (Position),
+ -- "Position cursor in Constant_Reference is bad");
- return (Element => Position.Node.Element.all'Unchecked_Access);
+ return (Element => Position.Node.Element.all'Access);
end Reference;
--------------------
(Element : not null access Element_Type) is private
with Implicit_Dereference => Element;
+ function Constant_Reference
+ (Container : aliased Tree;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Tree;
+ Position : Cursor) return Reference_Type;
+
procedure Assign (Target : in out Tree; Source : Tree);
function Copy (Source : Tree) return Tree;
for Reference_Type'Write use Write;
- function Constant_Reference
- (Container : aliased Tree;
- Position : Cursor) return Constant_Reference_Type;
-
- function Reference
- (Container : aliased Tree;
- Position : Cursor) return Reference_Type;
-
Empty_Tree : constant Tree := (Controlled with others => <>);
No_Element : constant Cursor := (others => <>);
-- Constant_Reference --
------------------------
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ pragma Assert (Vet (Container.Tree, Position.Node),
+ "Position cursor in Constant_Reference is bad");
+
+ return (Element => Position.Node.Element.all'Access);
+ end Constant_Reference;
+
function Constant_Reference
(Container : Map;
Key : Key_Type) return Constant_Reference_Type
is
- Node : aliased Element_Type := Element (Container, Key);
+ Node : constant Node_Access := Key_Ops.Find (Container.Tree, Key);
+
begin
- return (Element => Node'Access);
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ return (Element => Node.Element.all'Access);
end Constant_Reference;
--------------
---------------
function Reference
- (Container : Map;
- Key : Key_Type)
- return Reference_Type
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type
is
- Node : aliased Element_Type := Element (Container, Key);
begin
- return (Element => Node'Access);
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ pragma Assert (Vet (Container.Tree, Position.Node),
+ "Position cursor in function Reference is bad");
+
+ return (Element => Position.Node.Element.all'Access);
+ end Reference;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Node_Access := Key_Ops.Find (Container.Tree, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ return (Element => Node.Element.all'Access);
end Reference;
-------------
function Equivalent_Keys (Left, Right : Key_Type) return Boolean;
type Map is tagged private
- with constant_Indexing => Constant_Reference,
+ with Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type;
Process : not null access procedure (Key : Key_Type;
Element : in out Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ type Reference_Type (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type;
+
procedure Assign (Target : in out Map; Source : Map);
function Copy (Source : Map) return Map;
function ">" (Left : Key_Type; Right : Cursor) return Boolean;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- type Reference_Type (Element : not null access Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- function Constant_Reference
- (Container : Map;
- Key : Key_Type) return Constant_Reference_Type;
-
- function Reference
- (Container : Map;
- Key : Key_Type) return Reference_Type;
-
procedure Iterate
(Container : Map;
Process : not null access procedure (Position : Cursor));
return Node.Color;
end Color;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ pragma Assert
+ (Vet (Container.Tree, Position.Node),
+ "bad cursor in Constant_Reference");
+
+ return (Element => Position.Node.Element.all'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
else Cursor'(Container'Unrestricted_Access, Node));
end Ceiling;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.Tree, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "Key not in set";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ return (Element => Node.Element.all'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
Replace_Element (Container.Tree, Node, New_Item);
end Replace;
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type)
+ is
+ begin
+ raise Program_Error with "attempt to stream reference";
+ end Read;
+
+ ------------------------------
+ -- Reference_Preserving_Key --
+ ------------------------------
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Position : Cursor) return Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ pragma Assert
+ (Vet (Container.Tree, Position.Node),
+ "bad cursor in function Reference_Preserving_Key");
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Position has
+ -- not changed. ???
+
+ return (Element => Position.Node.Element.all'Access);
+ end Reference_Preserving_Key;
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.Tree, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "Key not in set";
+ end if;
+
+ if Node.Element = null then
+ raise Program_Error with "Node has no element";
+ end if;
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Key has not
+ -- changed. ???
+
+ return (Element => Node.Element.all'Access);
+ end Reference_Preserving_Key;
+
-----------------------------------
-- Update_Element_Preserving_Key --
-----------------------------------
raise Program_Error with "key was modified";
end Update_Element_Preserving_Key;
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Constant_Reference_Type
- is
- Position : constant Cursor := Find (Container, Key);
-
- begin
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element => Position.Node.Element);
- end Reference_Preserving_Key;
-
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Reference_Type
- is
- Position : constant Cursor := Find (Container, Key);
-
- begin
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element => Position.Node.Element);
- end Reference_Preserving_Key;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type)
- is
- begin
- raise Program_Error with "attempt to stream reference";
- end Read;
+ -----------
+ -- Write --
+ -----------
procedure Write
(Stream : not null access Root_Stream_Type'Class;
raise Program_Error with "attempt to stream reference";
end Read;
- ---------------
- -- Reference --
- ---------------
-
- function Constant_Reference (Container : Set; Position : Cursor)
- return Constant_Reference_Type
- is
- pragma Unreferenced (Container);
- begin
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element => Position.Node.Element.all'Access);
- end Constant_Reference;
-
-------------
-- Replace --
-------------
package Set_Iterator_Interfaces is new
Ada.Iterator_Interfaces (Cursor, Has_Element);
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is
- private with
- Implicit_Dereference => Element;
-
- function Constant_Reference
- (Container : Set;
- Position : Cursor) return Constant_Reference_Type;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
function "=" (Left, Right : Set) return Boolean;
function Equivalent_Sets (Left, Right : Set) return Boolean;
(Position : Cursor;
Process : not null access procedure (Element : Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is
+ private with
+ Implicit_Dereference => Element;
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
procedure Assign (Target : in out Set; Source : Set);
function Copy (Source : Set) return Set;
function Reference_Preserving_Key
(Container : aliased in out Set;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Set;
Key : Key_Type) return Constant_Reference_Type;
function Reference_Preserving_Key
Container.Last := No_Index;
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Vector;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with "Position cursor denotes wrong container";
+ end if;
+
+ if Position.Index > Position.Container.Last then
+ raise Constraint_Error with "Position cursor is out of range";
+ end if;
+
+ declare
+ A : Elements_Array renames Container.Elements;
+ I : constant Count_Type := To_Array_Index (Position.Index);
+ begin
+ return (Element => A (I)'Access);
+ end;
+ end Constant_Reference;
+
+ function Constant_Reference
+ (Container : aliased Vector;
+ Index : Index_Type) return Constant_Reference_Type
+ is
+ begin
+ if Index > Container.Last then
+ raise Constraint_Error with "Index is out of range";
+ end if;
+
+ declare
+ A : Elements_Array renames Container.Elements;
+ I : constant Count_Type := To_Array_Index (Index);
+ begin
+ return (Element => A (I)'Access);
+ end;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : Vector;
- Position : Cursor) -- SHOULD BE ALIASED
- return Constant_Reference_Type
+ function Reference
+ (Container : aliased in out Vector;
+ Position : Cursor) return Reference_Type
is
begin
- pragma Unreferenced (Container);
-
if Position.Container = null then
raise Constraint_Error with "Position cursor has no element";
end if;
- if Position.Index > Position.Container.Last then
- raise Constraint_Error with "Position cursor is out of range";
- end if;
-
- return
- (Element =>
- Position.Container.Elements
- (To_Array_Index (Position.Index))'Access);
- end Constant_Reference;
-
- function Constant_Reference
- (Container : Vector;
- Position : Index_Type)
- return Constant_Reference_Type
- is
- begin
- if (Position) > Container.Last then
- raise Constraint_Error with "Index is out of range";
- end if;
-
- return (Element =>
- Container.Elements (To_Array_Index (Position))'Access);
- end Constant_Reference;
-
- function Reference
- (Container : Vector;
- Position : Cursor)
- return Reference_Type
- is
- begin
- pragma Unreferenced (Container);
-
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with "Position cursor denotes wrong container";
end if;
if Position.Index > Position.Container.Last then
raise Constraint_Error with "Position cursor is out of range";
end if;
- return
- (Element =>
- Position.Container.Elements
- (To_Array_Index (Position.Index))'Access);
+ declare
+ A : Elements_Array renames Container.Elements;
+ I : constant Count_Type := To_Array_Index (Position.Index);
+ begin
+ return (Element => A (I)'Access);
+ end;
end Reference;
function Reference
- (Container : Vector;
- Position : Index_Type)
- return Reference_Type
+ (Container : aliased in out Vector;
+ Index : Index_Type) return Reference_Type
is
begin
- if Position > Container.Last then
+ if Index > Container.Last then
raise Constraint_Error with "Index is out of range";
- else
- return (Element =>
- Container.Elements (To_Array_Index (Position))'Unrestricted_Access);
end if;
+
+ declare
+ A : Elements_Array renames Container.Elements;
+ I : constant Count_Type := To_Array_Index (Index);
+ begin
+ return (Element => A (I)'Access);
+ end;
end Reference;
---------------------
Position : Cursor;
Process : not null access procedure (Element : in out Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is
+ private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ type Reference_Type (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ function Constant_Reference
+ (Container : aliased Vector;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Vector;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Vector;
+ Index : Index_Type) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Vector;
+ Index : Index_Type) return Reference_Type;
+
procedure Assign (Target : in out Vector; Source : Vector);
function Copy (Source : Vector; Capacity : Count_Type := 0) return Vector;
Start : Cursor)
return Vector_Iterator_Interfaces.Reversible_Iterator'class;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is
- private
- with
- Implicit_Dereference => Element;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- type Reference_Type (Element : not null access Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- function Constant_Reference
- (Container : Vector; Position : Cursor) -- SHOULD BE ALIASED
- return Constant_Reference_Type;
-
- function Constant_Reference
- (Container : Vector; Position : Index_Type)
- return Constant_Reference_Type;
-
- function Reference (Container : Vector; Position : Cursor)
- return Reference_Type;
-
- function Reference (Container : Vector; Position : Index_Type)
- return Reference_Type;
-
generic
with function "<" (Left, Right : Element_Type) return Boolean is <>;
package Generic_Sorting is
HT_Ops.Clear (Container.HT);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert
+ (Vet (Position),
+ "Position cursor in Constant_Reference is bad");
+
+ return (Element => Position.Node.Element'Access);
+ end Constant_Reference;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Node_Access := Key_Ops.Find (Container.HT, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ return (Element => Node.Element'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : aliased Map;
- Position : Cursor) return Constant_Reference_Type
- is
- pragma Unreferenced (Container);
- begin
- return (Element => Element (Position)'Unrestricted_Access);
- end Constant_Reference;
-
function Reference
(Container : aliased in out Map;
Position : Cursor) return Reference_Type
is
- pragma Unreferenced (Container);
begin
- return (Element => Element (Position)'Unrestricted_Access);
- end Reference;
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
- function Constant_Reference
- (Container : aliased Map;
- Key : Key_Type) return Constant_Reference_Type
- is
- begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
- end Constant_Reference;
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert
+ (Vet (Position),
+ "Position cursor in function Reference is bad");
+
+ return (Element => Position.Node.Element'Access);
+ end Reference;
function Reference
(Container : aliased in out Map;
Key : Key_Type) return Reference_Type
is
+ Node : constant Node_Access := Key_Ops.Find (Container.HT, Key);
+
begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ return (Element => Node.Element'Access);
end Reference;
---------------
-- Calls Process with the key (with only a constant view) and element (with
-- a variable view) of the node designed by the cursor.
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
+ type Reference_Type (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type;
+
procedure Assign (Target : in out Map; Source : Map);
function Copy (Source : Map; Capacity : Count_Type := 0) return Map;
-- Returns the result of calling Equivalent_Keys with key Left and the node
-- designated by Right.
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
- type Reference_Type (Element : not null access Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Reference_Type);
-
- for Reference_Type'Write use Write;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type);
-
- for Reference_Type'Read use Read;
-
- function Constant_Reference
- (Container : aliased Map;
- Position : Cursor) return Constant_Reference_Type;
-
- function Reference
- (Container : aliased in out Map;
- Position : Cursor) return Reference_Type;
-
- function Constant_Reference
- (Container : aliased Map;
- Key : Key_Type) return Constant_Reference_Type;
-
- function Reference
- (Container : aliased in out Map;
- Key : Key_Type) return Reference_Type;
-
procedure Iterate
(Container : Map;
Process : not null access procedure (Position : Cursor));
type Node_Type is limited record
Key : Key_Type;
- Element : Element_Type;
+ Element : aliased Element_Type;
Next : Node_Access;
end record;
HT_Ops.Clear (Container.HT);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert (Vet (Position), "bad cursor in Constant_Reference");
+
+ return (Element => Position.Node.Element'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
raise;
end Read_Node;
- ---------------
- -- Reference --
- ---------------
-
- function Constant_Reference
- (Container : aliased Set;
- Position : Cursor) return Constant_Reference_Type
- is
- pragma Unreferenced (Container);
- begin
- return (Element => Position.Node.Element'Unrestricted_Access);
- end Constant_Reference;
-
-------------
-- Replace --
-------------
Hash => Hash,
Equivalent_Keys => Equivalent_Key_Node);
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.HT, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "Key not in set";
+ end if;
+
+ return (Element => Node.Element'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
return Key (Position.Node.Element);
end Key;
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type)
+ is
+ begin
+ raise Program_Error with "attempt to stream reference";
+ end Read;
+
+ ------------------------------
+ -- Reference_Preserving_Key --
+ ------------------------------
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Position : Cursor) return Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert
+ (Vet (Position),
+ "bad cursor in function Reference_Preserving_Key");
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Position has
+ -- not changed. ???
+
+ return (Element => Position.Node.Element'Access);
+ end Reference_Preserving_Key;
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.HT, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "Key not in set";
+ end if;
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Key has not
+ -- changed. ???
+
+ return (Element => Node.Element'Access);
+ end Reference_Preserving_Key;
+
-------------
-- Replace --
-------------
raise Program_Error with "key was modified";
end Update_Element_Preserving_Key;
- ------------------------------
- -- Reference_Preserving_Key --
- ------------------------------
+ -----------
+ -- Write --
+ -----------
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Position : Cursor) return Reference_Type
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type)
is
- pragma Unreferenced (Container);
begin
- return (Element => Position.Node.Element'Unrestricted_Access);
- end Reference_Preserving_Key;
+ raise Program_Error with "attempt to stream reference";
+ end Write;
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Reference_Type
- is
- Position : constant Cursor := Find (Container, Key);
- begin
- return (Element => Position.Node.Element'Unrestricted_Access);
- end Reference_Preserving_Key;
end Generic_Keys;
end Ada.Containers.Hashed_Sets;
type Set is tagged private
with
- constant_Indexing => Constant_Reference,
+ Constant_Indexing => Constant_Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type;
-- Calls Process with the element (having only a constant view) of the node
-- designed by the cursor.
- procedure Assign (Target : in out Set; Source : Set);
-
- function Copy (Source : Set; Capacity : Count_Type := 0) return Set;
-
type Constant_Reference_Type
(Element : not null access constant Element_Type) is private
with Implicit_Dereference => Element;
(Container : aliased Set;
Position : Cursor) return Constant_Reference_Type;
+ procedure Assign (Target : in out Set; Source : Set);
+
+ function Copy (Source : Set; Capacity : Count_Type := 0) return Set;
+
procedure Move (Target : in out Set; Source : in out Set);
-- Clears Target (if it's not empty), and then moves (not copies) the
-- buckets array and nodes from Source to Target.
(Container : aliased in out Set;
Position : Cursor) return Reference_Type;
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type;
+
function Reference_Preserving_Key
(Container : aliased in out Set;
- Key : Key_Type) return Reference_Type;
+ Key : Key_Type) return Reference_Type;
private
type Reference_Type (Element : not null access Element_Type)
is null record;
+ use Ada.Streams;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type);
+
+ for Reference_Type'Read use Read;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Reference_Type);
+
+ for Reference_Type'Write use Write;
+
end Generic_Keys;
private
type Node_Access is access Node_Type;
type Node_Type is limited record
- Element : Element_Type;
+ Element : aliased Element_Type;
Next : Node_Access;
end record;
------------------------
function Constant_Reference
- (Container : Vector;
+ (Container : aliased Vector;
Position : Cursor) return Constant_Reference_Type
is
- begin
- pragma Unreferenced (Container);
+ E : Element_Access;
+ begin
if Position.Container = null then
raise Constraint_Error with "Position cursor has no element";
end if;
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with "Position cursor denotes wrong container";
+ end if;
+
if Position.Index > Position.Container.Last then
raise Constraint_Error with "Position cursor is out of range";
end if;
- return
- (Element => Position.Container.Elements.EA (Position.Index).all'Access);
+ E := Container.Elements.EA (Position.Index);
+
+ if E = null then
+ raise Constraint_Error with "element at Position is empty";
+ end if;
+
+ return (Element => E.all'Access);
end Constant_Reference;
function Constant_Reference
- (Container : Vector;
- Position : Index_Type) return Constant_Reference_Type
+ (Container : aliased Vector;
+ Index : Index_Type) return Constant_Reference_Type
is
+ E : Element_Access;
+
begin
- if (Position) > Container.Last then
+ if Index > Container.Last then
raise Constraint_Error with "Index is out of range";
end if;
- return (Element => Container.Elements.EA (Position).all'Access);
+ E := Container.Elements.EA (Index);
+
+ if E = null then
+ raise Constraint_Error with "element at Index is empty";
+ end if;
+
+ return (Element => E.all'Access);
end Constant_Reference;
--------------
---------------
function Reference
- (Container : Vector;
+ (Container : aliased in out Vector;
Position : Cursor) return Reference_Type
is
- begin
- pragma Unreferenced (Container);
+ E : Element_Access;
+ begin
if Position.Container = null then
raise Constraint_Error with "Position cursor has no element";
end if;
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with "Position cursor denotes wrong container";
+ end if;
+
if Position.Index > Position.Container.Last then
raise Constraint_Error with "Position cursor is out of range";
end if;
- return
- (Element =>
- Position.Container.Elements.EA (Position.Index).all'Access);
+ E := Container.Elements.EA (Position.Index);
+
+ if E = null then
+ raise Constraint_Error with "element at Position is empty";
+ end if;
+
+ return (Element => E.all'Access);
end Reference;
function Reference
- (Container : Vector;
- Position : Index_Type) return Reference_Type
+ (Container : aliased in out Vector;
+ Index : Index_Type) return Reference_Type
is
+ E : Element_Access;
+
begin
- if Position > Container.Last then
+ if Index > Container.Last then
raise Constraint_Error with "Index is out of range";
end if;
- return (Element => Container.Elements.EA (Position).all'Access);
+ E := Container.Elements.EA (Index);
+
+ if E = null then
+ raise Constraint_Error with "element at Index is empty";
+ end if;
+
+ return (Element => E.all'Access);
end Reference;
---------------------
for Reference_Type'Read use Read;
function Constant_Reference
- (Container : Vector; Position : Cursor) -- SHOULD BE ALIASED
- return Constant_Reference_Type;
+ (Container : aliased Vector;
+ Position : Cursor) return Constant_Reference_Type;
- function Constant_Reference
- (Container : Vector; Position : Index_Type)
- return Constant_Reference_Type;
+ function Reference
+ (Container : aliased in out Vector;
+ Position : Cursor) return Reference_Type;
- function Reference (Container : Vector; Position : Cursor)
- return Reference_Type;
+ function Constant_Reference
+ (Container : aliased Vector;
+ Index : Index_Type) return Constant_Reference_Type;
- function Reference (Container : Vector; Position : Index_Type)
- return Reference_Type;
+ function Reference
+ (Container : aliased in out Vector;
+ Index : Index_Type) return Reference_Type;
function To_Cursor
(Container : Vector;
pragma Assert (Children_Count = Container_Count);
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Tree;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node = Root_Node (Container) then
+ raise Program_Error with "Position cursor designates root";
+ end if;
+
+ -- Implement Vet for multiway tree???
+ -- pragma Assert (Vet (Position),
+ -- "Position cursor in Constant_Reference is bad");
+
+ return (Element => Position.Node.Element'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : aliased Tree;
- Position : Cursor) return Constant_Reference_Type
- is
- begin
- pragma Unreferenced (Container);
-
- return (Element => Position.Node.Element'Unrestricted_Access);
- end Constant_Reference;
-
function Reference
- (Container : aliased Tree;
+ (Container : aliased in out Tree;
Position : Cursor) return Reference_Type
is
begin
- pragma Unreferenced (Container);
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ if Position.Node = Root_Node (Container) then
+ raise Program_Error with "Position cursor designates root";
+ end if;
+
+ -- Implement Vet for multiway tree???
+ -- pragma Assert (Vet (Position),
+ -- "Position cursor in Constant_Reference is bad");
- return (Element => Position.Node.Element'Unrestricted_Access);
+ return (Element => Position.Node.Element'Access);
end Reference;
--------------------
(Element : not null access Element_Type) is private
with Implicit_Dereference => Element;
+ function Constant_Reference
+ (Container : aliased Tree;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Tree;
+ Position : Cursor) return Reference_Type;
+
procedure Assign (Target : in out Tree; Source : Tree);
function Copy (Source : Tree) return Tree;
Prev : Tree_Node_Access;
Next : Tree_Node_Access;
Children : Children_Type;
- Element : Element_Type;
+ Element : aliased Element_Type;
end record;
pragma Convention (C, Tree_Node_Type);
for Reference_Type'Write use Write;
- function Constant_Reference
- (Container : aliased Tree;
- Position : Cursor) return Constant_Reference_Type;
-
- function Reference
- (Container : aliased Tree;
- Position : Cursor) return Reference_Type;
-
Empty_Tree : constant Tree := (Controlled with others => <>);
No_Element : constant Cursor := (others => <>);
end if;
end Clear;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Vector;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with "Position cursor denotes wrong container";
+ end if;
+
+ if Position.Index > Position.Container.Last then
+ raise Constraint_Error with "Position cursor is out of range";
+ end if;
+
+ return (Element => Container.Elements.EA (Position.Index)'Access);
+ end Constant_Reference;
+
+ function Constant_Reference
+ (Container : aliased Vector;
+ Index : Index_Type) return Constant_Reference_Type
+ is
+ begin
+ if Index > Container.Last then
+ raise Constraint_Error with "Index is out of range";
+ else
+ return (Element => Container.Elements.EA (Index)'Access);
+ end if;
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
-- Reference --
---------------
- function Constant_Reference
- (Container : Vector;
- Position : Cursor) -- SHOULD BE ALIASED
- return Constant_Reference_Type
+ function Reference
+ (Container : aliased in out Vector;
+ Position : Cursor) return Reference_Type
is
begin
- pragma Unreferenced (Container);
-
if Position.Container = null then
raise Constraint_Error with "Position cursor has no element";
end if;
- if Position.Index > Position.Container.Last then
- raise Constraint_Error with "Position cursor is out of range";
- end if;
-
- return
- (Element =>
- Position.Container.Elements.EA (Position.Index)'Access);
- end Constant_Reference;
-
- function Constant_Reference
- (Container : Vector;
- Position : Index_Type)
- return Constant_Reference_Type
- is
- begin
- if Position > Container.Last then
- raise Constraint_Error with "Index is out of range";
- else
- return (Element => Container.Elements.EA (Position)'Access);
- end if;
- end Constant_Reference;
-
- function Reference (Container : Vector; Position : Cursor)
- return Reference_Type is
- begin
- pragma Unreferenced (Container);
-
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with "Position cursor denotes wrong container";
end if;
if Position.Index > Position.Container.Last then
raise Constraint_Error with "Position cursor is out of range";
end if;
- return
- (Element => Position.Container.Elements.EA (Position.Index)'Access);
+ return (Element => Container.Elements.EA (Position.Index)'Access);
end Reference;
- function Reference (Container : Vector; Position : Index_Type)
- return Reference_Type is
+ function Reference
+ (Container : aliased in out Vector;
+ Index : Index_Type) return Reference_Type
+ is
begin
- if Position > Container.Last then
+ if Index > Container.Last then
raise Constraint_Error with "Index is out of range";
else
- return (Element => Container.Elements.EA (Position)'Access);
+ return (Element => Container.Elements.EA (Index)'Access);
end if;
end Reference;
for Reference_Type'Read use Read;
function Constant_Reference
- (Container : Vector; Position : Cursor) -- SHOULD BE ALIASED
- return Constant_Reference_Type;
+ (Container : aliased Vector;
+ Position : Cursor) return Constant_Reference_Type;
- function Constant_Reference
- (Container : Vector; Position : Index_Type)
- return Constant_Reference_Type;
+ function Reference
+ (Container : aliased in out Vector;
+ Position : Cursor) return Reference_Type;
- function Reference (Container : Vector; Position : Cursor)
- return Reference_Type;
+ function Constant_Reference
+ (Container : aliased Vector;
+ Index : Index_Type) return Constant_Reference_Type;
- function Reference (Container : Vector; Position : Index_Type)
- return Reference_Type;
+ function Reference
+ (Container : aliased in out Vector;
+ Index : Index_Type) return Reference_Type;
procedure Assign (Target : in out Vector; Source : Vector);
-- Constant_Reference --
------------------------
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert (Vet (Container.Tree, Position.Node),
+ "Position cursor in Constant_Reference is bad");
+
+ return (Element => Position.Node.Element'Access);
+ end Constant_Reference;
+
function Constant_Reference
(Container : Map;
Key : Key_Type) return Constant_Reference_Type
is
+ Node : constant Node_Access := Key_Ops.Find (Container.Tree, Key);
+
begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ return (Element => Node.Element'Access);
end Constant_Reference;
--------------
---------------
function Reference
- (Container : Map;
- Key : Key_Type)
- return Reference_Type
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type
is
begin
- return (Element => Container.Element (Key)'Unrestricted_Access);
+ if Position.Container = null then
+ raise Constraint_Error with
+ "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong map";
+ end if;
+
+ pragma Assert (Vet (Container.Tree, Position.Node),
+ "Position cursor in function Reference is bad");
+
+ return (Element => Position.Node.Element'Access);
+ end Reference;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Node_Access := Key_Ops.Find (Container.Tree, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "key not in map";
+ end if;
+
+ return (Element => Node.Element'Access);
end Reference;
-------------
function Equivalent_Keys (Left, Right : Key_Type) return Boolean;
type Map is tagged private with
- constant_Indexing => Constant_Reference,
+ Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference,
Default_Iterator => Iterate,
Iterator_Element => Element_Type;
Process : not null access
procedure (Key : Key_Type; Element : in out Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ type Reference_Type (Element : not null access Element_Type) is private
+ with
+ Implicit_Dereference => Element;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Position : Cursor) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Map;
+ Key : Key_Type) return Constant_Reference_Type;
+
+ function Reference
+ (Container : aliased in out Map;
+ Key : Key_Type) return Reference_Type;
+
procedure Assign (Target : in out Map; Source : Map);
function Copy (Source : Map) return Map;
function ">" (Left : Key_Type; Right : Cursor) return Boolean;
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- type Reference_Type (Element : not null access Element_Type) is private
- with
- Implicit_Dereference => Element;
-
- function Constant_Reference
- (Container : Map;
- Key : Key_Type) -- SHOULD BE ALIASED???
- return Constant_Reference_Type;
-
- function Reference (Container : Map; Key : Key_Type)
- return Reference_Type;
-
procedure Iterate
(Container : Map;
Process : not null access procedure (Position : Cursor));
Right : Node_Access;
Color : Red_Black_Trees.Color_Type := Red_Black_Trees.Red;
Key : Key_Type;
- Element : Element_Type;
+ Element : aliased Element_Type;
end record;
package Tree_Types is
return Node.Color;
end Color;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert
+ (Vet (Container.Tree, Position.Node),
+ "bad cursor in Constant_Reference");
+
+ return (Element => Position.Node.Element'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
else Cursor'(Container'Unrestricted_Access, Node));
end Ceiling;
+ ------------------------
+ -- Constant_Reference --
+ ------------------------
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Key : Key_Type) return Constant_Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.Tree, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "key not in set";
+ end if;
+
+ return (Element => Node.Element'Access);
+ end Constant_Reference;
+
--------------
-- Contains --
--------------
return Key (Position.Node.Element);
end Key;
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Reference_Type)
+ is
+ begin
+ raise Program_Error with "attempt to stream reference";
+ end Read;
+
+ ------------------------------
+ -- Reference_Preserving_Key --
+ ------------------------------
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Position : Cursor) return Reference_Type
+ is
+ begin
+ if Position.Container = null then
+ raise Constraint_Error with "Position cursor has no element";
+ end if;
+
+ if Position.Container /= Container'Unrestricted_Access then
+ raise Program_Error with
+ "Position cursor designates wrong container";
+ end if;
+
+ pragma Assert
+ (Vet (Container.Tree, Position.Node),
+ "bad cursor in function Reference_Preserving_Key");
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Position has
+ -- not changed. ???
+
+ return (Element => Position.Node.Element'Access);
+ end Reference_Preserving_Key;
+
+ function Reference_Preserving_Key
+ (Container : aliased in out Set;
+ Key : Key_Type) return Reference_Type
+ is
+ Node : constant Node_Access :=
+ Key_Keys.Find (Container.Tree, Key);
+
+ begin
+ if Node = null then
+ raise Constraint_Error with "key not in set";
+ end if;
+
+ -- Some form of finalization will be required in order to actually
+ -- check that the key-part of the element designated by Position has
+ -- not changed. ???
+
+ return (Element => Node.Element'Access);
+ end Reference_Preserving_Key;
+
-------------
-- Replace --
-------------
raise Program_Error with "key was modified";
end Update_Element_Preserving_Key;
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Constant_Reference_Type
- is
- Position : constant Cursor := Find (Container, Key);
-
- begin
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element => Position.Node.Element'Access);
- end Reference_Preserving_Key;
-
- function Reference_Preserving_Key
- (Container : aliased in out Set;
- Key : Key_Type) return Reference_Type
- is
- Position : constant Cursor := Find (Container, Key);
-
- begin
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element => Position.Node.Element'Access);
- end Reference_Preserving_Key;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Reference_Type)
- is
- begin
- raise Program_Error with "attempt to stream reference";
- end Read;
+ -----------
+ -- Write --
+ -----------
procedure Write
(Stream : not null access Root_Stream_Type'Class;
raise Program_Error with "attempt to stream reference";
end Read;
- ---------------
- -- Reference --
- ---------------
-
- function Constant_Reference (Container : Set; Position : Cursor)
- return Constant_Reference_Type
- is
- pragma Unreferenced (Container);
- begin
- if Position.Container = null then
- raise Constraint_Error with "Position cursor has no element";
- end if;
-
- return (Element => Position.Node.Element'Access);
- end Constant_Reference;
-
-------------
-- Replace --
-------------
package Set_Iterator_Interfaces is new
Ada.Iterator_Interfaces (Cursor, Has_Element);
- type Constant_Reference_Type
- (Element : not null access constant Element_Type) is
- private
- with
- Implicit_Dereference => Element;
-
- procedure Write
- (Stream : not null access Root_Stream_Type'Class;
- Item : Constant_Reference_Type);
-
- for Constant_Reference_Type'Write use Write;
-
- function Constant_Reference
- (Container : Set; Position : Cursor)
- return Constant_Reference_Type;
-
- procedure Read
- (Stream : not null access Root_Stream_Type'Class;
- Item : out Constant_Reference_Type);
-
- for Constant_Reference_Type'Read use Read;
-
function "=" (Left, Right : Set) return Boolean;
function Equivalent_Sets (Left, Right : Set) return Boolean;
(Position : Cursor;
Process : not null access procedure (Element : Element_Type));
+ type Constant_Reference_Type
+ (Element : not null access constant Element_Type) is
+ private
+ with
+ Implicit_Dereference => Element;
+
+ procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : Constant_Reference_Type);
+
+ for Constant_Reference_Type'Write use Write;
+
+ function Constant_Reference
+ (Container : aliased Set;
+ Position : Cursor) return Constant_Reference_Type;
+
+ procedure Read
+ (Stream : not null access Root_Stream_Type'Class;
+ Item : out Constant_Reference_Type);
+
+ for Constant_Reference_Type'Read use Read;
+
procedure Assign (Target : in out Set; Source : Set);
function Copy (Source : Set) return Set;
function Reference_Preserving_Key
(Container : aliased in out Set;
+ Position : Cursor) return Reference_Type;
+
+ function Constant_Reference
+ (Container : aliased Set;
Key : Key_Type) return Constant_Reference_Type;
function Reference_Preserving_Key
"library directory { does not exist",
Lib_Dir.Location, Project);
- elsif not Project.Externally_Built then
+ -- Checks for object/source directories
+ elsif not Project.Externally_Built
+
+ -- An aggregate library does not have sources or objects, so
+ -- these tests are not required in this case.
+
+ and then Project.Qualifier /= Aggregate_Library
+ then
-- Library directory cannot be the same as Object directory
if Project.Library_Dir.Name = Project.Object_Directory.Name then
-- --
-- B o d y --
-- --
--- Copyright (C) 2006-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 2006-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
if Max_Abs > 0.0 then
Switch_Row (M, N, Row, Max_Row);
- Divide_Row (M, N, Row, M (Row, J));
+
+ -- The temporaries below are necessary to force a copy of the
+ -- value and avoid improper aliasing.
+
+ declare
+ Scale : constant Scalar := M (Row, J);
+ begin
+ Divide_Row (M, N, Row, Scale);
+ end;
for U in Row + 1 .. M'Last (1) loop
- Sub_Row (N, U, Row, M (U, J));
- Sub_Row (M, U, Row, M (U, J));
+ declare
+ Factor : constant Scalar := M (U, J);
+ begin
+ Sub_Row (N, U, Row, Factor);
+ Sub_Row (M, U, Row, Factor);
+ end;
end loop;
exit when Row >= M'Last (1);
-- --
-- S p e c --
-- --
--- Copyright (C) 1995-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 1995-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- If the parent is using tasking, and needs to spawn subprocesses at
-- arbitrary times, one technique is for the parent to spawn (very early)
-- a particular spawn-manager subprocess whose job is to spawn other
- -- processes. The spawn-manager avoids tasking. The parent sends messages
- -- to the spawn-manager requesting it to spawn processes, using whatever
- -- inter-process communication mechanism you like, such as sockets.
+ -- processes. The spawn-manager must avoid tasking. The parent sends
+ -- messages to the spawn-manager requesting it to spawn processes, using
+ -- whatever inter-process communication mechanism you like, such as
+ -- sockets.
-- In short, mixing spawning of subprocesses with tasking is a tricky
-- business, and should be avoided if possible, but if it is necessary,