{-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-} module Ivory.Language.SizeOf where import Ivory.Language.Area import Ivory.Language.Proxy import qualified Ivory.Language.Syntax as AST import Ivory.Language.Type class IvorySizeOf (t :: Area *) where instance IvorySizeOf ('Struct sym) where instance (ANat len, IvorySizeOf area) => IvorySizeOf ('Array len area) where -- NOTE: (CArray area) is not safe to take sizeOf on. instance IvoryType area => IvorySizeOf ('Stored area) where -- | Get the size of an ivory type. sizeOf :: (IvoryArea t, IvorySizeOf t, IvoryExpr a, Num a) => Proxy t -> a sizeOf = wrapExpr . AST.ExpSizeOf . ivoryArea