module Foreign.Hoppy.Generator.Std.Iterator (
IteratorMutability (..),
makeTrivialIterator,
makeForwardIterator,
makeBidirectionalIterator,
makeRandomIterator,
) where
import Data.Maybe (catMaybes, isJust)
import Foreign.Hoppy.Generator.Spec (
ClassFeature (Assignable, Copyable, Equatable),
Operator (
OpAdd,
OpAddAssign,
OpArray,
OpDecPre,
OpDeref,
OpIncPre,
OpSubtract,
OpSubtractAssign),
Purity (Nonpure),
Type,
addReqIncludes,
classAddFeatures,
ident2,
np,
)
import Foreign.Hoppy.Generator.Types
import Foreign.Hoppy.Generator.Spec.Class (
Class,
MethodApplicability (MNormal),
classAddEntities,
makeFnMethod,
mkConstMethod',
mkCtor,
mkMethod',
)
import Foreign.Hoppy.Generator.Std.Internal (includeHelper)
data IteratorMutability = Constant | Mutable
deriving (Eq, Ord, Show)
makeTrivialIterator :: IteratorMutability -> Maybe Type -> Class -> Class
makeTrivialIterator mutable valueTypeMaybe cls =
(if isJust valueTypeMaybe && mutable == Mutable
then addReqIncludes [includeHelper "iterator.hpp"]
else id) $
classAddFeatures [Assignable, Copyable, Equatable] $
classAddEntities ents cls
where ents =
catMaybes
[ Just $ mkCtor "new" np
, do valueType <- valueTypeMaybe
Mutable <- Just mutable
return $ mkMethod' OpDeref "get" np $ refT valueType
, do valueType <- valueTypeMaybe
return $ mkConstMethod' OpDeref "getConst" np $ refT $ constT valueType
, do valueType <- valueTypeMaybe
Mutable <- Just mutable
return $
makeFnMethod (ident2 "hoppy" "iterator" "put") "put"
MNormal Nonpure [ptrT $ objT cls, valueType] voidT
]
makeForwardIterator :: IteratorMutability -> Maybe Type -> Class -> Class
makeForwardIterator mutable valueTypeMaybe cls =
classAddEntities ents $
makeTrivialIterator mutable valueTypeMaybe cls
where ents =
[ mkMethod' OpIncPre "next" np $ refT $ objT cls
]
makeBidirectionalIterator :: IteratorMutability -> Maybe Type -> Class -> Class
makeBidirectionalIterator mutability valueTypeMaybe cls =
classAddEntities ents $
makeForwardIterator mutability valueTypeMaybe cls
where ents =
[ mkMethod' OpDecPre "prev" np $ refT $ objT cls
]
makeRandomIterator :: IteratorMutability -> Maybe Type -> Type -> Class -> Class
makeRandomIterator mutable valueTypeMaybe distanceType cls =
classAddEntities ents $
makeBidirectionalIterator mutable valueTypeMaybe cls
where ents =
catMaybes
[ Just $ mkMethod' OpAdd "plus" [distanceType] $ toGcT $ objT cls
, Just $ mkMethod' OpAddAssign "add" [distanceType] $ refT $ objT cls
, Just $ mkMethod' OpSubtract "minus" [distanceType] $ toGcT $ objT cls
, Just $ mkMethod' OpSubtract "difference" [objT cls] distanceType
, Just $ mkMethod' OpSubtractAssign "subtract" [distanceType] $ refT $ objT cls
, do valueType <- valueTypeMaybe
Mutable <- Just mutable
return $ mkMethod' OpArray "at" [distanceType] $ refT valueType
, do valueType <- valueTypeMaybe
return $ mkConstMethod' OpArray "atConst" [distanceType] $ refT $ constT valueType
]