module CodeGen.Render.C
  ( render
  , renderTenType
  , renderCType
  -- , renderNNType
  ) where

import CodeGen.Prelude
import CodeGen.Types

render :: Parsable -> Text
render =
  \case
    -- special pointer cases
    Ptr x -> render x <> " *"
    TenType x -> renderTenType x
    -- NNType x -> renderNNType lt x
    CType x -> renderCType x


renderTenType :: TenType -> Text
renderTenType = \case
  Pair (Real, _)    -> "real"
  Pair (AccReal, _) -> "accreal"
  p@(Pair (rtt, lib)) -> (if isConcreteCudaPrefixed p then "THCuda" else tshow lib) <> tshow rtt


renderCType :: CType -> Text
renderCType = \case
  CUInt64  -> "uint64_t"
  CUInt32  -> "uint32_t"
  CUInt16  -> "uint16_t"
  CUInt8   -> "uint8_t"

  CInt64   -> "int64_t"
  CInt32   -> "int32_t"
  CInt16   -> "int16_t"
  CInt8    -> "int8_t"
  CInt     -> "int"

  CSize    -> "size_t"
  CLong    -> "long"
  CChar    -> "char"
  CShort   -> "short"
  CFloat   -> "float"
  CDouble  -> "double"
  CPtrdiff -> "ptrdiff_t"
  CVoid    -> "void"
  CBool    -> "bool"


-- -- FIXME: get back to this when THC is finished
-- renderNNType :: LibType -> NNType -> Text
-- renderNNType lt nt = tshow lt <> tshow nt