#ifndef C_HIGHWAYHASH_H_
#define C_HIGHWAYHASH_H_
#include <stdint.h>
#include <string.h>
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
typedef struct {
uint64_t v0[4];
uint64_t v1[4];
uint64_t mul0[4];
uint64_t mul1[4];
} HighwayHashState;
static void HighwayHashReset(const uint64_t key[4], HighwayHashState* state);
void HighwayHashUpdatePacket(const uint8_t* packet, HighwayHashState* state);
void HighwayHashUpdateRemainder(const uint8_t* bytes, const size_t size_mod32,
HighwayHashState* state);
static uint64_t HighwayHashFinalize64(HighwayHashState* state);
static void HighwayHashFinalize128(HighwayHashState* state, uint64_t hash[2]);
static void HighwayHashFinalize256(HighwayHashState* state, uint64_t hash[4]);
uint64_t HighwayHash64(const uint8_t* data, size_t size, const uint64_t key[4]);
void HighwayHash128(const uint8_t* data, size_t size,
const uint64_t key[4], uint64_t hash[2]);
void HighwayHash256(const uint8_t* data, size_t size,
const uint64_t key[4], uint64_t hash[4]);
typedef struct {
HighwayHashState state;
uint8_t packet[32];
int num;
} HighwayHashCat;
void HighwayHashCatStart(const uint64_t key[4], HighwayHashCat* state);
void HighwayHashCatAppend(const uint8_t* bytes, size_t num,
HighwayHashCat* state);
uint64_t HighwayHashCatFinish64(const HighwayHashCat* state);
void HighwayHashCatFinish128(const HighwayHashCat* state, uint64_t hash[2]);
void HighwayHashCatFinish256(const HighwayHashCat* state, uint64_t hash[4]);
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
#endif