// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GARNET_BIN_CPUPERF_SESSION_RESULT_SPEC_H_
#define GARNET_BIN_CPUPERF_SESSION_RESULT_SPEC_H_

#include <cstddef>
#include <string>

namespace cpuperf {

struct SessionResultSpec {
  SessionResultSpec(const std::string& config_name, size_t num_iterations,
                    size_t num_traces,
                    const std::string& output_path_prefix);
  SessionResultSpec() = default;

  // Given an iteration number and trace number, return the output file.
  std::string GetTraceFilePath(size_t iter_num, size_t trace_num) const;

  std::string config_name;
  size_t num_iterations = 0;
  size_t num_traces = 0;
  std::string output_path_prefix;
};

bool DecodeSessionResultSpec(const std::string& json,
                             SessionResultSpec* out_spec);

bool WriteSessionResultSpec(const std::string& output_file_path,
                            const SessionResultSpec& spec);

}  // namespace cpuperf

#endif  // GARNET_BIN_CPUPERF_SESSION_RESULT_SPEC_H_
