{-# LANGUAGE FlexibleInstances, FlexibleContexts, TypeFamilies,
  MultiParamTypeClasses, OverlappingInstances, IncoherentInstances
  #-}
module GDAL.GDALMajorObject.Cast where
import Foreign.Ptr
import FFICXX.Runtime.Cast
import System.IO.Unsafe
import GDAL.GDALMajorObject.RawType
import GDAL.GDALMajorObject.Interface

instance (IGDALMajorObject a, FPtr a) =>
         Castable (a) (Ptr RawGDALMajorObject)
         where
        cast :: forall r. a -> (Ptr RawGDALMajorObject -> IO r) -> IO r
cast a
x Ptr RawGDALMajorObject -> IO r
f = Ptr RawGDALMajorObject -> IO r
f (Ptr (Raw a) -> Ptr RawGDALMajorObject
forall a b. Ptr a -> Ptr b
castPtr (a -> Ptr (Raw a)
forall a. FPtr a => a -> Ptr (Raw a)
get_fptr a
x))
        uncast :: forall r. Ptr RawGDALMajorObject -> (a -> IO r) -> IO r
uncast Ptr RawGDALMajorObject
x a -> IO r
f = a -> IO r
f (Ptr (Raw a) -> a
forall a. FPtr a => Ptr (Raw a) -> a
cast_fptr_to_obj (Ptr RawGDALMajorObject -> Ptr (Raw a)
forall a b. Ptr a -> Ptr b
castPtr Ptr RawGDALMajorObject
x))

instance () => Castable (GDALMajorObject) (Ptr RawGDALMajorObject)
         where
        cast :: forall r.
GDALMajorObject -> (Ptr RawGDALMajorObject -> IO r) -> IO r
cast GDALMajorObject
x Ptr RawGDALMajorObject -> IO r
f = Ptr RawGDALMajorObject -> IO r
f (Ptr RawGDALMajorObject -> Ptr RawGDALMajorObject
forall a b. Ptr a -> Ptr b
castPtr (GDALMajorObject -> Ptr (Raw GDALMajorObject)
forall a. FPtr a => a -> Ptr (Raw a)
get_fptr GDALMajorObject
x))
        uncast :: forall r.
Ptr RawGDALMajorObject -> (GDALMajorObject -> IO r) -> IO r
uncast Ptr RawGDALMajorObject
x GDALMajorObject -> IO r
f = GDALMajorObject -> IO r
f (Ptr (Raw GDALMajorObject) -> GDALMajorObject
forall a. FPtr a => Ptr (Raw a) -> a
cast_fptr_to_obj (Ptr RawGDALMajorObject -> Ptr RawGDALMajorObject
forall a b. Ptr a -> Ptr b
castPtr Ptr RawGDALMajorObject
x))