blob: 72d798846aa86143250499ba52ffa5f7ddd81bc5 [file] [log] [blame]
Nick Terrelle600b5d2017-10-16 17:18:43 -07001/*
2 * Copyright (c) 2017-present, Facebook, Inc.
3 * All rights reserved.
4 *
5 * This source code is licensed under both the BSD-style license (found in the
6 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7 * in the COPYING file in the root directory of this source tree).
8 * You may select, at your option, one of the above-listed licenses.
9 */
10
11#ifndef SEQGEN_H
12#define SEQGEN_H
13
14#define XXH_STATIC_LINKING_ONLY
15
16#include "xxhash.h"
17#include <stddef.h> /* size_t */
18
19typedef enum {
20 SEQ_gen_ml = 0,
21 SEQ_gen_ll,
22 SEQ_gen_of,
23 SEQ_gen_max /* Must be the last value */
24} SEQ_gen_type;
25
26/* Internal state, do not use */
27typedef struct {
28 XXH64_state_t xxh; /* xxh state for all the data produced so far (seed=0) */
29 unsigned seed;
30 int state; /* enum to control state machine (clean=0) */
31 unsigned saved;
32 size_t bytesLeft;
33} SEQ_stream;
34
35SEQ_stream SEQ_initStream(unsigned seed);
36
37typedef struct {
38 void* dst;
39 size_t size;
40 size_t pos;
41} SEQ_outBuffer;
42
43/* Returns non-zero until the current type/value has been generated.
44 * Must pass the same type/value until it returns 0.
45 *
46 * Recommended to pick a value in the middle of the range you want, since there
47 * may be some noise that causes actual results to be slightly different.
48 * We try to be more accurate for smaller values.
49 *
50 * NOTE: Very small values don't work well (< 6).
51 */
52size_t SEQ_gen(SEQ_stream* stream, SEQ_gen_type type, unsigned value,
53 SEQ_outBuffer* out);
54
55/* Returns the xxhash of the data produced so far */
56XXH64_hash_t SEQ_digest(SEQ_stream const* stream);
57
58#endif /* SEQGEN_H */