OSDN Git Service

2006-02-13 Matthew Heaney <heaney@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-cgaaso.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT LIBRARY COMPONENTS                          --
4 --                                                                          --
5 --                      A D A . C O N T A I N E R S .                       --
6 --        G E N E R I C _ A N O N Y M O U S _ A R R A Y _ S O R T           --
7 --                                                                          --
8 --                                 B o d y                                  --
9 --                                                                          --
10 --          Copyright (C) 2004-2006, Free Software Foundation, Inc.         --
11 --                                                                          --
12 -- This specification is derived from the Ada Reference Manual for use with --
13 -- GNAT. The copyright notice above, and the license provisions that follow --
14 -- apply solely to the  contents of the part following the private keyword. --
15 --                                                                          --
16 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
17 -- terms of the  GNU General Public License as published  by the Free Soft- --
18 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
19 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
20 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
21 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
22 -- for  more details.  You should have  received  a copy of the GNU General --
23 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
24 -- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
25 -- Boston, MA 02110-1301, USA.                                              --
26 --                                                                          --
27 -- As a special exception,  if other files  instantiate  generics from this --
28 -- unit, or you link  this unit with other files  to produce an executable, --
29 -- this  unit  does not  by itself cause  the resulting  executable  to  be --
30 -- covered  by the  GNU  General  Public  License.  This exception does not --
31 -- however invalidate  any other reasons why  the executable file  might be --
32 -- covered by the  GNU Public License.                                      --
33 --                                                                          --
34 -- This unit was originally developed by Matthew J Heaney.                  --
35 ------------------------------------------------------------------------------
36
37 --  This algorithm was adapted from GNAT.Heap_Sort (see g-heasor.ad[sb]).
38
39 with System;
40
41 procedure Ada.Containers.Generic_Anonymous_Array_Sort
42   (First, Last : Index_Type'Base)
43 is
44    type T is range System.Min_Int .. System.Max_Int;
45
46    function To_Index (J : T) return Index_Type;
47    pragma Inline (To_Index);
48
49    function Lt (J, K : T) return Boolean;
50    pragma Inline (Lt);
51
52    procedure Xchg (J, K : T);
53    pragma Inline (Xchg);
54
55    procedure Sift (S : T);
56
57    --------------
58    -- To_Index --
59    --------------
60
61    function To_Index (J : T) return Index_Type is
62       K : constant T'Base := Index_Type'Pos (First) + J - T'(1);
63    begin
64       return Index_Type'Val (K);
65    end To_Index;
66
67    --------
68    -- Lt --
69    --------
70
71    function Lt (J, K : T) return Boolean is
72    begin
73       return Less (To_Index (J), To_Index (K));
74    end Lt;
75
76    ----------
77    -- Xchg --
78    ----------
79
80    procedure Xchg (J, K : T) is
81    begin
82       Swap (To_Index (J), To_Index (K));
83    end Xchg;
84
85    Max : T := Index_Type'Pos (Last) - Index_Type'Pos (First) + T'(1);
86
87    ----------
88    -- Sift --
89    ----------
90
91    procedure Sift (S : T) is
92       C      : T := S;
93       Son    : T;
94       Father : T;
95
96    begin
97       loop
98          Son := C + C;
99
100          if Son < Max then
101             if Lt (Son, Son + 1) then
102                Son := Son + 1;
103             end if;
104          elsif Son > Max then
105             exit;
106          end if;
107
108          Xchg (Son, C);
109          C := Son;
110       end loop;
111
112       while C /= S loop
113          Father := C / 2;
114
115          if Lt (Father, C) then
116             Xchg (Father, C);
117             C := Father;
118          else
119             exit;
120          end if;
121       end loop;
122    end Sift;
123
124 --  Start of processing for Generic_Anonymous_Array_Sort
125
126 begin
127    for J in reverse 1 .. Max / 2 loop
128       Sift (J);
129    end loop;
130
131    while Max > 1 loop
132       Xchg (1, Max);
133       Max := Max - 1;
134       Sift (1);
135    end loop;
136 end Ada.Containers.Generic_Anonymous_Array_Sort;