Separate checks for unsafe operations
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 14:12:55 +0000 (14:12 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 14:12:55 +0000 (14:12 +0000)
Data/Vector/Internal/Check.hs
include/vector.h
vector.cabal

index ad6d49d..8881a6a 100644 (file)
@@ -1,5 +1,5 @@
 module Data.Vector.Internal.Check (
-  Checks(..), doBoundsChecks, doInternalChecks, doChecks,
+  Checks(..), doChecks,
 
   error, check, assert, checkIndex, checkLength, checkSlice
 ) where
@@ -7,7 +7,21 @@ module Data.Vector.Internal.Check (
 import Prelude hiding( error )
 import qualified Prelude as P
 
-data Checks = Bounds | Internal deriving( Eq )
+data Checks = Bounds | Unsafe | Internal deriving( Eq )
+
+doBoundsChecks :: Bool
+#ifdef VECTOR_BOUNDS_CHECKS
+doBoundsChecks = True
+#else
+doBoundsChecks = False
+#endif
+
+doUnsafeChecks :: Bool
+#ifdef VECTOR_UNSAFE_CHECKS
+doUnsafeChecks = True
+#else
+doUnsafeChecks = False
+#endif
 
 doInternalChecks :: Bool
 #ifdef VECTOR_INTERNAL_CHECKS
@@ -16,16 +30,11 @@ doInternalChecks = True
 doInternalChecks = False
 #endif
 
-doBoundsChecks :: Bool
-#ifdef VECTOR_BOUNDS_CHECKS
-doBoundsChecks = True
-#else
-doBoundsChecks = False
-#endif
 
 doChecks :: Checks -> Bool
 {-# INLINE doChecks #-}
 doChecks Bounds   = doBoundsChecks
+doChecks Unsafe   = doUnsafeChecks
 doChecks Internal = doInternalChecks
 
 error :: String -> Int -> Checks -> String -> String -> a
index c59e3a2..a30ff81 100644 (file)
@@ -22,6 +22,11 @@ this_module = __FILE__
 #define BOUNDS_ENSURE (ENSURE Ck.Bounds)
 #define BOUNDS_CHECK(f) (CHECK(f) Ck.Bounds)
 
+#define UNSAFE_ERROR  (ERROR Ck.Unsafe)
+#define UNSAFE_ASSERT (ASSERT Ck.Unsafe)
+#define UNSAFE_ENSURE (ENSURE Ck.Unsafe)
+#define UNSAFE_CHECK(f) (CHECK(f) Ck.Unsafe)
+
 #define INTERNAL_ERROR  (ERROR Ck.Internal)
 #define INTERNAL_ASSERT (ASSERT Ck.Internal)
 #define INTERNAL_ENSURE (ENSURE Ck.Internal)
index aee4a39..0cb9a2f 100644 (file)
@@ -48,6 +48,11 @@ Flag BoundsChecks
   Description: Enables bounds checking
   Default: True
 
+Flag UnsafeChecks
+  Description: Enables bounds checking in unsafe operations at the cost of a
+               significant performance penalty
+  Description: False
+
 Flag InternalChecks
   Description: Enables internal consistency checks at the cost of a
                significant performance penalty
@@ -107,6 +112,9 @@ Library
   if flag(BoundsChecks)
     cpp-options: -DVECTOR_BOUNDS_CHECKS
 
+  if flag(UnsafeChecks)
+    cpp-options: -DVECTOR_UNSAFE_CHECKS
+
   if flag(InternalChecks)
     cpp-options: -DVECTOR_INTERNAL_CHECKS