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

#ifndef TimerData_DEFINED
#define TimerData_DEFINED

#include "SkString.h"
#include "SkTemplates.h"

#ifdef SK_BUILD_FOR_WIN
    #pragma warning(push)
    #pragma warning(disable : 4530)
#endif

#include "SkJSONCPP.h"

#ifdef SK_BUILD_FOR_WIN
    #pragma warning(pop)
#endif

class BenchTimer;

class TimerData {
public:
    /**
     * Constructs a TimerData to hold at most maxNumTimings sets of elapsed timer values.
     **/
    explicit TimerData(int maxNumTimings);

    /**
     * Collect times from the BenchTimer for an iteration. It will fail if called more often than
     * indicated in the constructor.
     *
     * @param BenchTimer Must not be null.
     */
    bool appendTimes(BenchTimer*);

    enum Result {
        kMin_Result,
        kAvg_Result,
        kPerIter_Result
    };

    enum TimerFlags {
        kWall_Flag              = 0x1,
        kTruncatedWall_Flag     = 0x2,
        kCpu_Flag               = 0x4,
        kTruncatedCpu_Flag      = 0x8,
        kGpu_Flag               = 0x10
    };

    /**
     * Gets the timer data results as a string.
     * @param doubleFormat printf-style format for doubles (e.g. "%02d")
     * @param result the type of result desired
     * @param the name of the config being timed (prepended to results string)
     * @param timerFlags bitfield of TimerFlags values indicating which timers should be reported.
     * @param itersPerTiming the number of test/bench iterations that correspond to each
     *        appendTimes() call, 1 when appendTimes is called for each iteration.
     */
    SkString getResult(const char* doubleFormat,
                       Result result,
                       const char* configName,
                       uint32_t timerFlags,
                       int itersPerTiming = 1);
    Json::Value getJSON(uint32_t timerFlags,
                        Result result,
                        int itersPerTiming = 1);

private:
    int fMaxNumTimings;
    int fCurrTiming;

    SkAutoTArray<double> fWallTimes;
    SkAutoTArray<double> fTruncatedWallTimes;
    SkAutoTArray<double> fCpuTimes;
    SkAutoTArray<double> fTruncatedCpuTimes;
    SkAutoTArray<double> fGpuTimes;
};

#endif // TimerData_DEFINED
