diff options
author | Arnaud Charlet <charlet@adacore.com> | 2020-03-23 04:49:13 -0400 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-06-12 04:29:24 -0400 |
commit | 5052a270c0f685998a3456d87d441a59bc1d67ee (patch) | |
tree | f21a4e4d04a60740b72ce840881e279aa2c5c55d /gcc | |
parent | 842d28d2acba14a4ebe53f80a35bf1096a1c223e (diff) | |
download | gcc-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.adb | 24 | ||||
-rw-r--r-- | gcc/ada/libgnat/a-coinho.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/a-coinho__shared.adb | 24 | ||||
-rw-r--r-- | gcc/ada/libgnat/a-coinho__shared.ads | 2 |
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; |