\end{display}
The code is SPECIALIZEd to various highly-desirable types (e.g., Id)
-near the end (only \tr{#ifdef COMPILING_GHC}).
+near the end.
\begin{code}
-#ifdef COMPILING_GHC
#include "HsVersions.h"
#define IF_NOT_GHC(a) {--}
-#else
-#define ASSERT(e) {--}
-#define IF_NOT_GHC(a) a
-#define COMMA ,
-#define _tagCmp compare
-#define _LT LT
-#define _GT GT
-#define _EQ EQ
-#endif
-#if defined(COMPILING_GHC) && defined(DEBUG_FINITEMAPS)/* NB NB NB */
+#if defined(DEBUG_FINITEMAPS)/* NB NB NB */
#define OUTPUTABLE_key , Outputable key
#else
#define OUTPUTABLE_key {--}
fmToList, keysFM, eltsFM
-#ifdef COMPILING_GHC
, bagToFM
, SYN_IE(FiniteSet), emptySet, mkSet, isEmptySet
, elementOf, setToList, union, minusSet
-#endif
+
) where
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 201
import Outputable ( PprStyle, Outputable(..) )
import Pretty ( Doc )
-#ifdef COMPILING_GHC
-
-# if ! OMIT_NATIVE_CODEGEN
+#if ! OMIT_NATIVE_CODEGEN
# define IF_NCG(a) a
-# else
+#else
# define IF_NCG(a) {--}
-# endif
#endif
+
-- SIGH: but we use unboxed "sizes"...
#if __GLASGOW_HASKELL__
#define IF_GHC(a,b) a
unitFM :: key -> elt -> FiniteMap key elt
listToFM :: (Ord key OUTPUTABLE_key) => [(key,elt)] -> FiniteMap key elt
-- In the case of duplicates, the last is taken
-#ifdef COMPILING_GHC
bagToFM :: (Ord key OUTPUTABLE_key) => Bag (key,elt) -> FiniteMap key elt
-- In the case of duplicates, who knows which is taken
-#endif
-- ADDING AND DELETING
-- Throws away any previous binding
listToFM = addListToFM emptyFM
-#ifdef COMPILING_GHC
bagToFM = foldrBag (\(k,v) fm -> addToFM fm k v) emptyFM
-#endif
\end{code}
%************************************************************************
mkBranch which key elt fm_l fm_r
= --ASSERT( left_ok && right_ok && balance_ok )
-#if defined(COMPILING_GHC) && defined(DEBUG_FINITEMAPS)
+#if defined(DEBUG_FINITEMAPS)
if not ( left_ok && right_ok && balance_ok ) then
pprPanic ("mkBranch:"++show which) (vcat [ppr PprDebug [left_ok, right_ok, balance_ok],
ppr PprDebug key,
%************************************************************************
\begin{code}
-#if defined(COMPILING_GHC) && defined(DEBUG_FINITEMAPS)
+#if defined(DEBUG_FINITEMAPS)
instance (Outputable key) => Outputable (FiniteMap key elt) where
ppr sty fm = pprX sty fm
pprX sty fm_r])
#endif
-#ifndef COMPILING_GHC
+#if 0
instance (Eq key, Eq elt) => Eq (FiniteMap key elt) where
fm_1 == fm_2 = (sizeFM fm_1 == sizeFM fm_2) && -- quick test
(fmToList fm_1 == fmToList fm_2)
%************************************************************************
\begin{code}
-#ifdef COMPILING_GHC
-
type FiniteSet key = FiniteMap key ()
emptySet :: FiniteSet key
mkSet :: (Ord key OUTPUTABLE_key) => [key] -> FiniteSet key
setToList = keysFM
union = plusFM
-#endif
\end{code}
%************************************************************************
\tr{Uniques}, for dastardly efficiency reasons.
\begin{code}
-#if defined(COMPILING_GHC) && __GLASGOW_HASKELL__ && !defined(REALLY_HASKELL_1_3)
+#if __GLASGOW_HASKELL__ && !defined(REALLY_HASKELL_1_3)
{-# SPECIALIZE addListToFM
:: FiniteMap (FAST_STRING, FAST_STRING) elt -> [((FAST_STRING, FAST_STRING),elt)] -> FiniteMap (FAST_STRING, FAST_STRING) elt
IF_NCG(COMMA (elt -> elt -> elt) -> FiniteMap Reg elt -> FiniteMap Reg elt -> FiniteMap Reg elt)
#-}
-#endif {- compiling for GHC -}
+#endif {- compiling with ghc and have specialiser -}
\end{code}