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

#include "TimerData.h"

#include "BenchTimer.h"
#include <limits>

using namespace std;

TimerData::TimerData(const SkString& perIterTimeFormat, const SkString& normalTimeFormat)
: fWallStr(" msecs = ")
, fTruncatedWallStr(" Wmsecs = ")
, fCpuStr(" cmsecs = ")
, fTruncatedCpuStr(" Cmsecs = ")
, fGpuStr(" gmsecs = ")
, fWallSum(0.0)
, fWallMin((numeric_limits<double>::max)()) // Extra parens to make the windows build work, due to
                                            // 'max' macro
, fTruncatedWallSum(0.0)
, fTruncatedWallMin((numeric_limits<double>::max)())
, fCpuSum(0.0)
, fCpuMin((numeric_limits<double>::max)())
, fTruncatedCpuSum(0.0)
, fTruncatedCpuMin((numeric_limits<double>::max)())
, fGpuSum(0.0)
, fGpuMin((numeric_limits<double>::max)())
, fPerIterTimeFormat(perIterTimeFormat)
, fNormalTimeFormat(normalTimeFormat)
{}

static double Min(double a, double b) {
    return (a < b) ? a : b;
}

void TimerData::appendTimes(BenchTimer* timer, bool last) {
    SkASSERT(timer != NULL);
    SkString formatString(fPerIterTimeFormat);
    if (!last) {
        formatString.append(",");
    }
    const char* format = formatString.c_str();
    fWallStr.appendf(format, timer->fWall);
    fCpuStr.appendf(format, timer->fCpu);
    fTruncatedWallStr.appendf(format, timer->fTruncatedWall);
    fTruncatedCpuStr.appendf(format, timer->fTruncatedCpu);
    fGpuStr.appendf(format, timer->fGpu);

    // Store the minimum values. We do not need to special case the first time since we initialized
    // to max double.
    fWallMin = Min(fWallMin, timer->fWall);
    fCpuMin  = Min(fCpuMin,  timer->fCpu);
    fTruncatedWallMin = Min(fTruncatedWallMin, timer->fTruncatedWall);
    fTruncatedCpuMin  = Min(fTruncatedCpuMin,  timer->fTruncatedCpu);
    fGpuMin  = Min(fGpuMin,  timer->fGpu);

    // Tally the sum of each timer type.
    fWallSum += timer->fWall;
    fCpuSum += timer->fCpu;
    fTruncatedWallSum += timer->fTruncatedWall;
    fTruncatedCpuSum += timer->fTruncatedCpu;
    fGpuSum += timer->fGpu;

}

SkString TimerData::getResult(bool logPerIter, bool printMin, int repeatDraw,
                              const char *configName, bool showWallTime, bool showTruncatedWallTime,
                              bool showCpuTime, bool showTruncatedCpuTime, bool showGpuTime) {
    // output each repeat (no average) if logPerIter is set,
    // otherwise output only the average
    if (!logPerIter) {
        const char* format = fNormalTimeFormat.c_str();
        fWallStr.set(" msecs = ");
        fWallStr.appendf(format, printMin ? fWallMin : fWallSum / repeatDraw);
        fCpuStr.set(" cmsecs = ");
        fCpuStr.appendf(format, printMin ? fCpuMin : fCpuSum / repeatDraw);
        fTruncatedWallStr.set(" Wmsecs = ");
        fTruncatedWallStr.appendf(format,
                                  printMin ? fTruncatedWallMin : fTruncatedWallSum / repeatDraw);
        fTruncatedCpuStr.set(" Cmsecs = ");
        fTruncatedCpuStr.appendf(format,
                                 printMin ? fTruncatedCpuMin : fTruncatedCpuSum / repeatDraw);
        fGpuStr.set(" gmsecs = ");
        fGpuStr.appendf(format, printMin ? fGpuMin : fGpuSum / repeatDraw);
    }
    SkString str;
    str.printf("  %4s:", configName);
    if (showWallTime) {
        str += fWallStr;
    }
    if (showTruncatedWallTime) {
        str += fTruncatedWallStr;
    }
    if (showCpuTime) {
        str += fCpuStr;
    }
    if (showTruncatedCpuTime) {
        str += fTruncatedCpuStr;
    }
    if (showGpuTime && fGpuSum > 0) {
        str += fGpuStr;
    }
    return str;
}
