// 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_LIB_MEASURE_ARGUMENT_VALUE_H_
#define GARNET_LIB_MEASURE_ARGUMENT_VALUE_H_

#include <map>
#include <unordered_map>
#include <vector>

#include <trace-reader/reader.h>

#include "garnet/lib/measure/event_spec.h"
#include "lib/fxl/macros.h"

namespace tracing {
namespace measure {

// An "argument value" measurement records the value of the specified argument
// of a trace event. The argument must be of type uint64.
struct ArgumentValueSpec {
  MeasurementSpecCommon common;

  EventSpec event;

  std::string argument_name;
  std::string argument_unit;  // TODO(mariagl): use that for reporting.
};

class MeasureArgumentValue {
 public:
  explicit MeasureArgumentValue(std::vector<ArgumentValueSpec> specs);

  // Processes a recorded trace event. Returns true on success and false if the
  // record was ignored due to an error in the provided data.
  bool Process(const trace::Record::Event& event);

  // Returns the results of the measurements. The results are represented as a
  // map of measurement ids to lists of argument values of the matching trace
  // events.
  const std::unordered_map<uint64_t, std::vector<uint64_t>>& results() {
    return results_;
  }

 private:
  bool RecordArgumentValue(const trace::Record::Event& event,
                           const ArgumentValueSpec& spec);
  void AddResult(uint64_t spec_id, uint64_t argument_value);

  std::vector<ArgumentValueSpec> specs_;
  std::unordered_map<uint64_t, std::vector<uint64_t>> results_;

  FXL_DISALLOW_COPY_AND_ASSIGN(MeasureArgumentValue);
};

}  // namespace measure
}  // namespace tracing

#endif  // GARNET_LIB_MEASURE_ARGUMENT_VALUE_H_
