aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorppedrot2013-10-29 17:10:51 +0000
committerppedrot2013-10-29 17:10:51 +0000
commitcbbd579354d81f6749d14853a1c6a5cc67728907 (patch)
tree765e7d1798e4c0b5a334aaad682c34410a603d08
parent77e518644b1295708734e8721e7d8422612983dd (diff)
Sharing identity evar filters.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@16948 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--pretyping/evd.ml27
1 files changed, 21 insertions, 6 deletions
diff --git a/pretyping/evd.ml b/pretyping/evd.ml
index f2380e17f0..67cf3a32f2 100644
--- a/pretyping/evd.ml
+++ b/pretyping/evd.ml
@@ -40,6 +40,27 @@ end =
struct
type t = bool list
+ (** Most of filters we use are identities, so we share their use. *)
+ let identity_pool = Array.make 128 []
+
+ let () =
+ (** Fill the filter pool *)
+ for i = 1 to 127 do
+ let pred = Array.unsafe_get identity_pool (pred i) in
+ let curr = true :: pred in
+ Array.unsafe_set identity_pool i curr
+ done
+
+ let rec identity_gen n accu =
+ if n = 0 then accu
+ else identity_gen (pred n) (true :: accu)
+
+ let identity n =
+ if n < 128 then Array.unsafe_get identity_pool n
+ else
+ let accu = Array.unsafe_get identity_pool 127 in
+ identity_gen (n - 127) accu
+
let length = List.length
let rec equal l1 l2 = match l1, l2 with
@@ -48,12 +69,6 @@ struct
(if h1 then h2 else not h2) && equal l1 l2
| _ -> false
- let rec identity n accu =
- if n = 0 then accu
- else identity (pred n) (true :: accu)
-
- let identity n = identity n []
-
let rec is_identity = function
| [] -> true
| true :: l -> is_identity l