summaryrefslogtreecommitdiff
path: root/old/Storage.hs
blob: 2697c394f95d7ec505d1d82f4799305823e7c0b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
{-# LANGUAGE ForeignFunctionInterface #-}

module Storage(
    PrefStorage,
    createStorage,
    pokePref,
    peekPref
    ) where




import Foreign
import Foreign.C




foreign import ccall "create_pref_array"
    c_createPrefArray :: CInt -> CInt -> IO (Ptr PrefArray)

foreign import ccall "free_pref_array"
    c_freePrefArray :: CInt -> CInt -> Ptr PrefArray -> IO ()

foreign import ccall "wrapper"
    wrap :: (Ptr PrefArray -> IO ()) -> IO (FunPtr (Ptr PrefArray -> IO ()))

foreign import ccall "poke_pref_array"
    c_pokePrefArray :: CInt -> CInt -> Ptr PrefArray -> CInt -> CInt -> CInt -> IO ()

foreign import ccall "peek_pref_array"
    c_peekPrefArray :: CInt -> CInt -> Ptr PrefArray -> CInt -> CInt -> CInt -> IO CInt




newtype PrefArray = PrefArray (Ptr PrefArray)

data PrefStorage = PrefStorage { pointer      :: ForeignPtr PrefArray
                               , numBallots   :: Int
                               , sizeOfBallot :: Int }




createStorage :: Int -> Int -> IO PrefStorage
createStorage n s = do
    x <- c_createPrefArray (fromIntegral n) (fromIntegral s)
    f <- wrap (c_freePrefArray (fromIntegral n) (fromIntegral s))
    y <- newForeignPtr f x
    return (PrefStorage y n s)




pokePref :: PrefStorage -> Int -> Int -> Int -> IO ()
pokePref p n s r = do
    let numBal = fromIntegral (numBallots p)
        sizeBal = fromIntegral (sizeOfBallot p)
        func a = c_pokePrefArray numBal sizeBal a (fromIntegral n) (fromIntegral s) (fromIntegral r)
    withForeignPtr (pointer p) func




peekPref :: PrefStorage -> Int -> Int -> Int -> IO Bool
peekPref p n s r = do
    let numBal = fromIntegral (numBallots p)
        sizeBal = fromIntegral (sizeOfBallot p)
        func a = c_peekPrefArray numBal sizeBal a (fromIntegral n) (fromIntegral s) (fromIntegral r)
    result <- withForeignPtr (pointer p) func
    return (result /= 0)