{-# LANGUAGE EmptyDataDecls, FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-} module STD.UniquePtr.Template where import Foreign.C.Types import Foreign.Ptr import FFICXX.Runtime.Cast data RawUniquePtr tp1 newtype UniquePtr tp1 = UniquePtr (Ptr (RawUniquePtr tp1)) class () => IUniquePtr tp1 where newUniquePtr0 :: IO (UniquePtr tp1) newUniquePtr :: tp1 -> IO (UniquePtr tp1) get :: UniquePtr tp1 -> IO tp1 release :: UniquePtr tp1 -> IO tp1 reset :: UniquePtr tp1 -> IO () deleteUniquePtr :: UniquePtr tp1 -> IO () instance () => FPtr (UniquePtr tp1) where type Raw (UniquePtr tp1) = RawUniquePtr tp1 get_fptr (UniquePtr ptr) = ptr cast_fptr_to_obj = UniquePtr instance () => Castable (UniquePtr tp1) (Ptr (RawUniquePtr tp1)) where cast x f = f (castPtr (get_fptr x)) uncast x f = f (cast_fptr_to_obj (castPtr x))