-- GENERATED by C->Haskell Compiler, version 0.28.6 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Foreign/CUDA/Driver/Graph/Base.chs" #-}
{-# LANGUAGE BangPatterns               #-}
{-# LANGUAGE CPP                        #-}
{-# LANGUAGE EmptyDataDecls             #-}
{-# LANGUAGE ForeignFunctionInterface   #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE EmptyCase                  #-}
--------------------------------------------------------------------------------
-- |
-- Module    : Foreign.CUDA.Driver.Graph.Base
-- Copyright : [2018] Trevor L. McDonell
-- License   : BSD
--
-- Graph execution functions for the low-level driver interface
--
-- Requires CUDA-10
--
--------------------------------------------------------------------------------

module Foreign.CUDA.Driver.Graph.Base
  where
import qualified Foreign.Ptr as C2HSImp





{-# LINE 26 "src/Foreign/CUDA/Driver/Graph/Base.chs" #-}


import Foreign.Storable
import Foreign.Ptr


--------------------------------------------------------------------------------
-- Data Types
--------------------------------------------------------------------------------

newtype Graph = Graph { useGraph :: ((C2HSImp.Ptr ()))}
  deriving (Eq, Show)

data GraphFlag
instance Enum GraphFlag where
  toEnum   x = error ("GraphFlag.toEnum: Cannot match " ++ show x)
  fromEnum x = case x of {}

newtype Node = Node { useNode :: ((C2HSImp.Ptr ()))}
  deriving (Eq, Show, Storable)

data NodeType = Kernel
              | Memcpy
              | Memset
              | Host
              | Subgraph
              | Empty
              | Count
  deriving (Eq,Show,Bounded)
instance Enum NodeType where
  succ Kernel = Memcpy
  succ Memcpy = Memset
  succ Memset = Host
  succ Host = Subgraph
  succ Subgraph = Empty
  succ Empty = Count
  succ Count = error "NodeType.succ: Count has no successor"

  pred Memcpy = Kernel
  pred Memset = Memcpy
  pred Host = Memset
  pred Subgraph = Host
  pred Empty = Subgraph
  pred Count = Empty
  pred Kernel = error "NodeType.pred: Kernel has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from Count

  fromEnum Kernel = 0
  fromEnum Memcpy = 1
  fromEnum Memset = 2
  fromEnum Host = 3
  fromEnum Subgraph = 4
  fromEnum Empty = 5
  fromEnum Count = 6

  toEnum 0 = Kernel
  toEnum 1 = Memcpy
  toEnum 2 = Memset
  toEnum 3 = Host
  toEnum 4 = Subgraph
  toEnum 5 = Empty
  toEnum 6 = Count
  toEnum unmatched = error ("NodeType.toEnum: Cannot match " ++ show unmatched)

{-# LINE 68 "src/Foreign/CUDA/Driver/Graph/Base.chs" #-}



newtype Executable = Executable { useExecutable :: ((C2HSImp.Ptr ()))}
  deriving (Eq, Show)