X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FUniqSet.lhs;h=129e333eb5dfc76a804276bb3b3bfbb48a93723f;hb=28a464a75e14cece5db40f2765a29348273ff2d2;hp=2f53d068bc221353e6b2a867bd28161c58f35390;hpb=38db229302890403037c5de7453299b3538bb404;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/UniqSet.lhs b/ghc/compiler/utils/UniqSet.lhs index 2f53d06..129e333 100644 --- a/ghc/compiler/utils/UniqSet.lhs +++ b/ghc/compiler/utils/UniqSet.lhs @@ -1,5 +1,5 @@ % -% (c) The AQUA Project, Glasgow University, 1994-1996 +% (c) The AQUA Project, Glasgow University, 1994-1998 % \section[UniqSet]{Specialised sets, for things with @Uniques@} @@ -8,31 +8,24 @@ Based on @UniqFMs@ (as you would expect). Basically, the things need to be in class @Uniquable@. \begin{code} -#include "HsVersions.h" - module UniqSet ( - SYN_IE(UniqSet), -- abstract type: NOT + UniqSet, -- abstract type: NOT mkUniqSet, uniqSetToList, emptyUniqSet, unitUniqSet, - addOneToUniqSet, addListToUniqSet, + addOneToUniqSet, addListToUniqSet, delOneFromUniqSet, delListFromUniqSet, unionUniqSets, unionManyUniqSets, minusUniqSet, elementOfUniqSet, mapUniqSet, intersectUniqSets, - isEmptyUniqSet, filterUniqSet, sizeUniqSet + isEmptyUniqSet, filterUniqSet, sizeUniqSet, foldUniqSet, + elemUniqSet_Directly, lookupUniqSet, hashUniqSet ) where -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 201 -IMPORT_DELOOPER( SpecLoop ) -#else -import {-# SOURCE #-} Name -#endif +#include "HsVersions.h" + +import {-# SOURCE #-} Name ( Name ) import Maybes ( maybeToBool ) import UniqFM import Unique ( Unique, Uniquable(..) ) -import SrcLoc ( SrcLoc ) -import Outputable ( PprStyle, Outputable(..) ) -import Pretty ( Doc ) -import Util ( Ord3(..) ) #if ! OMIT_NATIVE_CODEGEN #define IF_NCG(a) a @@ -47,7 +40,7 @@ import Util ( Ord3(..) ) %* * %************************************************************************ -We use @UniqFM@, with a (@uniqueOf@-able) @Unique@ as ``key'' +We use @UniqFM@, with a (@getUnique@-able) @Unique@ as ``key'' and the thing itself as the ``value'' (for later retrieval). \begin{code} @@ -65,12 +58,21 @@ unitUniqSet x = MkUniqSet (unitUFM x x) uniqSetToList :: UniqSet a -> [a] uniqSetToList (MkUniqSet set) = eltsUFM set +foldUniqSet :: (a -> b -> b) -> b -> UniqSet a -> b +foldUniqSet k z (MkUniqSet set) = foldUFM k z set + mkUniqSet :: Uniquable a => [a] -> UniqSet a mkUniqSet xs = MkUniqSet (listToUFM [ (x, x) | x <- xs]) addOneToUniqSet :: Uniquable a => UniqSet a -> a -> UniqSet a addOneToUniqSet (MkUniqSet set) x = MkUniqSet (addToUFM set x x) +delOneFromUniqSet :: Uniquable a => UniqSet a -> a -> UniqSet a +delOneFromUniqSet (MkUniqSet set) x = MkUniqSet (delFromUFM set x) + +delListFromUniqSet :: Uniquable a => UniqSet a -> [a] -> UniqSet a +delListFromUniqSet (MkUniqSet set) xs = MkUniqSet (delListFromUFM set xs) + addListToUniqSet :: Uniquable a => UniqSet a -> [a] -> UniqSet a addListToUniqSet (MkUniqSet set) xs = MkUniqSet (addListToUFM set [(x,x) | x<-xs]) @@ -95,19 +97,24 @@ intersectUniqSets (MkUniqSet set1) (MkUniqSet set2) = MkUniqSet (intersectUFM se elementOfUniqSet :: Uniquable a => a -> UniqSet a -> Bool elementOfUniqSet x (MkUniqSet set) = maybeToBool (lookupUFM set x) +lookupUniqSet :: Uniquable a => UniqSet a -> a -> Maybe a +lookupUniqSet (MkUniqSet set) x = lookupUFM set x + +elemUniqSet_Directly :: Unique -> UniqSet a -> Bool +elemUniqSet_Directly x (MkUniqSet set) = maybeToBool (lookupUFM_Directly set x) + sizeUniqSet :: UniqSet a -> Int sizeUniqSet (MkUniqSet set) = sizeUFM set +hashUniqSet :: UniqSet a -> Int +hashUniqSet (MkUniqSet set) = hashUFM set + isEmptyUniqSet :: UniqSet a -> Bool isEmptyUniqSet (MkUniqSet set) = isNullUFM set {-SLOW: sizeUFM set == 0-} -mapUniqSet :: Uniquable b => (a -> b) -> UniqSet a -> UniqSet b -mapUniqSet f (MkUniqSet set) - = MkUniqSet (listToUFM [ let - mapped_thing = f thing - in - (mapped_thing, mapped_thing) - | thing <- eltsUFM set ]) +mapUniqSet :: (a -> a) -> UniqSet a -> UniqSet a + -- VERY IMPORTANT: *assumes* that the function doesn't change the unique +mapUniqSet f (MkUniqSet set) = MkUniqSet (mapUFM f set) \end{code} \begin{code} @@ -115,17 +122,17 @@ mapUniqSet f (MkUniqSet set) {-# SPECIALIZE addOneToUniqSet :: UniqSet Unique -> Unique -> UniqSet Unique #-} -{-# SPECIALIZE +{- SPECIALIZE elementOfUniqSet :: Name -> UniqSet Name -> Bool , Unique -> UniqSet Unique -> Bool - #-} -{-# SPECIALIZE + -} +{- SPECIALIZE mkUniqSet :: [Name] -> UniqSet Name - #-} + -} -{-# SPECIALIZE +{- SPECIALIZE unitUniqSet :: Name -> UniqSet Name , Unique -> UniqSet Unique - #-} + -} #endif \end{code}