{-# LINE 1 "src/Foreign/CUDA/Types.chs" #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE EmptyCase #-}
module Foreign.CUDA.Types (
DevicePtr(..), HostPtr(..),
Event(..), EventFlag(..), WaitFlag,
Stream(..), StreamFlag(..), StreamPriority,
defaultStream,
) where
import qualified Foreign.Ptr as C2HSImp
import Foreign.Ptr
import Foreign.Storable
{-# LINE 37 "src/Foreign/CUDA/Types.chs" #-}
newtype DevicePtr a = DevicePtr { useDevicePtr :: Ptr a }
deriving (Eq,Ord)
instance Show (DevicePtr a) where
showsPrec n (DevicePtr p) = showsPrec n p
instance Storable (DevicePtr a) where
sizeOf _ = sizeOf (undefined :: Ptr a)
alignment _ = alignment (undefined :: Ptr a)
peek p = DevicePtr `fmap` peek (castPtr p)
poke p v = poke (castPtr p) (useDevicePtr v)
newtype HostPtr a = HostPtr { useHostPtr :: Ptr a }
deriving (Eq,Ord)
instance Show (HostPtr a) where
showsPrec n (HostPtr p) = showsPrec n p
instance Storable (HostPtr a) where
sizeOf _ = sizeOf (undefined :: Ptr a)
alignment _ = alignment (undefined :: Ptr a)
peek p = HostPtr `fmap` peek (castPtr p)
poke p v = poke (castPtr p) (useHostPtr v)
newtype Event = Event { useEvent :: ((C2HSImp.Ptr ()))}
deriving (Eq, Show)
data EventFlag = EventDefault
| BlockingSync
| DisableTiming
| Interprocess
deriving (Eq,Show,Bounded)
instance Enum EventFlag where
succ EventDefault = BlockingSync
succ BlockingSync = DisableTiming
succ DisableTiming = Interprocess
succ Interprocess = error "EventFlag.succ: Interprocess has no successor"
pred BlockingSync = EventDefault
pred DisableTiming = BlockingSync
pred Interprocess = DisableTiming
pred EventDefault = error "EventFlag.pred: EventDefault has no predecessor"
enumFromTo from to = go from
where
end = fromEnum to
go v = case compare (fromEnum v) end of
LT -> v : go (succ v)
EQ -> [v]
GT -> []
enumFrom from = enumFromTo from Interprocess
fromEnum EventDefault = 0
fromEnum BlockingSync = 1
fromEnum DisableTiming = 2
fromEnum Interprocess = 4
toEnum 0 = EventDefault
toEnum 1 = BlockingSync
toEnum 2 = DisableTiming
toEnum 4 = Interprocess
toEnum unmatched = error ("EventFlag.toEnum: Cannot match " ++ show unmatched)
{-# LINE 104 "src/Foreign/CUDA/Types.chs" #-}
data WaitFlag
instance Enum WaitFlag where
toEnum x = case x of {}
fromEnum x = case x of {}
newtype Stream = Stream { useStream :: ((C2HSImp.Ptr ()))}
deriving (Eq, Show)
type StreamPriority = Int
data StreamFlag = StreamDefault
| NonBlocking
deriving (Eq,Show,Bounded)
instance Enum StreamFlag where
succ StreamDefault = NonBlocking
succ NonBlocking = error "StreamFlag.succ: NonBlocking has no successor"
pred NonBlocking = StreamDefault
pred StreamDefault = error "StreamFlag.pred: StreamDefault has no predecessor"
enumFromTo from to = go from
where
end = fromEnum to
go v = case compare (fromEnum v) end of
LT -> v : go (succ v)
EQ -> [v]
GT -> []
enumFrom from = enumFromTo from NonBlocking
fromEnum StreamDefault = 0
fromEnum NonBlocking = 1
toEnum 0 = StreamDefault
toEnum 1 = NonBlocking
toEnum unmatched = error ("StreamFlag.toEnum: Cannot match " ++ show unmatched)
{-# LINE 155 "src/Foreign/CUDA/Types.chs" #-}
{-# INLINE defaultStream #-}
defaultStream :: Stream
defaultStream = Stream nullPtr