//
// Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// HistogramWriter:
//   Helper class for writing histogram-json-set-format files to JSON.

#ifndef ANGLE_TESTS_TEST_UTILS_HISTOGRAM_WRITER_H_
#define ANGLE_TESTS_TEST_UTILS_HISTOGRAM_WRITER_H_

#include <map>
#include <memory>
#include <string>

// Include forward delcarations for rapidjson types.
#include <rapidjson/fwd.h>

namespace catapult
{
class HistogramBuilder;
}  // namespace catapult

namespace angle
{
class HistogramWriter
{
  public:
    HistogramWriter();
    ~HistogramWriter();

    void addSample(const std::string &measurement,
                   const std::string &story,
                   double value,
                   const std::string &units);

    void getAsJSON(rapidjson::Document *doc) const;

  private:
#if defined(ANGLE_HAS_HISTOGRAMS)
    std::map<std::string, std::unique_ptr<catapult::HistogramBuilder>> mHistograms;
#endif  // defined(ANGLE_HAS_HISTOGRAMS)
};

// Define a stub implementation when histograms are compiled out.
#if !defined(ANGLE_HAS_HISTOGRAMS)
inline HistogramWriter::HistogramWriter()  = default;
inline HistogramWriter::~HistogramWriter() = default;
inline void HistogramWriter::addSample(const std::string &measurement,
                                       const std::string &story,
                                       double value,
                                       const std::string &units)
{}
inline void HistogramWriter::getAsJSON(rapidjson::Document *doc) const {}
#endif  // !defined(ANGLE_HAS_HISTOGRAMS)

}  // namespace angle

#endif  // ANGLE_TESTS_TEST_UTILS_HISTOGRAM_WRITER_H_
