{-# LANGUAGE EmptyDataDecls, FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-} module STD.VectorIterator.Template where import Foreign.C.Types import Foreign.Ptr import FFICXX.Runtime.Cast data RawVectorIterator tp1 newtype VectorIterator tp1 = VectorIterator (Ptr (RawVectorIterator tp1)) class () => IVectorIterator tp1 where deRef :: VectorIterator tp1 -> IO tp1 increment :: VectorIterator tp1 -> IO (VectorIterator tp1) instance () => FPtr (VectorIterator tp1) where type Raw (VectorIterator tp1) = RawVectorIterator tp1 get_fptr (VectorIterator ptr) = ptr cast_fptr_to_obj = VectorIterator instance () => Castable (VectorIterator tp1) (Ptr (RawVectorIterator tp1)) where cast x f = f (castPtr (get_fptr x)) uncast x f = f (cast_fptr_to_obj (castPtr x))