Macros for bounds checking
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 14:03:24 +0000 (14:03 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 14:03:24 +0000 (14:03 +0000)
Data/Vector/Fusion/Stream.hs
Data/Vector/Fusion/Stream/Monadic.hs
Data/Vector/Generic.hs
Data/Vector/Generic/Mutable.hs
Data/Vector/Generic/New.hs
include/vector.h

index de8efba..057de01 100644 (file)
@@ -12,8 +12,6 @@
 -- Streams for stream fusion
 --
 
-#include "vector.h"
-
 module Data.Vector.Fusion.Stream (
   -- * Types
   Step(..), Stream, MStream,
@@ -92,6 +90,8 @@ import Prelude hiding ( length, null,
                         enumFromTo, enumFromThenTo,
                         mapM_ )
 
+#include "vector.h"
+
 -- | The type of pure streams 
 type Stream = M.Stream Id
 
index c94c238..6299d29 100644 (file)
@@ -12,8 +12,6 @@
 -- Monadic streams
 --
 
-#include "vector.h"
-
 module Data.Vector.Fusion.Stream.Monadic (
   Stream(..), Step(..),
 
@@ -89,6 +87,8 @@ import qualified Prelude
 import Data.Int  ( Int8, Int16, Int32, Int64 )
 import Data.Word ( Word8, Word16, Word32, Word, Word64 )
 
+#include "vector.h"
+
 -- | Result of taking a single step in a stream
 data Step s a = Yield a s  -- ^ a new element and a new seed
               | Skip    s  -- ^ just a new seed
index 6d98dcc..f41dd4c 100644 (file)
@@ -12,8 +12,6 @@
 -- Generic interface to pure vectors
 --
 
-#include "vector.h"
-
 module Data.Vector.Generic (
   -- * Immutable vectors
   Vector(..),
@@ -103,6 +101,8 @@ import Prelude hiding ( length, null,
                         scanl, scanl1,
                         enumFromTo, enumFromThenTo )
 
+#include "vector.h"
+
 -- | Class of immutable vectors.
 --
 class Vector v a where
index d9d592b..c022b1c 100644 (file)
@@ -11,8 +11,6 @@
 -- Generic interface to mutable vectors
 --
 
-#include "vector.h"
-
 module Data.Vector.Generic.Mutable (
   MVectorPure(..), MVector(..),
 
@@ -34,6 +32,8 @@ import GHC.Float (
 
 import Prelude hiding ( length, reverse, map, read )
 
+#include "vector.h"
+
 gROWTH_FACTOR :: Double
 gROWTH_FACTOR = 1.5
 
index d1c61fb..c70117a 100644 (file)
@@ -12,8 +12,6 @@
 -- Purely functional interface to initialisation of mutable vectors
 --
 
-#include "vector.h"
-
 module Data.Vector.Generic.New (
   New(..), run, unstream, transform, accum, update, reverse,
   slice, init, tail, take, drop,
@@ -29,6 +27,8 @@ import qualified Data.Vector.Fusion.Stream as Stream
 import Control.Monad  ( liftM )
 import Prelude hiding ( init, tail, take, drop, reverse, map, filter )
 
+#include "vector.h"
+
 newtype New a = New (forall m mv. MVector mv m a => m (mv a))
 
 run :: MVector mv m a => New a -> m (mv a)
index f3f8e01..c59e3a2 100644 (file)
@@ -4,3 +4,27 @@
 #define INLINE_STREAM INLINE PHASE_STREAM
 #define INLINE_INNER  INLINE PHASE_INNER
 
+
+#ifndef NOT_VECTOR_MODULE
+import qualified Data.Vector.Internal.Check as Ck
+
+this_module :: String
+this_module = __FILE__
+#endif
+
+#define ERROR  (Ck.error this_module __LINE__)
+#define ASSERT (Ck.assert this_module __LINE__)
+#define ENSURE (Ck.f this_module __LINE__)
+#define CHECK(f) (Ck.f this_module __LINE__)
+
+#define BOUNDS_ERROR  (ERROR Ck.Bounds)
+#define BOUNDS_ASSERT (ASSERT Ck.Bounds)
+#define BOUNDS_ENSURE (ENSURE Ck.Bounds)
+#define BOUNDS_CHECK(f) (CHECK(f) Ck.Bounds)
+
+#define INTERNAL_ERROR  (ERROR Ck.Internal)
+#define INTERNAL_ASSERT (ASSERT Ck.Internal)
+#define INTERNAL_ENSURE (ENSURE Ck.Internal)
+#define INTERNAL_CHECK(f) (CHECK(f) Ck.Internal)
+
+