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

#ifndef TimingStateMachine_DEFINED
#define TimingStateMachine_DEFINED

#include "Benchmark.h"
#include "SkTArray.h"
#include "Timer.h"

class SkCanvas;

/*
 * Manages a timer via a state machine.  Can be used by modules to time benchmarks
 *
 * Clients call nextFrame, and must handle any requests from the timing state machine, specifically
 * to reset.  When kTimingFinished_ParentEvents is returned, then lastMeasurement() will return the
 * timing and loops() will return the number of loops used to time.
 *
 * A client may continue timing the same benchmark indefinitely.  To advance to the next
 * benchmark, the client should call nextBenchmark.
 */
class TimingStateMachine {
public:
    TimingStateMachine();

    enum ParentEvents {
        kReset_ParentEvents,
        kTiming_ParentEvents,
        kTimingFinished_ParentEvents,// This implies parent can read lastMeasurement() and must
                                     // reset
    };

    ParentEvents nextFrame(bool preWarmBetweenSamples);

    /*
     * The caller should call this when they are ready to move to the next benchmark.
     */
    void nextBenchmark();

    /*
     * When TimingStateMachine returns kTimingFinished_ParentEvents, then the owner can call
     * lastMeasurement() to get the time
     */
    double lastMeasurement() const { return fLastMeasurement; }

    int loops() const { return fLoops; }

private:
    enum State {
        kPreWarm_State,
        kTiming_State,
    };
    enum InnerState {
        kTuning_InnerState,
        kTiming_InnerState,
    };

    inline double elapsed();
    void resetTimingState();
    void recordMeasurement();

    int fCurrentFrame;
    int fLoops;
    double fLastMeasurement;
    double fStartTime;
    State fState;
    InnerState fInnerState;
};

#endif
