packages feed

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