module DDC.Core.Salt.Name.PrimCast
( PrimCast (..)
, readPrimCast
, primCastPromoteIsValid
, primCastTruncateIsValid)
where
import DDC.Core.Salt.Name.PrimTyCon
import DDC.Core.Salt.Platform
import DDC.Base.Pretty
import Control.DeepSeq
data PrimCast
= PrimCastConvert
| PrimCastPromote
| PrimCastTruncate
deriving (Eq, Ord, Show)
instance NFData PrimCast
instance Pretty PrimCast where
ppr c
= case c of
PrimCastConvert -> text "convert#"
PrimCastPromote -> text "promote#"
PrimCastTruncate -> text "truncate#"
readPrimCast :: String -> Maybe PrimCast
readPrimCast str
= case str of
"convert#" -> Just PrimCastConvert
"promote#" -> Just PrimCastPromote
"truncate#" -> Just PrimCastTruncate
_ -> Nothing
primCastPromoteIsValid
:: Platform
-> PrimTyCon
-> PrimTyCon
-> Bool
primCastPromoteIsValid pp src dst
| primTyConIsIntegral src, primTyConIsIntegral dst
, primTyConIsUnsigned src, primTyConIsUnsigned dst
, primTyConWidth pp dst >= primTyConWidth pp src
= True
| primTyConIsIntegral src, primTyConIsIntegral dst
, primTyConIsSigned src, primTyConIsSigned dst
, primTyConWidth pp dst >= primTyConWidth pp src
= True
| primTyConIsIntegral src, primTyConIsIntegral dst
, primTyConIsUnsigned src, primTyConIsSigned dst
, primTyConWidth pp dst > primTyConWidth pp src
= True
| otherwise
= False
primCastTruncateIsValid
:: Platform
-> PrimTyCon
-> PrimTyCon
-> Bool
primCastTruncateIsValid _pp src dst
| primTyConIsIntegral src
, primTyConIsIntegral dst
= True
| otherwise
= False