Library MetaRocq.Utils.ByteCompare

From Stdlib Require Import Strings.Byte NArith.BinNat.

(* To make byte comparison more efficient and avoid reallocating the same number
  many times, we precompute the representation in N. *)


Module ByteN.
Definition N0 := 0%N.
Definition N1 := 1%N.
Definition N2 := 2%N.
Definition N3 := 3%N.
Definition N4 := 4%N.
Definition N5 := 5%N.
Definition N6 := 6%N.
Definition N7 := 7%N.
Definition N8 := 8%N.
Definition N9 := 9%N.
Definition N10 := 10%N.
Definition N11 := 11%N.
Definition N12 := 12%N.
Definition N13 := 13%N.
Definition N14 := 14%N.
Definition N15 := 15%N.
Definition N16 := 16%N.
Definition N17 := 17%N.
Definition N18 := 18%N.
Definition N19 := 19%N.
Definition N20 := 20%N.
Definition N21 := 21%N.
Definition N22 := 22%N.
Definition N23 := 23%N.
Definition N24 := 24%N.
Definition N25 := 25%N.
Definition N26 := 26%N.
Definition N27 := 27%N.
Definition N28 := 28%N.
Definition N29 := 29%N.
Definition N30 := 30%N.
Definition N31 := 31%N.
Definition N32 := 32%N.
Definition N33 := 33%N.
Definition N34 := 34%N.
Definition N35 := 35%N.
Definition N36 := 36%N.
Definition N37 := 37%N.
Definition N38 := 38%N.
Definition N39 := 39%N.
Definition N40 := 40%N.
Definition N41 := 41%N.
Definition N42 := 42%N.
Definition N43 := 43%N.
Definition N44 := 44%N.
Definition N45 := 45%N.
Definition N46 := 46%N.
Definition N47 := 47%N.
Definition N48 := 48%N.
Definition N49 := 49%N.
Definition N50 := 50%N.
Definition N51 := 51%N.
Definition N52 := 52%N.
Definition N53 := 53%N.
Definition N54 := 54%N.
Definition N55 := 55%N.
Definition N56 := 56%N.
Definition N57 := 57%N.
Definition N58 := 58%N.
Definition N59 := 59%N.
Definition N60 := 60%N.
Definition N61 := 61%N.
Definition N62 := 62%N.
Definition N63 := 63%N.
Definition N64 := 64%N.
Definition N65 := 65%N.
Definition N66 := 66%N.
Definition N67 := 67%N.
Definition N68 := 68%N.
Definition N69 := 69%N.
Definition N70 := 70%N.
Definition N71 := 71%N.
Definition N72 := 72%N.
Definition N73 := 73%N.
Definition N74 := 74%N.
Definition N75 := 75%N.
Definition N76 := 76%N.
Definition N77 := 77%N.
Definition N78 := 78%N.
Definition N79 := 79%N.
Definition N80 := 80%N.
Definition N81 := 81%N.
Definition N82 := 82%N.
Definition N83 := 83%N.
Definition N84 := 84%N.
Definition N85 := 85%N.
Definition N86 := 86%N.
Definition N87 := 87%N.
Definition N88 := 88%N.
Definition N89 := 89%N.
Definition N90 := 90%N.
Definition N91 := 91%N.
Definition N92 := 92%N.
Definition N93 := 93%N.
Definition N94 := 94%N.
Definition N95 := 95%N.
Definition N96 := 96%N.
Definition N97 := 97%N.
Definition N98 := 98%N.
Definition N99 := 99%N.
Definition N100 := 100%N.
Definition N101 := 101%N.
Definition N102 := 102%N.
Definition N103 := 103%N.
Definition N104 := 104%N.
Definition N105 := 105%N.
Definition N106 := 106%N.
Definition N107 := 107%N.
Definition N108 := 108%N.
Definition N109 := 109%N.
Definition N110 := 110%N.
Definition N111 := 111%N.
Definition N112 := 112%N.
Definition N113 := 113%N.
Definition N114 := 114%N.
Definition N115 := 115%N.
Definition N116 := 116%N.
Definition N117 := 117%N.
Definition N118 := 118%N.
Definition N119 := 119%N.
Definition N120 := 120%N.
Definition N121 := 121%N.
Definition N122 := 122%N.
Definition N123 := 123%N.
Definition N124 := 124%N.
Definition N125 := 125%N.
Definition N126 := 126%N.
Definition N127 := 127%N.
Definition N128 := 128%N.
Definition N129 := 129%N.
Definition N130 := 130%N.
Definition N131 := 131%N.
Definition N132 := 132%N.
Definition N133 := 133%N.
Definition N134 := 134%N.
Definition N135 := 135%N.
Definition N136 := 136%N.
Definition N137 := 137%N.
Definition N138 := 138%N.
Definition N139 := 139%N.
Definition N140 := 140%N.
Definition N141 := 141%N.
Definition N142 := 142%N.
Definition N143 := 143%N.
Definition N144 := 144%N.
Definition N145 := 145%N.
Definition N146 := 146%N.
Definition N147 := 147%N.
Definition N148 := 148%N.
Definition N149 := 149%N.
Definition N150 := 150%N.
Definition N151 := 151%N.
Definition N152 := 152%N.
Definition N153 := 153%N.
Definition N154 := 154%N.
Definition N155 := 155%N.
Definition N156 := 156%N.
Definition N157 := 157%N.
Definition N158 := 158%N.
Definition N159 := 159%N.
Definition N160 := 160%N.
Definition N161 := 161%N.
Definition N162 := 162%N.
Definition N163 := 163%N.
Definition N164 := 164%N.
Definition N165 := 165%N.
Definition N166 := 166%N.
Definition N167 := 167%N.
Definition N168 := 168%N.
Definition N169 := 169%N.
Definition N170 := 170%N.
Definition N171 := 171%N.
Definition N172 := 172%N.
Definition N173 := 173%N.
Definition N174 := 174%N.
Definition N175 := 175%N.
Definition N176 := 176%N.
Definition N177 := 177%N.
Definition N178 := 178%N.
Definition N179 := 179%N.
Definition N180 := 180%N.
Definition N181 := 181%N.
Definition N182 := 182%N.
Definition N183 := 183%N.
Definition N184 := 184%N.
Definition N185 := 185%N.
Definition N186 := 186%N.
Definition N187 := 187%N.
Definition N188 := 188%N.
Definition N189 := 189%N.
Definition N190 := 190%N.
Definition N191 := 191%N.
Definition N192 := 192%N.
Definition N193 := 193%N.
Definition N194 := 194%N.
Definition N195 := 195%N.
Definition N196 := 196%N.
Definition N197 := 197%N.
Definition N198 := 198%N.
Definition N199 := 199%N.
Definition N200 := 200%N.
Definition N201 := 201%N.
Definition N202 := 202%N.
Definition N203 := 203%N.
Definition N204 := 204%N.
Definition N205 := 205%N.
Definition N206 := 206%N.
Definition N207 := 207%N.
Definition N208 := 208%N.
Definition N209 := 209%N.
Definition N210 := 210%N.
Definition N211 := 211%N.
Definition N212 := 212%N.
Definition N213 := 213%N.
Definition N214 := 214%N.
Definition N215 := 215%N.
Definition N216 := 216%N.
Definition N217 := 217%N.
Definition N218 := 218%N.
Definition N219 := 219%N.
Definition N220 := 220%N.
Definition N221 := 221%N.
Definition N222 := 222%N.
Definition N223 := 223%N.
Definition N224 := 224%N.
Definition N225 := 225%N.
Definition N226 := 226%N.
Definition N227 := 227%N.
Definition N228 := 228%N.
Definition N229 := 229%N.
Definition N230 := 230%N.
Definition N231 := 231%N.
Definition N232 := 232%N.
Definition N233 := 233%N.
Definition N234 := 234%N.
Definition N235 := 235%N.
Definition N236 := 236%N.
Definition N237 := 237%N.
Definition N238 := 238%N.
Definition N239 := 239%N.
Definition N240 := 240%N.
Definition N241 := 241%N.
Definition N242 := 242%N.
Definition N243 := 243%N.
Definition N244 := 244%N.
Definition N245 := 245%N.
Definition N246 := 246%N.
Definition N247 := 247%N.
Definition N248 := 248%N.
Definition N249 := 249%N.
Definition N250 := 250%N.
Definition N251 := 251%N.
Definition N252 := 252%N.
Definition N253 := 253%N.
Definition N254 := 254%N.
Definition N255 := 255%N.

