skype4hs-0.0.0.0: src/Network/Skype/API/Carbon/CFNumber.hsc
module Network.Skype.API.Carbon.CFNumber where
#include "CoreFoundation/CFNumber.h"
import Foreign
import Foreign.C.Types
import Network.Skype.API.Carbon.CFBase
data CFNumber
type CFNumberRef = Ptr CFNumber
class CFNumberFactory a where
fromCFNumber :: CFNumberRef -> IO a
newCFNumber :: a -> IO CFNumberRef
instance (Integral a) => CFNumberFactory a where
fromCFNumber number = alloca $ \(ptr :: Ptr CInt) -> do
_ <- c_CFNumberGetValue number intType ptr
fromIntegral `fmap` peek ptr
newCFNumber value = alloca $ \ptr -> do
poke ptr (fromIntegral value :: CInt)
c_CFNumberCreate defaultAllocator intType ptr
withCFNumber :: (CFNumberFactory a) => a -> (CFNumberRef -> IO b) -> IO b
withCFNumber source action = do
number <- newCFNumber source
result <- action number
c_CFRelease number
return result
newtype CFNumberType = CFNumberType CInt
deriving (Eq, Show)
#{enum CFNumberType, CFNumberType
, sInt8Type = kCFNumberSInt8Type
, sInt16Type = kCFNumberSInt16Type
, sInt32Type = kCFNumberSInt32Type
, sInt64Type = kCFNumberSInt64Type
, float32Type = kCFNumberFloat32Type
, float64Type = kCFNumberFloat64Type
, charType = kCFNumberCharType
, shortType = kCFNumberShortType
, intType = kCFNumberIntType
, longType = kCFNumberLongType
, longLongType = kCFNumberLongLongType
, floatType = kCFNumberFloatType
, doubleType = kCFNumberDoubleType
, cfIndexType = kCFNumberCFIndexType
, nsIntegerType = kCFNumberNSIntegerType
, cgFloatType = kCFNumberCGFloatType
, maxType = kCFNumberMaxType
}
foreign import ccall unsafe "CFNumberCreate"
c_CFNumberCreate :: CFAllocatorRef -- allocator
-> CFNumberType -- theType
-> Ptr value -- valuePtr
-> IO CFNumberRef
foreign import ccall unsafe "CFNumberGetValue"
c_CFNumberGetValue :: CFNumberRef -- number
-> CFNumberType -- theType
-> Ptr value -- valuePtr
-> IO Bool