aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@adacore.com>2020-03-23 04:49:13 -0400
committerPierre-Marie de Rodat <derodat@adacore.com>2020-06-12 04:29:24 -0400
commit5052a270c0f685998a3456d87d441a59bc1d67ee (patch)
treef21a4e4d04a60740b72ce840881e279aa2c5c55d /gcc
parent842d28d2acba14a4ebe53f80a35bf1096a1c223e (diff)
downloadgcc-5052a270c0f685998a3456d87d441a59bc1d67ee.zip
gcc-5052a270c0f685998a3456d87d441a59bc1d67ee.tar.gz
gcc-5052a270c0f685998a3456d87d441a59bc1d67ee.tar.bz2
[Ada] AI12-0350 Swap for Indefinite_Holders
2020-06-12 Arnaud Charlet <charlet@adacore.com> gcc/ada/ * libgnat/a-coinho.ads, libgnat/a-coinho.adb, libgnat/a-coinho__shared.ads, libgnat/a-coinho__shared.adb (Swap): New procedure.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/libgnat/a-coinho.adb24
-rw-r--r--gcc/ada/libgnat/a-coinho.ads2
-rw-r--r--gcc/ada/libgnat/a-coinho__shared.adb24
-rw-r--r--gcc/ada/libgnat/a-coinho__shared.ads2
4 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ada/libgnat/a-coinho.adb b/gcc/ada/libgnat/a-coinho.adb
index ef58e9e..c5da943 100644
--- a/gcc/ada/libgnat/a-coinho.adb
+++ b/gcc/ada/libgnat/a-coinho.adb
@@ -304,6 +304,30 @@ package body Ada.Containers.Indefinite_Holders is
end;
end Replace_Element;
+ ----------
+ -- Swap --
+ ----------
+
+ procedure Swap (Left, Right : in out Holder) is
+ begin
+ if Left.Busy /= 0 then
+ raise Program_Error with "attempt to tamper with elements";
+ end if;
+
+ if Right.Busy /= 0 then
+ raise Program_Error with "attempt to tamper with elements";
+ end if;
+
+ if Left.Element /= Right.Element then
+ declare
+ Tmp : constant Element_Access := Left.Element;
+ begin
+ Left.Element := Right.Element;
+ Right.Element := Tmp;
+ end;
+ end if;
+ end Swap;
+
---------------
-- To_Holder --
---------------
diff --git a/gcc/ada/libgnat/a-coinho.ads b/gcc/ada/libgnat/a-coinho.ads
index af22cbf..bf6165e 100644
--- a/gcc/ada/libgnat/a-coinho.ads
+++ b/gcc/ada/libgnat/a-coinho.ads
@@ -92,6 +92,8 @@ package Ada.Containers.Indefinite_Holders is
procedure Move (Target : in out Holder; Source : in out Holder);
+ procedure Swap (Left, Right : in out Holder);
+
private
use Ada.Finalization;
diff --git a/gcc/ada/libgnat/a-coinho__shared.adb b/gcc/ada/libgnat/a-coinho__shared.adb
index bfeb6ad..43f5d52 100644
--- a/gcc/ada/libgnat/a-coinho__shared.adb
+++ b/gcc/ada/libgnat/a-coinho__shared.adb
@@ -426,6 +426,30 @@ package body Ada.Containers.Indefinite_Holders is
end if;
end Replace_Element;
+ ----------
+ -- Swap --
+ ----------
+
+ procedure Swap (Left, Right : in out Holder) is
+ begin
+ if Left.Busy /= 0 then
+ raise Program_Error with "attempt to tamper with elements";
+ end if;
+
+ if Right.Busy /= 0 then
+ raise Program_Error with "attempt to tamper with elements";
+ end if;
+
+ if Left.Reference /= Right.Reference then
+ declare
+ Tmp : constant Shared_Holder_Access := Left.Reference;
+ begin
+ Left.Reference := Right.Reference;
+ Right.Reference := Tmp;
+ end;
+ end if;
+ end Swap;
+
---------------
-- To_Holder --
---------------
diff --git a/gcc/ada/libgnat/a-coinho__shared.ads b/gcc/ada/libgnat/a-coinho__shared.ads
index af2e7e0..0345b5e 100644
--- a/gcc/ada/libgnat/a-coinho__shared.ads
+++ b/gcc/ada/libgnat/a-coinho__shared.ads
@@ -96,6 +96,8 @@ package Ada.Containers.Indefinite_Holders is
procedure Move (Target : in out Holder; Source : in out Holder);
+ procedure Swap (Left, Right : in out Holder);
+
private
use Ada.Finalization;