[project @ 2002-04-26 12:48:16 by simonmar]
[ghc-base.git] / GHC / Ptr.lhs
1 \begin{code}
2 {-# OPTIONS -fno-implicit-prelude #-}
3 -----------------------------------------------------------------------------
4 -- |
5 -- Module      :  GHC.Ptr
6 -- Copyright   :  (c) The FFI Task Force, 2000-2002
7 -- License     :  see libraries/base/LICENSE
8 -- 
9 -- Maintainer  :  ffi@haskell.org
10 -- Stability   :  internal
11 -- Portability :  non-portable (GHC Extensions)
12 --
13 -- The 'Ptr' and 'FunPtr' types and operations.
14 --
15 -----------------------------------------------------------------------------
16
17 module GHC.Ptr where
18
19 import GHC.Base
20
21 ------------------------------------------------------------------------
22 -- Data pointers.
23
24 data Ptr a = Ptr Addr# deriving (Eq, Ord)
25
26 nullPtr :: Ptr a
27 nullPtr = Ptr nullAddr#
28
29 castPtr :: Ptr a -> Ptr b
30 castPtr (Ptr addr) = Ptr addr
31
32 plusPtr :: Ptr a -> Int -> Ptr b
33 plusPtr (Ptr addr) (I# d) = Ptr (plusAddr# addr d)
34
35 alignPtr :: Ptr a -> Int -> Ptr a
36 alignPtr addr@(Ptr a) (I# i)
37   = case remAddr# a i of {
38       0# -> addr;
39       n -> Ptr (plusAddr# a (i -# n)) }
40
41 minusPtr :: Ptr a -> Ptr b -> Int
42 minusPtr (Ptr a1) (Ptr a2) = I# (minusAddr# a1 a2)
43
44 instance CCallable   (Ptr a)
45 instance CReturnable (Ptr a)
46
47 ------------------------------------------------------------------------
48 -- Function pointers for the default calling convention.
49
50 data FunPtr a = FunPtr Addr# deriving (Eq, Ord)
51
52 nullFunPtr :: FunPtr a
53 nullFunPtr = FunPtr nullAddr#
54
55 castFunPtr :: FunPtr a -> FunPtr b
56 castFunPtr (FunPtr addr) = FunPtr addr
57
58 castFunPtrToPtr :: FunPtr a -> Ptr b
59 castFunPtrToPtr (FunPtr addr) = Ptr addr
60
61 castPtrToFunPtr :: Ptr a -> FunPtr b
62 castPtrToFunPtr (Ptr addr) = FunPtr addr
63
64 instance CCallable   (FunPtr a)
65 instance CReturnable (FunPtr a)
66
67 \end{code}
68