Definition to_N (x : byte) :=
  match x with
  | "000"%byteN0
  | "001"%byteN1
  | "002"%byteN2
  | "003"%byteN3
  | "004"%byteN4
  | "005"%byteN5
  | "006"%byteN6
  | "007"%byteN7
  | "008"%byteN8
  | "009"%byteN9
  | "010"%byteN10
  | "011"%byteN11
  | "012"%byteN12
  | "013"%byteN13
  | "014"%byteN14
  | "015"%byteN15
  | "016"%byteN16
  | "017"%byteN17
  | "018"%byteN18
  | "019"%byteN19
  | "020"%byteN20
  | "021"%byteN21
  | "022"%byteN22
  | "023"%byteN23
  | "024"%byteN24
  | "025"%byteN25
  | "026"%byteN26
  | "027"%byteN27
  | "028"%byteN28
  | "029"%byteN29
  | "030"%byteN30
  | "031"%byteN31
  | "032"%byteN32
  | "033"%byteN33
  | "034"%byteN34
  | "035"%byteN35
  | "036"%byteN36
  | "037"%byteN37
  | "038"%byteN38
  | "039"%byteN39
  | "040"%byteN40
  | "041"%byteN41
  | "042"%byteN42
  | "043"%byteN43
  | "044"%byteN44
  | "045"%byteN45
  | "046"%byteN46
  | "047"%byteN47
  | "048"%byteN48
  | "049"%byteN49
  | "050"%byteN50
  | "051"%byteN51
  | "052"%byteN52
  | "053"%byteN53
  | "054"%byteN54
  | "055"%byteN55
  | "056"%byteN56
  | "057"%byteN57
  | "058"%byteN58
  | "059"%byteN59
  | "060"%byteN60
  | "061"%byteN61
  | "062"%byteN62
  | "063"%byteN63
  | "064"%byteN64
  | "065"%byteN65
  | "066"%byteN66
  | "067"%byteN67
  | "068"%byteN68
  | "069"%byteN69
  | "070"%byteN70
  | "071"%byteN71
  | "072"%byteN72
  | "073"%byteN73
  | "074"%byteN74
  | "075"%byteN75
  | "076"%byteN76
  | "077"%byteN77
  | "078"%byteN78
  | "079"%byteN79
  | "080"%byteN80
  | "081"%byteN81
  | "082"%byteN82
  | "083"%byteN83
  | "084"%byteN84
  | "085"%byteN85
  | "086"%byteN86
  | "087"%byteN87
  | "088"%byteN88
  | "089"%byteN89
  | "090"%byteN90
  | "091"%byteN91
  | "092"%byteN92
  | "093"%byteN93
  | "094"%byteN94
  | "095"%byteN95
  | "096"%byteN96
  | "097"%byteN97
  | "098"%byteN98
  | "099"%byteN99
  | "100"%byteN100
  | "101"%byteN101
  | "102"%byteN102
  | "103"%byteN103
  | "104"%byteN104
  | "105"%byteN105
  | "106"%byteN106
  | "107"%byteN107
  | "108"%byteN108
  | "109"%byteN109
  | "110"%byteN110
  | "111"%byteN111
  | "112"%byteN112
  | "113"%byteN113
  | "114"%byteN114
  | "115"%byteN115
  | "116"%byteN116
  | "117"%byteN117
  | "118"%byteN118
  | "119"%byteN119
  | "120"%byteN120
  | "121"%byteN121
  | "122"%byteN122
  | "123"%byteN123
  | "124"%byteN124
  | "125"%byteN125
  | "126"%byteN126
  | "127"%byteN127
  | "128"%byteN128
  | "129"%byteN129
  | "130"%byteN130
  | "131"%byteN131
  | "132"%byteN132
  | "133"%byteN133
  | "134"%byteN134
  | "135"%byteN135
  | "136"%byteN136
  | "137"%byteN137
  | "138"%byteN138
  | "139"%byteN139
  | "140"%byteN140
  | "141"%byteN141
  | "142"%byteN142
  | "143"%byteN143
  | "144"%byteN144
  | "145"%byteN145
  | "146"%byteN146
  | "147"%byteN147
  | "148"%byteN148
  | "149"%byteN149
  | "150"%byteN150
  | "151"%byteN151
  | "152"%byteN152
  | "153"%byteN153
  | "154"%byteN154
  | "155"%byteN155
  | "156"%byteN156
  | "157"%byteN157
  | "158"%byteN158
  | "159"%byteN159
  | "160"%byteN160
  | "161"%byteN161
  | "162"%byteN162
  | "163"%byteN163
  | "164"%byteN164
  | "165"%byteN165
  | "166"%byteN166
  | "167"%byteN167
  | "168"%byteN168
  | "169"%byteN169
  | "170"%byteN170
  | "171"%byteN171
  | "172"%byteN172
  | "173"%byteN173
  | "174"%byteN174
  | "175"%byteN175
  | "176"%byteN176
  | "177"%byteN177
  | "178"%byteN178
  | "179"%byteN179
  | "180"%byteN180
  | "181"%byteN181
  | "182"%byteN182
  | "183"%byteN183
  | "184"%byteN184
  | "185"%byteN185
  | "186"%byteN186
  | "187"%byteN187
  | "188"%byteN188
  | "189"%byteN189
  | "190"%byteN190
  | "191"%byteN191
  | "192"%byteN192
  | "193"%byteN193
  | "194"%byteN194
  | "195"%byteN195
  | "196"%byteN196
  | "197"%byteN197
  | "198"%byteN198
  | "199"%byteN199
  | "200"%byteN200
  | "201"%byteN201
  | "202"%byteN202
  | "203"%byteN203
  | "204"%byteN204
  | "205"%byteN205
  | "206"%byteN206
  | "207"%byteN207
  | "208"%byteN208
  | "209"%byteN209
  | "210"%byteN210
  | "211"%byteN211
  | "212"%byteN212
  | "213"%byteN213
  | "214"%byteN214
  | "215"%byteN215
  | "216"%byteN216
  | "217"%byteN217
  | "218"%byteN218
  | "219"%byteN219
  | "220"%byteN220
  | "221"%byteN221
  | "222"%byteN222
  | "223"%byteN223
  | "224"%byteN224
  | "225"%byteN225
  | "226"%byteN226
  | "227"%byteN227
  | "228"%byteN228
  | "229"%byteN229
  | "230"%byteN230
  | "231"%byteN231
  | "232"%byteN232
  | "233"%byteN233
  | "234"%byteN234
  | "235"%byteN235
  | "236"%byteN236
  | "237"%byteN237
  | "238"%byteN238
  | "239"%byteN239
  | "240"%byteN240
  | "241"%byteN241
  | "242"%byteN242
  | "243"%byteN243
  | "244"%byteN244
  | "245"%byteN245
  | "246"%byteN246
  | "247"%byteN247
  | "248"%byteN248
  | "249"%byteN249
  | "250"%byteN250
  | "251"%byteN251
  | "252"%byteN252
  | "253"%byteN253
  | "254"%byteN254
  | "255"%byteN255
  end.
End ByteN.

Definition eqb (x y : byte) :=
  N.eqb (ByteN.to_N x) (ByteN.to_N y).

Definition compare (x y : byte) :=
  N.compare (ByteN.to_N x) (ByteN.to_N y).