@@ -658,17 +658,13 @@ end
658
658
659
659
module Pattern : sig
660
660
type t
661
- type field
662
661
663
662
val create : string -> t
664
663
val empty : t
665
664
val equal : t -> t -> bool
666
665
val concat : t -> t -> t
667
666
val length : t -> int
668
667
val weight : t -> int
669
- val nth : field -> t -> int -> int
670
- val bits : field
671
- val mask : field
672
668
val matches : t -> pos :int -> int -> bool
673
669
val pp : Format .formatter -> t -> unit
674
670
end = struct
@@ -744,22 +740,30 @@ end = struct
744
740
745
741
type t = {
746
742
repr : string ;
747
- bits : Z .t ;
748
- mask : Z .t ;
743
+ bits : int array ;
744
+ mask : int array ;
749
745
pops : int ;
750
746
size : int ;
751
747
} [@@ deriving equal ]
752
748
753
749
type field = t -> Z .t
754
750
751
+ let nth_byte size x n =
752
+ let off = (size / 8 - n - 1 ) * 8 in
753
+ Z. to_int @@
754
+ Z. (x asr off land of_int 0xff )
755
+
755
756
let create repr =
756
757
let {Parser. size; bits; mask} = Parser. run repr in
757
- {bits; mask; size; pops = Z. popcount mask; repr}
758
+ let pops = Z. popcount mask in
759
+ let bits = Array. init (size/ 8 ) ~f: (nth_byte size bits) in
760
+ let mask = Array. init (size/ 8 ) ~f: (nth_byte size mask) in
761
+ {bits; mask; size; pops; repr}
758
762
759
763
let empty = {
760
764
repr = " " ;
761
- bits = Z. zero ;
762
- mask = Z. zero ;
765
+ bits = [||] ;
766
+ mask = [||] ;
763
767
pops = 0 ;
764
768
size = 0 ;
765
769
}
@@ -772,21 +776,15 @@ end = struct
772
776
773
777
let concat x y = {
774
778
repr = x.repr ^ y.repr;
775
- bits = Z. ( x.bits lsl y.size lor y. bits) ;
776
- mask = Z. ( x.mask lsl y.size lor y. mask) ;
779
+ bits = Array. append x.bits y. bits;
780
+ mask = Array. append x.mask y. mask;
777
781
pops = x.pops + y.pops;
778
782
size = x.size + y.size;
779
783
}
780
784
781
- let nth what x n =
782
- let off = (x.size / 8 - n - 1 ) * 8 in
783
- Z. to_int @@
784
- Z. (what x asr off land of_int 0xff )
785
785
786
- let matches x ~pos :n data =
787
- let mask = nth mask x n
788
- and bits = nth bits x n in
789
- data land mask = bits
786
+ let matches {mask; bits} ~pos :n data =
787
+ data land mask.(n) = bits.(n)
790
788
791
789
let pp ppf {repr} =
792
790
Format. fprintf ppf " %s" repr
0 commit comments