------------------------------------------------------------------------------
--                                                                          --
--                      CHARLES CONTAINER LIBRARY                           --
--                                                                          --
--              Copyright (C) 2001-2004 Matthew J Heaney                    --
--                                                                          --
-- The Charles Container Library ("Charles") is free software; you can      --
-- redistribute it and/or modify it under terms of the GNU General Public   --
-- License as published by the Free Software Foundation; either version 2,  --
-- or (at your option) any later version.  Charles is distributed in the    --
-- hope that it will be useful, but WITHOUT ANY WARRANTY; without even the  --
-- implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- See the GNU General Public License for more details.  You should have    --
-- received a copy of the GNU General Public License distributed with       --
-- Charles;  see file COPYING.TXT.  If not, write to the Free Software      --
-- Foundation,  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.    --
--                                                                          --
-- As a special exception, if other files instantiate generics from this    --
-- unit, or you link this unit with other files to produce an executable,   --
-- this unit does not by itself cause the resulting executable to be        --
-- covered by the GNU General Public License.  This exception does not      --
-- however invalidate any other reasons why the executable file might be    --
-- covered by the GNU Public License.                                       --
--                                                                          --
-- Charles is maintained by Matthew J Heaney.                               --
--                                                                          --
-- http://home.earthlink.net/~matthewjheaney/index.html                     --
-- mailto:matthewjheaney@earthlink.net                                      --
--                                                                          --
------------------------------------------------------------------------------

with Ada.Characters.Handling;  use Ada.Characters.Handling;

package body Charles.Strings.Case_Insensitive is
   
   function "=" (Left, Right : String) return Boolean is
   begin
      return Standard."=" (To_Lower (Left), To_Lower (Right));
   end;
   

   function "<" (Left, Right : String) return Boolean is
   begin
      return Standard."<" (To_Lower (Left), To_Lower (Right));
   end;

   function ">" (Left, Right : String) return Boolean is
   begin
      return Case_Insensitive."<" (Right, Left);
   end;
   

   function Hash (Key : String) return Hash_Type is
      --see GNAT.HTable.Hash (g-htable.adb)

      function Rotate_Left (Value  : Hash_Type;
                            Amount : Natural) 
         return Hash_Type;

      pragma Import (Intrinsic, Rotate_Left);

      Tmp : Hash_Type := 0;

   begin

      for J in Key'Range loop
         Tmp := Rotate_Left (Tmp, 1) + Character'Pos (To_Lower (Key (J)));
      end loop;

      return Tmp;
      
   end Hash;

end Charles.Strings.Case_Insensitive;
