{-# LANGUAGE EmptyDataDecls, FlexibleInstances,
  MultiParamTypeClasses, TypeFamilies #-}
module STD.MapIterator.Template where
import Foreign.C.Types
import Foreign.Ptr
import FFICXX.Runtime.Cast
import STD.Pair.Template

data RawMapIterator tpk tpv

newtype MapIterator tpk tpv = MapIterator (Ptr
                                             (RawMapIterator tpk tpv))

class () => IMapIterator tpk tpv where
        deRef :: MapIterator tpk tpv -> IO (Pair tpk tpv)
        
        increment :: MapIterator tpk tpv -> IO (MapIterator tpk tpv)

instance () => FPtr (MapIterator tpk tpv) where
        type Raw (MapIterator tpk tpv) = RawMapIterator tpk tpv
        get_fptr :: MapIterator tpk tpv -> Ptr (Raw (MapIterator tpk tpv))
get_fptr (MapIterator Ptr (RawMapIterator tpk tpv)
ptr) = Ptr (RawMapIterator tpk tpv)
ptr
        cast_fptr_to_obj :: Ptr (Raw (MapIterator tpk tpv)) -> MapIterator tpk tpv
cast_fptr_to_obj = forall tpk tpv. Ptr (RawMapIterator tpk tpv) -> MapIterator tpk tpv
MapIterator

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