diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2014-10-31 12:37:44 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2014-10-31 12:37:44 +0100 |
commit | 4a68b7c4d594e082b32da7e76a7cd7a472abb5de (patch) | |
tree | 8a47b5d48d659de4f96ba2a27d617553224d72ac /gcc/ada/a-cfinve.adb | |
parent | 527f5eb67affc709c78a4f65ba7a1f731d63315e (diff) | |
download | gcc-4a68b7c4d594e082b32da7e76a7cd7a472abb5de.zip gcc-4a68b7c4d594e082b32da7e76a7cd7a472abb5de.tar.gz gcc-4a68b7c4d594e082b32da7e76a7cd7a472abb5de.tar.bz2 |
[multiple changes]
2014-10-31 Vasiliy Fofanov <fofanov@adacore.com>
* prj-conf.adb (Do_Autoconf): Refactor the code so that empty
Normalized_Pathname doesn't inhibit the custom Selected_Target
value.
* prj-conf.adb (Parse_Project_And_Apply_Config): Make sure that
Automatically_Generated is correctly set after the first call
to Process_Project_And_Apply_Config and not modified after the
second call, if any.
2014-10-31 Yannick Moy <moy@adacore.com>
* Makefile.rtl, gnat_rm.texi, impunit.adb: Add mention of new library
files.
* a-cfinve.adb, a-cfinve.ads: New unit for formal indefinite
vectors, suitable for use in client SPARK code, also more
efficient than the standard vectors.
* a-coboho.adb, a-coboho.ads New unit for bounded holders, that
are used to define formal indefinite vectors in terms of formal
definite ones.
* a-cofove.adb, a-cofove.ads: Simplification of the API of formal
definite vectors, similar to the API of the new indefinite ones. A
new formal parameter of the generic unit called Bounded allows
to define growable vectors that use dynamic allocation.
From-SVN: r216967
Diffstat (limited to 'gcc/ada/a-cfinve.adb')
-rw-r--r-- | gcc/ada/a-cfinve.adb | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/gcc/ada/a-cfinve.adb b/gcc/ada/a-cfinve.adb new file mode 100644 index 0000000..793b5c3 --- /dev/null +++ b/gcc/ada/a-cfinve.adb @@ -0,0 +1,295 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT LIBRARY COMPONENTS -- +-- -- +-- A D A . C O N T A I N E R S +-- . F O R M A L _ I N D E F I N I T E _ V E C T O R S -- +-- -- +-- B o d y -- +-- -- +-- Copyright (C) 2014, 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- -- +-- ware Foundation; either version 3, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- +-- or FITNESS FOR A PARTICULAR PURPOSE. -- +-- -- +-- As a special exception under Section 7 of GPL version 3, you are granted -- +-- additional permissions described in the GCC Runtime Library Exception, -- +-- version 3.1, as published by the Free Software Foundation. -- +-- -- +-- You should have received a copy of the GNU General Public License and -- +-- a copy of the GCC Runtime Library Exception along with this program; -- +-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- +-- <http://www.gnu.org/licenses/>. -- +------------------------------------------------------------------------------ + +package body Ada.Containers.Formal_Indefinite_Vectors is + + function H (New_Item : Element_Type) return Holder renames To_Holder; + function E (Container : Holder) return Element_Type renames Get; + + --------- + -- "=" -- + --------- + + function "=" (Left, Right : Vector) return Boolean is + (Left.V = Right.V); + + ------------ + -- Append -- + ------------ + + procedure Append (Container : in out Vector; New_Item : Vector) is + begin + Append (Container.V, New_Item.V); + end Append; + + procedure Append + (Container : in out Vector; + New_Item : Element_Type) + is + begin + Append (Container.V, H (New_Item)); + end Append; + + ------------ + -- Assign -- + ------------ + + procedure Assign (Target : in out Vector; Source : Vector) is + begin + Assign (Target.V, Source.V); + end Assign; + + -------------- + -- Capacity -- + -------------- + + function Capacity (Container : Vector) return Capacity_Range is + (Capacity (Container.V)); + + ----------- + -- Clear -- + ----------- + + procedure Clear (Container : in out Vector) is + begin + Clear (Container.V); + end Clear; + + -------------- + -- Contains -- + -------------- + + function Contains + (Container : Vector; + Item : Element_Type) return Boolean is + (Contains (Container.V, H (Item))); + + ---------- + -- Copy -- + ---------- + + function Copy + (Source : Vector; + Capacity : Capacity_Range := 0) return Vector is + (Capacity, V => Copy (Source.V, Capacity)); + + --------------------- + -- Current_To_Last -- + --------------------- + + function Current_To_Last + (Container : Vector; + Current : Index_Type) return Vector is + begin + return (Length (Container), Current_To_Last (Container.V, Current)); + end Current_To_Last; + + ----------------- + -- Delete_Last -- + ----------------- + + procedure Delete_Last + (Container : in out Vector) + is + begin + Delete_Last (Container.V); + end Delete_Last; + + ------------- + -- Element -- + ------------- + + function Element + (Container : Vector; + Index : Index_Type) return Element_Type is + (E (Element (Container.V, Index))); + + ---------------- + -- Find_Index -- + ---------------- + + function Find_Index + (Container : Vector; + Item : Element_Type; + Index : Index_Type := Index_Type'First) return Extended_Index is + (Find_Index (Container.V, H (Item), Index)); + + ------------------- + -- First_Element -- + ------------------- + + function First_Element (Container : Vector) return Element_Type is + (E (First_Element (Container.V))); + + ----------------- + -- First_Index -- + ----------------- + + function First_Index (Container : Vector) return Index_Type is + (First_Index (Container.V)); + + ----------------------- + -- First_To_Previous -- + ----------------------- + + function First_To_Previous + (Container : Vector; + Current : Index_Type) return Vector is + begin + return (Length (Container), First_To_Previous (Container.V, Current)); + end First_To_Previous; + + --------------------- + -- Generic_Sorting -- + --------------------- + + package body Generic_Sorting is + + function "<" (X, Y : Holder) return Boolean is (E (X) < E (Y)); + package Def_Sorting is new Def.Generic_Sorting ("<"); + use Def_Sorting; + + --------------- + -- Is_Sorted -- + --------------- + + function Is_Sorted (Container : Vector) return Boolean is + (Is_Sorted (Container.V)); + + ---------- + -- Sort -- + ---------- + + procedure Sort (Container : in out Vector) is + begin + Sort (Container.V); + end Sort; + + end Generic_Sorting; + + ----------------- + -- Has_Element -- + ----------------- + + function Has_Element + (Container : Vector; Position : Extended_Index) return Boolean is + (Has_Element (Container.V, Position)); + + -------------- + -- Is_Empty -- + -------------- + + function Is_Empty (Container : Vector) return Boolean is + (Is_Empty (Container.V)); + + ------------------ + -- Last_Element -- + ------------------ + + function Last_Element (Container : Vector) return Element_Type is + (E (Last_Element (Container.V))); + + ---------------- + -- Last_Index -- + ---------------- + + function Last_Index (Container : Vector) return Extended_Index is + (Last_Index (Container.V)); + + ------------ + -- Length -- + ------------ + + function Length (Container : Vector) return Capacity_Range is + (Length (Container.V)); + + --------------------- + -- Replace_Element -- + --------------------- + + procedure Replace_Element + (Container : in out Vector; + Index : Index_Type; + New_Item : Element_Type) + is + begin + Replace_Element (Container.V, Index, H (New_Item)); + end Replace_Element; + + ---------------------- + -- Reserve_Capacity -- + ---------------------- + + procedure Reserve_Capacity + (Container : in out Vector; + Capacity : Capacity_Range) + is + begin + Reserve_Capacity (Container.V, Capacity); + end Reserve_Capacity; + + ---------------------- + -- Reverse_Elements -- + ---------------------- + + procedure Reverse_Elements (Container : in out Vector) is + begin + Reverse_Elements (Container.V); + end Reverse_Elements; + + ------------------------ + -- Reverse_Find_Index -- + ------------------------ + + function Reverse_Find_Index + (Container : Vector; + Item : Element_Type; + Index : Index_Type := Index_Type'Last) return Extended_Index is + (Reverse_Find_Index (Container.V, H (Item), Index)); + + ---------- + -- Swap -- + ---------- + + procedure Swap (Container : in out Vector; I, J : Index_Type) is + begin + Swap (Container.V, I, J); + end Swap; + + --------------- + -- To_Vector -- + --------------- + + function To_Vector + (New_Item : Element_Type; + Length : Capacity_Range) return Vector is + begin + return (Length, To_Vector (H (New_Item), Length)); + end To_Vector; + +end Ada.Containers.Formal_Indefinite_Vectors; |