diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-16 08:31:41 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-16 08:31:41 +0000 |
commit | 970e0382740ebed49eea06020812dcc57ffdbd71 (patch) | |
tree | 98b90457f8da442292245fa317ed89f4c9975189 /gcc/ada/a-stzunb.adb | |
parent | 35d24369311589e678b4a01523b97a2fd6e42ae3 (diff) | |
download | gcc-970e0382740ebed49eea06020812dcc57ffdbd71.tar.gz |
2005-06-14 Pascal Obry <obry@adacore.com>
* a-stzunb.adb, a-stwiun.adb, a-strunb.adb (Realloc_For_Chunk): New
implementation which is slightly more efficient.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101023 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/a-stzunb.adb')
-rw-r--r-- | gcc/ada/a-stzunb.adb | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/gcc/ada/a-stzunb.adb b/gcc/ada/a-stzunb.adb index 8717bb37577..390fb389e3c 100644 --- a/gcc/ada/a-stzunb.adb +++ b/gcc/ada/a-stzunb.adb @@ -1,6 +1,6 @@ ------------------------------------------------------------------------------ -- -- --- GNAT RUNTIME COMPONENTS -- +-- GNAT RUN-TIME COMPONENTS -- -- -- -- A D A . S T R I N G S . W I D E _ W I D E _ U N B O U N D E D -- -- -- @@ -647,7 +647,6 @@ package body Ada.Strings.Wide_Wide_Unbounded is (Source.Reference (1 .. Source.Last), Pattern, From, Going, Mapping); end Index; - function Index (Source : Unbounded_Wide_Wide_String; Set : Wide_Wide_Maps.Wide_Wide_Character_Set; @@ -783,17 +782,36 @@ package body Ada.Strings.Wide_Wide_Unbounded is (Source : in out Unbounded_Wide_Wide_String; Chunk_Size : Natural) is - Growth_Factor : constant := 50; - S_Length : constant Natural := Source.Reference'Length; + Growth_Factor : constant := 32; + -- The growth factor controls how much extra space is allocated when + -- we have to increase the size of an allocated unbounded string. By + -- allocating extra space, we avoid the need to reallocate on every + -- append, particularly important when a string is built up by repeated + -- append operations of small pieces. This is expressed as a factor so + -- 32 means add 1/32 of the length of the string as growth space. + + Min_Mul_Alloc : constant := Standard'Maximum_Alignment; + -- Allocation will be done by a multiple of Min_Mul_Alloc This causes + -- no memory loss as most (all?) malloc implementations are obliged to + -- align the returned memory on the maximum alignment as malloc does not + -- know the target alignment. + + S_Length : constant Natural := Source.Reference'Length; begin if Chunk_Size > S_Length - Source.Last then declare - Alloc_Chunk_Size : constant Positive := - Chunk_Size + (S_Length / Growth_Factor); - Tmp : Wide_Wide_String_Access; + New_Size : constant Positive := + S_Length + Chunk_Size + (S_Length / Growth_Factor); + + New_Rounded_Up_Size : constant Positive := + ((New_Size - 1) / Min_Mul_Alloc + 1) * + Min_Mul_Alloc; + + Tmp : constant Wide_Wide_String_Access := + new Wide_Wide_String (1 .. New_Rounded_Up_Size); + begin - Tmp := new Wide_Wide_String (1 .. S_Length + Alloc_Chunk_Size); Tmp (1 .. Source.Last) := Source.Reference (1 .. Source.Last); Free (Source.Reference); Source.Reference := Tmp; @@ -911,9 +929,9 @@ package body Ada.Strings.Wide_Wide_Unbounded is Free (Old); end Tail; - ------------------------------ + ----------------------------------- -- To_Unbounded_Wide_Wide_String -- - ------------------------------ + ----------------------------------- function To_Unbounded_Wide_Wide_String (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String @@ -936,9 +954,9 @@ package body Ada.Strings.Wide_Wide_Unbounded is return Result; end To_Unbounded_Wide_Wide_String; - ------------------- + ------------------------- -- To_Wide_Wide_String -- - -------------------- + ------------------------- function To_Wide_Wide_String (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String @@ -947,7 +965,6 @@ package body Ada.Strings.Wide_Wide_Unbounded is return Source.Reference (1 .. Source.Last); end To_Wide_Wide_String; - --------------- -- Translate -- --------------- |