+let roles_expand_all rs =
+ let map (b, r) = r.ET.x <- not r.ET.x in
+ List.iter map rs
+
+let rec roles_expand n = function
+ | [] -> ()
+ | (_,r)::tl ->
+ if n = 0 then r.ET.x <- not r.ET.x else
+ roles_expand (pred n) tl
+
+let exists_role_deleted v r =
+ let o = v, [] in
+ let compare r = compare_objs o (obj_of_role r) in
+ list_exists compare r
+
+let roles_split s rs =
+ let rec aux rs os ns = function
+ | [] -> List.rev rs, os, ns
+ | (b, r) :: tl ->
+ if compare_versions s r.ET.v <> 0 then aux ((b, r)::rs) os ns tl else
+ if b then aux rs (objs_union os r.ET.o) (names_union ns r.ET.n) tl else
+ let ro, so = list_split r.ET.o in
+ let rn, sn = list_split r.ET.n in
+ if ro = [] && rn = [] then aux rs (objs_union os so) (names_union ns sn) tl else begin
+ r.ET.o <- ro; r.ET.o <- ro;
+ aux ((b, r)::rs) (objs_union os so) (names_union ns sn) tl
+ end
+ in
+ aux [] [] [] rs
+