[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / lib / std / PrelAddr.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1998
3 %
4
5 \section[PrelAddr]{Module @PrelAddr@}
6
7 \begin{code}
8 {-# OPTIONS -fno-implicit-prelude #-}
9
10 module PrelAddr (
11           Addr(..)
12         , Word(..)
13         , nullAddr                      -- :: Addr
14         , plusAddr                      -- :: Addr -> Int -> Addr
15         , indexAddrOffAddr              -- :: Addr -> Int -> Addr
16
17         , Word64(..)
18         , Int64(..)
19    ) where
20
21 import PrelGHC
22 import PrelBase
23 import PrelCCall
24 \end{code}
25
26 \begin{code}
27 data Addr = A# Addr#    deriving (Eq, Ord)
28 data Word = W# Word#    deriving (Eq, Ord)
29
30 instance Show Addr where
31    showsPrec p (A# a) = showsPrec p (I# (addr2Int# a))
32
33 nullAddr = ``NULL'' :: Addr
34
35 plusAddr :: Addr -> Int -> Addr
36 plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
37
38 instance CCallable Addr
39 instance CCallable Addr#
40 instance CReturnable Addr
41
42 instance CCallable Word
43 instance CCallable Word#
44 instance CReturnable Word
45
46 #if WORD_SIZE_IN_BYTES == 8
47 data Word64 = W64# Word#
48 data Int64  = I64# Int#
49 #else
50 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
51 data Int64  = I64# Int64#  --deriving (Eq, Ord) -- Glasgow extension
52
53 instance CCallable   Word64#
54 instance CCallable   Int64#
55 #endif
56
57 instance CCallable   Word64
58 instance CReturnable Word64
59
60 instance CCallable   Int64
61 instance CReturnable Int64
62
63 indexAddrOffAddr   :: Addr -> Int -> Addr
64 indexAddrOffAddr (A# addr#) n
65   = case n                              of { I# n# ->
66     case indexAddrOffAddr# addr# n#     of { r# ->
67     (A# r#)}}
68
69 \end{code}
70