/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 * All rights reserved.
 *
 * This source code is licensed under both the BSD-style license (found in the
 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
 * in the COPYING file in the root directory of this source tree).
 * You may select, at your option, one of the above-listed licenses.
 */

#ifndef SEQGEN_H
#define SEQGEN_H

#define XXH_STATIC_LINKING_ONLY

#include "xxhash.h"
#include <stddef.h>   /* size_t */

typedef enum {
    SEQ_gen_ml = 0,
    SEQ_gen_ll,
    SEQ_gen_of,
    SEQ_gen_max /* Must be the last value */
} SEQ_gen_type;

/* Internal state, do not use */
typedef struct {
    XXH64_state_t xxh; /* xxh state for all the data produced so far (seed=0) */
    unsigned seed;
    int state; /* enum to control state machine (clean=0) */
    unsigned saved;
    size_t bytesLeft;
} SEQ_stream;

SEQ_stream SEQ_initStream(unsigned seed);

typedef struct {
    void* dst;
    size_t size;
    size_t pos;
} SEQ_outBuffer;

/* Returns non-zero until the current type/value has been generated.
 * Must pass the same type/value until it returns 0.
 *
 * Recommended to pick a value in the middle of the range you want, since there
 * may be some noise that causes actual results to be slightly different.
 * We try to be more accurate for smaller values.
 *
 * NOTE: Very small values don't work well (< 6).
 */
size_t SEQ_gen(SEQ_stream* stream, SEQ_gen_type type, unsigned value,
               SEQ_outBuffer* out);

/* Returns the xxhash of the data produced so far */
XXH64_hash_t SEQ_digest(SEQ_stream const* stream);

#endif /* SEQGEN_H */
