@@ -10,8 +10,10 @@ include Array
1010
1111type ('a : any mod separable) t = 'a array
1212
13- type % template ('a : k ) t = 'a array
14- [@@ kind k = (float64, bits32, bits64, word, immediate, immediate64)]
13+ [%% template
14+ [@@@ kind_set.define values = (value_with_imm, value mod external_, value mod external64)]
15+
16+ type % template ('a : k ) t = 'a array [@@ kind k = (base_non_value, immediate, immediate64)]
1517
1618[%% rederive.portable
1719 type nonrec 'a t = 'a array [@@ deriving globalize , sexp ~stackify , sexp_grammar ]]
@@ -45,8 +47,7 @@ type%template ('a : k) t = 'a array
4547 - http://www.sorting-algorithms.com/quick-sort-3-way *)
4648
4749module % template.portable
48- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)]
49- [@ modality p] Sorter (S : sig
50+ [@ kind k = values] [@ modality p] Sorter (S : sig
5051 type ('a : k) t
5152
5253 val get : local_ 'a t -> int -> 'a
@@ -296,9 +297,7 @@ struct
296297end
297298[@@ inline]
298299
299- module % template
300- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)] Sort =
301- Sorter [@ kind k] [@ modality portable] (struct
300+ module % template [@ kind k = values] Sort = Sorter [@ kind k] [@ modality portable] (struct
302301 type nonrec ('a : k) t = 'a t
303302
304303 let get = unsafe_get
@@ -314,9 +313,7 @@ let%template get_opt arr n : (_ Option.t[@kind k]) =
314313 Some ((unsafe_get [@ mode c]) arr n)
315314 (* SAFETY: bounds checked above *) [@ exclave_if_stack a]
316315 else None
317- [@@ mode c = (uncontended, shared)]
318- [@@ kind k = (value, immediate, immediate64, float64, bits32, bits64, word)]
319- [@@ alloc a = (heap, stack)]
316+ [@@ mode c = (uncontended, shared)] [@@ kind k = base_with_imm] [@@ alloc a = (heap, stack)]
320317;;
321318
322319let is_sorted t ~compare =
@@ -369,23 +366,14 @@ let raise_length_mismatch name n1 n2 =
369366;;
370367
371368[%% template
372- let length t = length t
373- [@@ kind k = (float64, bits32, bits64, word, immediate, immediate64)]
374- ;;
369+ let length t = length t [@@ kind k = (base_non_value, immediate, immediate64)]
375370
376- [@@@ kind.default k1 = (value, immediate, immediate64, float64, bits32, bits64, word) ]
371+ [@@@ kind.default k1 = base_with_imm ]
377372
378373let to_array t = t
379374let of_array t = t
380375let is_empty t = (length [@ kind k1]) t = 0
381376
382- let sum (type a : k1 ) (module M : Container.Summable with type t = a[@kind k1] ) t ~f =
383- let toplevel_get = Toplevel_value. get [@ kind k1] in
384- (fold [@ kind k1 k1]) t ~init: ((toplevel_get [@ inlined]) M. zero) ~f: (fun n a ->
385- M. ( + ) n (f a))
386- [@ nontail]
387- ;;
388-
389377let for_all t ~f =
390378 let i = ref (length t - 1 ) in
391379 let result = ref true in
@@ -560,7 +548,16 @@ let of_list_rev (l : (_ List.Constructors.t[@kind k1])) =
560548 t
561549;;
562550
563- [@@@ kind.default k2 = (value, immediate, immediate64, float64, bits32, bits64, word)]
551+ [%% template
552+ [@@@ kind.default k1 = k1]
553+ [@@@ kind.default k2 = base]
554+
555+ let sum (type sum : k2 ) (module M : Container.Summable with type t = sum[@kind k2] ) t ~f =
556+ let toplevel_get = Toplevel_value. get [@ kind k2] in
557+ (fold [@ kind k1 k2]) t ~init: ((toplevel_get [@ inlined]) M. zero) ~f: (fun n a ->
558+ M. ( + ) n (f a))
559+ [@ nontail]
560+ ;;
564561
565562let iteri_until t ~f ~finish =
566563 let length = length t in
@@ -666,7 +663,9 @@ let foldi t ~init ~f =
666663 else acc
667664 in
668665 (loop [@ inlined]) 0 init [@ nontail]
669- ;;
666+ ;;]
667+
668+ [@@@ kind.default k2 = base_with_imm]
670669
671670let filter_mapi t ~f =
672671 let r = ref [||] in
@@ -744,7 +743,7 @@ let for_all2_exn t1 t2 ~f =
744743;;]]
745744
746745[%% template
747- [@@@ kind.default k1 = (value, immediate, immediate64, float64, bits32, bits64, word) ]
746+ [@@@ kind.default k1 = base_with_imm ]
748747
749748let filter t ~f =
750749 (filter_map [@ kind k1 k1]) t ~f: (fun x -> if f x then Some x else None ) [@ nontail]
@@ -763,21 +762,8 @@ let globalize = (globalize_array [@kind k1])
763762let equal = (equal_array [@ kind k1] [@ mode m])
764763let compare = (compare_array [@ kind k1] [@ mode m])]
765764
766- [@@@ kind.default k2 = (value, immediate, immediate64, float64, bits32, bits64, word)]
767-
768- let of_list_rev_map xs ~f =
769- let t = (of_list_map [@ kind k1 k2]) xs ~f in
770- (rev_inplace [@ kind k2]) t;
771- t
772- ;;
773-
774- let of_list_rev_mapi xs ~f =
775- let t = (of_list_mapi [@ kind k1 k2]) xs ~f in
776- (rev_inplace [@ kind k2]) t;
777- t
778- ;;
779-
780- [@@@ kind.default k3 = (value, immediate, immediate64, float64, bits32, bits64, word)]
765+ [%% template
766+ [@@@ kind.default k1 = k1, k2 = base, k3 = base]
781767
782768let foldi_until t ~init ~f ~finish =
783769 let length = length t in
@@ -801,8 +787,24 @@ let fold_until t ~init ~f ~finish =
801787 ~init
802788 ~f: (fun _i acc x -> f acc x)
803789 ~finish: (fun _i acc -> finish acc) [@ nontail]
790+ ;;]
791+
792+ [@@@ kind.default k2 = base_with_imm]
793+
794+ let of_list_rev_map xs ~f =
795+ let t = (of_list_map [@ kind k1 k2]) xs ~f in
796+ (rev_inplace [@ kind k2]) t;
797+ t
804798;;
805799
800+ let of_list_rev_mapi xs ~f =
801+ let t = (of_list_mapi [@ kind k1 k2]) xs ~f in
802+ (rev_inplace [@ kind k2]) t;
803+ t
804+ ;;
805+
806+ [@@@ kind.default k3 = base_with_imm]
807+
806808let partition_mapi t ~f =
807809 let (both : (_ Either0.t[@kind k2 k3]) t ) = (mapi [@ kind k1 value]) t ~f in
808810 let firsts =
@@ -823,7 +825,7 @@ let partition_map t ~f =
823825;;]
824826
825827[%% template
826- [@@@ kind.default k = (value, immediate, immediate64, float64, bits32, bits64, word) ]
828+ [@@@ kind.default k = base_with_imm ]
827829
828830let partitioni_tf t ~f =
829831 (partition_mapi [@ kind k k k]) t ~f: (fun i x -> if f i x then First x else Second x)
@@ -851,7 +853,7 @@ let sexp_of_t (sexp_of_elt : _ @ m -> Sexp0.t @ m) (t @ m) : Sexp0.t =
851853 in
852854 List ((loop [@ inlined]) (length t - 1 ) [] ))
853855 [@ exclave_if_stack a]
854- [@@ kind k = (float64, bits32, bits64, word) ]
856+ [@@ kind k = base_non_value ]
855857;;]
856858
857859[%% template
@@ -862,7 +864,7 @@ let t_of_sexp elt_of_sexp (sexp : Sexp0.t) =
862864 | List [] -> [||]
863865 | List (_ :: _ as l ) -> (of_list_map [@ kind value k]) l ~f: elt_of_sexp
864866 | Atom _ -> of_sexp_error " array_of_sexp: list needed" sexp
865- [@@ kind k = (float64, bits32, bits64, word) ]
867+ [@@ kind k = base_non_value ]
866868;;]
867869
868870(* We generated [findi]s that return [value & value]s, but for backwards compatibility we
@@ -1107,12 +1109,7 @@ let transpose_exn tt =
11071109
11081110[@@@ warning " -incompatible-with-upstream" ]
11091111
1110- let % template[@ kind
1111- k1 = (value, float64, bits32, bits64, word, immediate, immediate64)
1112- , k2 = (value, float64, bits32, bits64, word, immediate, immediate64)] map
1113- t
1114- ~f
1115- =
1112+ let % template[@ kind k1 = base_with_imm, k2 = base_with_imm] map t ~f =
11161113 (map [@ kind k1 k2]) t ~f
11171114;;
11181115
@@ -1168,17 +1165,12 @@ let sub t ~pos ~len = sub t ~pos ~len
11681165let invariant invariant_a t = iter t ~f: invariant_a
11691166
11701167module Private = struct
1171- module % template
1172- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)] Sort =
1173- Sort
1174- [@ kind k]
1168+ module % template [@ kind k = values] Sort = Sort [@ kind k]
11751169
1176- module % template.portable
1177- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)]
1178- [@ modality p] Sorter =
1170+ module % template.portable [@ kind k = values] [@ modality p] Sorter =
11791171 Sorter
11801172 [@ kind k]
11811173 [@ modality p]
1182- end
1174+ end ]
11831175
11841176let array_should_be_polymorphic_over_value_or_null = ()
0 commit comments