/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef Fuzz_DEFINED
#define Fuzz_DEFINED

#include "SkData.h"
#include "SkTRegistry.h"
#include "SkTypes.h"

class Fuzz : SkNoncopyable {
public:
    explicit Fuzz(SkData*);

    bool nextBool();
    uint8_t  nextB();
    uint32_t nextU();
    // This can be nan, +- infinity, 0, anything.
    float    nextF();

    // Return the next fuzzed value [min, max) as an unsigned 32bit integer.
    uint32_t nextRangeU(uint32_t min, uint32_t max);
    /**
     *  Returns next fuzzed value [min...max) as a float.
     *  Will not be Infinity or NaN.
     */
    float    nextRangeF(float    min, float    max);

    void signalBug   ();  // Tell afl-fuzz these inputs found a bug.
    void signalBoring();  // Tell afl-fuzz these inputs are not worth testing.

private:
    template <typename T>
    T nextT();

    SkAutoTUnref<SkData> fBytes;
    int fNextByte;
};

struct Fuzzable {
    const char* name;
    void (*fn)(Fuzz*);
};

#define DEF_FUZZ(name, f)                                        \
    static void fuzz_##name(Fuzz*);                              \
    SkTRegistry<Fuzzable> register_##name({#name, fuzz_##name}); \
    static void fuzz_##name(Fuzz* f)

#endif//Fuzz_DEFINED
