+Digest__HighwayHash new(AV *key_av) {
+ dTHX;
+ uint64_t key[4];
+ Digest__HighwayHash state;
+ Newx(state, 1, HighwayHashCat);
+ process_key(aTHX_ key_av, key);
+ HighwayHashCatStart(key, state);
+ return state;
+}
+
+void append(Digest__HighwayHash state, unsigned char *bytes, size_t size) {
+ HighwayHashCatAppend(bytes, size, state);
+}
+
+uint64_t finish64(Digest__HighwayHash state) {
+ return HighwayHashCatFinish64(state);
+}
+
+AV* finish128(Digest__HighwayHash state) {
+ dTHX;
+ AV* result;
+ uint64_t hash[2];
+ HighwayHashCatFinish128(state, hash);
+ result = newAV();
+ av_push(result, sv_2mortal(newSVu64(hash[0])));
+ av_push(result, sv_2mortal(newSVu64(hash[1])));
+ return result;
+}
+
+AV* finish256(Digest__HighwayHash state) {
+ dTHX;
+ AV* result;
+ uint64_t hash[4];
+ HighwayHashCatFinish256(state, hash);
+ result = newAV();
+ av_push(result, sv_2mortal(newSVu64(hash[0])));
+ av_push(result, sv_2mortal(newSVu64(hash[1])));
+ av_push(result, sv_2mortal(newSVu64(hash[2])));
+ av_push(result, sv_2mortal(newSVu64(hash[3])));
+ return result;
+}
+