module Data.Array.Parallel.Base.Debug
( check
, checkCritical
, checkLen
, checkSlice
, checkEq
, checkNotEmpty
, uninitialised)
where
import Data.Array.Parallel.Base.Config (debug, debugCritical)
errorOfBounds :: String -> Int -> Int -> a
errorOfBounds loc n i
= error $ loc ++ ": Out of bounds "
++ "(vector length = " ++ show n
++ "; index = " ++ show i ++ ")"
errorBadSlice :: String -> Int -> Int -> Int -> a
errorBadSlice loc vecLen sliceStart sliceLen
= error $ loc ++ ": Bad slice "
++ "(vecLen = " ++ show vecLen
++ "; sliceStart = " ++ show sliceStart
++ "; sliceLen = " ++ show sliceLen ++ ")"
check :: String -> Int -> Int -> a -> a
check loc n i v
| debug
= if i >= 0 && i < n
then v
else errorOfBounds loc n i
| otherwise = v
checkCritical :: String -> Int -> Int -> a -> a
checkCritical loc n i v
| debugCritical
= if i >= 0 && i < n
then v
else errorOfBounds loc n i
| otherwise = v
checkLen :: String -> Int -> Int -> a -> a
checkLen loc n i v
| debug
= if i >= 0 && i <= n
then v
else errorOfBounds loc n i
| otherwise = v
checkSlice :: String -> Int -> Int -> Int -> a -> a
checkSlice loc vecLen sliceStart sliceLen v
| debug
= if ( sliceStart >= 0 && sliceStart <= vecLen
&& sliceStart + sliceLen >= 0 && sliceStart + sliceLen <= vecLen )
then v
else errorBadSlice loc vecLen sliceStart sliceLen
| otherwise = v
checkEq :: (Eq a, Show a) => String -> String -> a -> a -> b -> b
checkEq loc msg x y v
| debug
= if x == y
then v
else error $ loc ++ ": " ++ msg
++ " (first = " ++ show x
++ "; second = " ++ show y ++ ")"
| otherwise = v
checkNotEmpty :: String -> Int -> a -> a
checkNotEmpty loc n v
| debug
= if n /= 0
then v
else error $ loc ++ ": Empty array"
| otherwise = v
uninitialised :: String -> a
uninitialised loc
= error $ loc ++ ": Touched an uninitialised value"