diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-06 15:16:32 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-06 15:16:32 +0000 |
commit | 31ba6c3ff2311bad9422246f49d59c532cbb5078 (patch) | |
tree | 6e862e3ea14b2edf93a92c404a0d9b29f3f9ba65 /gcc/ada/a-cdlili.adb | |
parent | bab85b65e545231656361b997a81fb8a44b266b4 (diff) | |
download | gcc-31ba6c3ff2311bad9422246f49d59c532cbb5078.tar.gz |
2011-11-06 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 181026 using svnmerge
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@181034 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/a-cdlili.adb')
-rw-r--r-- | gcc/ada/a-cdlili.adb | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ada/a-cdlili.adb b/gcc/ada/a-cdlili.adb index 497a1112d43..8b513222ef8 100644 --- a/gcc/ada/a-cdlili.adb +++ b/gcc/ada/a-cdlili.adb @@ -146,6 +146,27 @@ package body Ada.Containers.Doubly_Linked_Lists is Insert (Container, No_Element, New_Item, Count); end Append; + ------------ + -- Assign -- + ------------ + + procedure Assign (Target : in out List; Source : List) is + Node : Node_Access; + + begin + if Target'Address = Source'Address then + return; + end if; + + Target.Clear; + + Node := Source.First; + while Node /= null loop + Target.Append (Node.Element); + Node := Node.Next; + end loop; + end Assign; + ----------- -- Clear -- ----------- @@ -206,6 +227,17 @@ package body Ada.Containers.Doubly_Linked_Lists is return Find (Container, Item) /= No_Element; end Contains; + ---------- + -- Copy -- + ---------- + + function Copy (Source : List) return List is + begin + return Target : List do + Target.Assign (Source); + end return; + end Copy; + ------------ -- Delete -- ------------ @@ -483,10 +515,24 @@ package body Ada.Containers.Doubly_Linked_Lists is LI, RI : Cursor; begin - if Target'Address = Source'Address then + + -- The semantics of Merge changed slightly per AI05-0021. It was + -- originally the case that if Target and Source denoted the same + -- container object, then the GNAT implementation of Merge did + -- nothing. However, it was argued that RM05 did not precisely + -- specify the semantics for this corner case. The decision of the + -- ARG was that if Target and Source denote the same non-empty + -- container object, then Program_Error is raised. + + if Source.Is_Empty then return; end if; + if Target'Address = Source'Address then + raise Program_Error with + "Target and Source denote same non-empty container"; + end if; + if Target.Busy > 0 then raise Program_Error with "attempt to tamper with cursors of Target (list is busy)"; |