@@ -8,8 +8,10 @@ include Array
88
99type 'a t = 'a array
1010
11- type % template 'a t = 'a array
12- [@@ kind k = (float64, bits32, bits64, word, immediate, immediate64)]
11+ [%% template
12+ [@@@ kind_set.define values = (value_with_imm, value mod external_, value mod external64)]
13+
14+ type % template 'a t = 'a array [@@ kind k = (base_non_value, immediate, immediate64)]
1315
1416[%% rederive.portable
1517 type nonrec 'a t = 'a array [@@ deriving globalize , sexp ~stackify , sexp_grammar ]]
@@ -43,8 +45,7 @@ type%template 'a t = 'a array
4345 - http://www.sorting-algorithms.com/quick-sort-3-way *)
4446
4547module % template.portable
46- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)]
47- [@ modality p] Sorter (S : sig
48+ [@ kind k = values] [@ modality p] Sorter (S : sig
4849 type 'a t
4950
5051 val get : 'a t -> int -> 'a
@@ -294,9 +295,7 @@ struct
294295end
295296[@@ inline]
296297
297- module % template
298- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)] Sort =
299- Sorter [@ kind k] [@ modality portable] (struct
298+ module % template [@ kind k = values] Sort = Sorter [@ kind k] [@ modality portable] (struct
300299 type nonrec 'a t = 'a t
301300
302301 let get = unsafe_get
@@ -312,9 +311,7 @@ let%template get_opt arr n : (_ Option.t[@kind k]) =
312311 Some ((unsafe_get [@ mode c]) arr n)
313312 (* SAFETY: bounds checked above *) [@ exclave_if_stack a]
314313 else None
315- [@@ mode c = (uncontended, shared)]
316- [@@ kind k = (value, immediate, immediate64, float64, bits32, bits64, word)]
317- [@@ alloc a = (heap, stack)]
314+ [@@ mode c = (uncontended, shared)] [@@ kind k = base_with_imm] [@@ alloc a = (heap, stack)]
318315;;
319316
320317let is_sorted t ~compare =
@@ -367,23 +364,14 @@ let raise_length_mismatch name n1 n2 =
367364;;
368365
369366[%% template
370- let length t = length t
371- [@@ kind k = (float64, bits32, bits64, word, immediate, immediate64)]
372- ;;
367+ let length t = length t [@@ kind k = (base_non_value, immediate, immediate64)]
373368
374- [@@@ kind.default k1 = (value, immediate, immediate64, float64, bits32, bits64, word) ]
369+ [@@@ kind.default k1 = base_with_imm ]
375370
376371let to_array t = t
377372let of_array t = t
378373let is_empty t = (length [@ kind k1]) t = 0
379374
380- let sum (type a ) (module M : Container.Summable with type t = a[@kind k1] ) t ~f =
381- let toplevel_get = Toplevel_value. get [@ kind k1] in
382- (fold [@ kind k1 k1]) t ~init: ((toplevel_get [@ inlined]) M. zero) ~f: (fun n a ->
383- M. ( + ) n (f a))
384- [@ nontail]
385- ;;
386-
387375let for_all t ~f =
388376 let i = ref (length t - 1 ) in
389377 let result = ref true in
@@ -558,7 +546,16 @@ let of_list_rev (l : (_ List.Constructors.t[@kind k1])) =
558546 t
559547;;
560548
561- [@@@ kind.default k2 = (value, immediate, immediate64, float64, bits32, bits64, word)]
549+ [%% template
550+ [@@@ kind.default k1 = k1]
551+ [@@@ kind.default k2 = base]
552+
553+ let sum (type sum ) (module M : Container.Summable with type t = sum[@kind k2] ) t ~f =
554+ let toplevel_get = Toplevel_value. get [@ kind k2] in
555+ (fold [@ kind k1 k2]) t ~init: ((toplevel_get [@ inlined]) M. zero) ~f: (fun n a ->
556+ M. ( + ) n (f a))
557+ [@ nontail]
558+ ;;
562559
563560let iteri_until t ~f ~finish =
564561 let length = length t in
@@ -664,7 +661,9 @@ let foldi t ~init ~f =
664661 else acc
665662 in
666663 (loop [@ inlined]) 0 init [@ nontail]
667- ;;
664+ ;;]
665+
666+ [@@@ kind.default k2 = base_with_imm]
668667
669668let filter_mapi t ~f =
670669 let r = ref [||] in
@@ -742,7 +741,7 @@ let for_all2_exn t1 t2 ~f =
742741;;]]
743742
744743[%% template
745- [@@@ kind.default k1 = (value, immediate, immediate64, float64, bits32, bits64, word) ]
744+ [@@@ kind.default k1 = base_with_imm ]
746745
747746let filter t ~f =
748747 (filter_map [@ kind k1 k1]) t ~f: (fun x -> if f x then Some x else None ) [@ nontail]
@@ -761,21 +760,8 @@ let globalize = (globalize_array [@kind k1])
761760let equal = (equal_array [@ kind k1] [@ mode m])
762761let compare = (compare_array [@ kind k1] [@ mode m])]
763762
764- [@@@ kind.default k2 = (value, immediate, immediate64, float64, bits32, bits64, word)]
765-
766- let of_list_rev_map xs ~f =
767- let t = (of_list_map [@ kind k1 k2]) xs ~f in
768- (rev_inplace [@ kind k2]) t;
769- t
770- ;;
771-
772- let of_list_rev_mapi xs ~f =
773- let t = (of_list_mapi [@ kind k1 k2]) xs ~f in
774- (rev_inplace [@ kind k2]) t;
775- t
776- ;;
777-
778- [@@@ kind.default k3 = (value, immediate, immediate64, float64, bits32, bits64, word)]
763+ [%% template
764+ [@@@ kind.default k1 = k1, k2 = base, k3 = base]
779765
780766let foldi_until t ~init ~f ~finish =
781767 let length = length t in
@@ -799,8 +785,24 @@ let fold_until t ~init ~f ~finish =
799785 ~init
800786 ~f: (fun _i acc x -> f acc x)
801787 ~finish: (fun _i acc -> finish acc) [@ nontail]
788+ ;;]
789+
790+ [@@@ kind.default k2 = base_with_imm]
791+
792+ let of_list_rev_map xs ~f =
793+ let t = (of_list_map [@ kind k1 k2]) xs ~f in
794+ (rev_inplace [@ kind k2]) t;
795+ t
802796;;
803797
798+ let of_list_rev_mapi xs ~f =
799+ let t = (of_list_mapi [@ kind k1 k2]) xs ~f in
800+ (rev_inplace [@ kind k2]) t;
801+ t
802+ ;;
803+
804+ [@@@ kind.default k3 = base_with_imm]
805+
804806let partition_mapi t ~f =
805807 let (both : (_ Either0.t[@kind k2 k3]) t ) = (mapi [@ kind k1 value]) t ~f in
806808 let firsts =
@@ -821,7 +823,7 @@ let partition_map t ~f =
821823;;]
822824
823825[%% template
824- [@@@ kind.default k = (value, immediate, immediate64, float64, bits32, bits64, word) ]
826+ [@@@ kind.default k = base_with_imm ]
825827
826828let partitioni_tf t ~f =
827829 (partition_mapi [@ kind k k k]) t ~f: (fun i x -> if f i x then First x else Second x)
@@ -849,7 +851,7 @@ let sexp_of_t (sexp_of_elt : _ -> Sexp0.t) t : Sexp0.t =
849851 in
850852 List ((loop [@ inlined]) (length t - 1 ) [] ))
851853 [@ exclave_if_stack a]
852- [@@ kind k = (float64, bits32, bits64, word) ]
854+ [@@ kind k = base_non_value ]
853855;;]
854856
855857[%% template
@@ -860,7 +862,7 @@ let t_of_sexp elt_of_sexp (sexp : Sexp0.t) =
860862 | List [] -> [||]
861863 | List (_ :: _ as l ) -> (of_list_map [@ kind value k]) l ~f: elt_of_sexp
862864 | Atom _ -> of_sexp_error " array_of_sexp: list needed" sexp
863- [@@ kind k = (float64, bits32, bits64, word) ]
865+ [@@ kind k = base_non_value ]
864866;;]
865867
866868(* We generated [findi]s that return [value & value]s, but for backwards compatibility we
@@ -1103,12 +1105,7 @@ let transpose_exn tt =
11031105 | Some tt' -> tt'
11041106;;
11051107
1106- let % template[@ kind
1107- k1 = (value, float64, bits32, bits64, word, immediate, immediate64)
1108- , k2 = (value, float64, bits32, bits64, word, immediate, immediate64)] map
1109- t
1110- ~f
1111- =
1108+ let % template[@ kind k1 = base_with_imm, k2 = base_with_imm] map t ~f =
11121109 (map [@ kind k1 k2]) t ~f
11131110;;
11141111
@@ -1164,15 +1161,10 @@ let sub t ~pos ~len = sub t ~pos ~len
11641161let invariant invariant_a t = iter t ~f: invariant_a
11651162
11661163module Private = struct
1167- module % template
1168- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)] Sort =
1169- Sort
1170- [@ kind k]
1164+ module % template [@ kind k = values] Sort = Sort [@ kind k]
11711165
1172- module % template.portable
1173- [@ kind k = (value, immediate, immediate64, value mod external_, value mod external64)]
1174- [@ modality p] Sorter =
1166+ module % template.portable [@ kind k = values] [@ modality p] Sorter =
11751167 Sorter
11761168 [@ kind k]
11771169 [@ modality p]
1178- end
1170+ end ]
0 commit comments