From 96cc44f018f7d284a78550bb4284f1bfadbe21d5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Tue, 5 Apr 2022 09:49:24 +0200
Subject: [PATCH] [Eva] Lattice_bounds: shares more functions between Bottom,
 Top and TopBottom.

---
 .../abstract_interp/lattice_bounds.ml         | 57 +++++++++++--------
 1 file changed, 32 insertions(+), 25 deletions(-)

diff --git a/src/kernel_services/abstract_interp/lattice_bounds.ml b/src/kernel_services/abstract_interp/lattice_bounds.ml
index be5326b31fb..e432e4e8c16 100644
--- a/src/kernel_services/abstract_interp/lattice_bounds.ml
+++ b/src/kernel_services/abstract_interp/lattice_bounds.ml
@@ -39,6 +39,9 @@ end
 
 module Common =
 struct
+
+  (* Pretty-printing *)
+
   let pretty_top fmt =
     Format.pp_print_string fmt (Unicode.top_string ())
 
@@ -50,6 +53,8 @@ struct
     | `Top -> pretty_top fmt
     | `Value v -> pretty_value fmt v
 
+  (* Datatype *)
+
   let hash hash_value = function
     | `Bottom  -> 7
     | `Top -> 13
@@ -70,6 +75,33 @@ struct
     | `Top, `Value _ -> -1
     | `Value _, `Top -> 1
     | `Value vx, `Value vy -> compare_value vx vy
+
+  (* Tests *)
+
+  let is_bottom = function
+    | `Bottom -> true
+    | `Value _ | `Top -> false
+
+  let is_top = function
+    | `Top -> true
+    | `Value _ | `Bottom -> false
+
+  let is_included is_included x y =
+    match x, y with
+    | `Bottom, _ | _, `Top -> true
+    | _, `Bottom | `Top, _ -> false
+    | `Value vx, `Value vy -> is_included vx vy
+
+  (* Iterator *)
+  let iter f = function
+    | `Bottom | `Top -> ()
+    | `Value v -> f v
+
+  (* Conversion *)
+  let to_option = function
+    | `Bottom | `Top -> None
+    | `Value x -> Some x
+
 end
 
 module Bottom = struct
@@ -79,10 +111,6 @@ module Bottom = struct
 
   (** Access *)
 
-  let is_bottom = function
-    | `Bottom -> true
-    | `Value _ -> false
-
   let non_bottom = function
     | `Value v -> v
     | `Bottom  -> assert false
@@ -93,11 +121,6 @@ module Bottom = struct
 
   (* Lattice operators *)
 
-  let is_included is_included x y = match x, y with
-    | `Bottom, _           -> true
-    | _, `Bottom           -> false
-    | `Value vx, `Value vy -> is_included vx vy
-
   let join join x y = match x, y with
     | `Value vx, `Value vy    -> `Value (join vx vy)
     | `Bottom, (`Value _ as v)
@@ -114,10 +137,6 @@ module Bottom = struct
 
   (* Iterators *)
 
-  let iter f = function
-    | `Bottom -> ()
-    | `Value v -> f v
-
   let fold ~bottom f = function
     | `Bottom -> bottom
     | `Value v -> f v
@@ -135,10 +154,6 @@ module Bottom = struct
 
   (** Conversion *)
 
-  let to_option = function
-    | `Bottom -> None
-    | `Value v -> Some v
-
   let of_option = function
     | None -> `Bottom
     | Some v -> `Value v
@@ -227,10 +242,6 @@ struct
 
   (** Access *)
 
-  let is_top = function
-    | `Value _ -> false
-    | `Top -> true
-
   let non_top = function
     | `Value v -> v
     | `Top  -> assert false
@@ -252,10 +263,6 @@ struct
     | None -> `Top
     | Some x -> `Value x
 
-  let to_option = function
-    | `Top -> None
-    | `Value x -> Some x
-
   (** Operators *)
 
   module Operators = struct
-- 
GitLab