-
+%
+% (c) The University of Glasgow 2006
% (c) The AQUA Project, Glasgow University, 1994-1998
%
-\section[FiniteMap]{An implementation of finite maps}
``Finite maps'' are the heart of the compiler's
lookup-tables/environments and its implementation of sets. Important
) where
#include "HsVersions.h"
-#define IF_NOT_GHC(a) {--}
#if defined(DEBUG_FINITEMAPS)/* NB NB NB */
#define OUTPUTABLE_key , Outputable key
import Util
import Outputable
-import GLAEXTS
+#if 0
+import GHC.Exts
+-- was this import only needed for I#, or does it have something
+-- to do with the (not-presently-used) IF_NCG also?
+#endif
+import Data.List
+
+#if 0
#if ! OMIT_NATIVE_CODEGEN
# define IF_NCG(a) a
#else
# define IF_NCG(a) {--}
#endif
-
-
--- SIGH: but we use unboxed "sizes"...
-#if __GLASGOW_HASKELL__
-#define IF_GHC(a,b) a
-#else /* not GHC */
-#define IF_GHC(a,b) b
-#endif /* not GHC */
+#endif
\end{code}
\begin{code}
data FiniteMap key elt
= EmptyFM
- | Branch key elt -- Key and elt stored here
- IF_GHC(Int#,Int{-STRICT-}) -- Size >= 1
- (FiniteMap key elt) -- Children
+ | Branch key elt -- Key and elt stored here
+ {-# UNPACK #-} !Int -- Size >= 1
+ (FiniteMap key elt) -- Children
(FiniteMap key elt)
\end{code}
emptyFM = EmptyFM
{-
emptyFM
- = Branch bottom bottom IF_GHC(0#,0) bottom bottom
+ = Branch bottom bottom 0 bottom bottom
where
bottom = panic "emptyFM"
-}
--- #define EmptyFM (Branch _ _ IF_GHC(0#,0) _ _)
+-- #define EmptyFM (Branch _ _ 0 _ _)
-unitFM key elt = Branch key elt IF_GHC(1#,1) emptyFM emptyFM
+unitFM key elt = Branch key elt 1 emptyFM emptyFM
listToFM = addListToFM emptyFM
\begin{code}
--{-# INLINE sizeFM #-}
sizeFM EmptyFM = 0
-sizeFM (Branch _ _ size _ _) = IF_GHC(I# size, size)
+sizeFM (Branch _ _ size _ _) = size
isEmptyFM fm = sizeFM fm == 0
else
#endif
let
- result = Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r
+ result = Branch key elt (1 + left_size + right_size) fm_l fm_r
in
-- if sizeFM result <= 8 then
result
left_size = sizeFM fm_l
right_size = sizeFM fm_r
-
-#ifdef __GLASGOW_HASKELL__
- unbox :: Int -> Int#
- unbox (I# size) = size
-#else
- unbox :: Int -> Int
- unbox x = x
-#endif
\end{code}
%************************************************************************
pprX EmptyFM = char '!'
pprX (Branch key elt sz fm_l fm_r)
= parens (hcat [pprX fm_l, space,
- ppr key, space, int (IF_GHC(I# sz, sz)), space,
+ ppr key, space, int sz, space,
pprX fm_r])
#else
-- and when not debugging the package itself...