{-# LANGUAGE EmptyDataDecls, FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-} module STD.SharedPtr.Template where import Foreign.C.Types import Foreign.Ptr import FFICXX.Runtime.Cast data RawSharedPtr tp1 newtype SharedPtr tp1 = SharedPtr (Ptr (RawSharedPtr tp1)) class () => ISharedPtr tp1 where newSharedPtr0 :: IO (SharedPtr tp1) newSharedPtr :: tp1 -> IO (SharedPtr tp1) get :: SharedPtr tp1 -> IO tp1 reset :: SharedPtr tp1 -> IO () use_count :: SharedPtr tp1 -> IO CInt deleteSharedPtr :: SharedPtr tp1 -> IO () instance () => FPtr (SharedPtr tp1) where type Raw (SharedPtr tp1) = RawSharedPtr tp1 get_fptr (SharedPtr ptr) = ptr cast_fptr_to_obj = SharedPtr instance () => Castable (SharedPtr tp1) (Ptr (RawSharedPtr tp1)) where cast x f = f (castPtr (get_fptr x)) uncast x f = f (cast_fptr_to_obj (castPtr x))