This could be beside castPtr, castCharToCChar etc.

----

castAny :: (Storable a, Storable b) => a -> b
castAny = unsafePerformIO . genericCast
  where
    genericCast :: (Storable a, Storable b) => a -> IO b
    genericCast v = return undefined >>= \r ->
      allocaBytes (max (sizeOf v) (sizeOf r)) $ \p ->
        poke p v >> if False then return r else peek (castPtr p)

----

GHCi:

   > let a = -1000 :: Int16
   > castAny a :: Word16  -->
   64536
   > castAny a :: Ptr ()
   0xb4c2fc18
   > castAny (castAny a :: Ptr ()) :: Int16
   -1000

   > let b = pi :: CLDouble
   > b
   3.141592653589793
   > castAny b :: CInt
   1413754136
   > castAny b :: Ptr ()
   0x54442d18
   > castAny b :: CFloat
   3.3702806e12
   > castAny b :: Int8
   24


At minimum, this is safer than 'unsafeCoerce'. What do you think?

Best,
Maurício

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to