// Copyright 2017 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.

#include "records.h"

#include <lib/fxl/arraysize.h>

namespace cpuperf {

cpuperf_record_type_t RecordType(const cpuperf_record_header_t* hdr) {
  switch (hdr->type) {
    case CPUPERF_RECORD_TIME:
    case CPUPERF_RECORD_TICK:
    case CPUPERF_RECORD_COUNT:
    case CPUPERF_RECORD_VALUE:
    case CPUPERF_RECORD_PC:
    case CPUPERF_RECORD_LAST_BRANCH:
      return static_cast<cpuperf_record_type_t>(hdr->type);
    default:
      return CPUPERF_RECORD_RESERVED;
  }
}

size_t RecordSize(const cpuperf_record_header_t* hdr) {
  switch (hdr->type) {
    case CPUPERF_RECORD_TIME:
      return sizeof(cpuperf_time_record_t);
    case CPUPERF_RECORD_TICK:
      return sizeof(cpuperf_tick_record_t);
    case CPUPERF_RECORD_COUNT:
      return sizeof(cpuperf_count_record_t);
    case CPUPERF_RECORD_VALUE:
      return sizeof(cpuperf_value_record_t);
    case CPUPERF_RECORD_PC:
      return sizeof(cpuperf_pc_record_t);
    case CPUPERF_RECORD_LAST_BRANCH: {
      auto rec = reinterpret_cast<const cpuperf_last_branch_record_t*>(hdr);
      if (rec->num_branches > arraysize(rec->branches))
        return 0;
      return CPUPERF_LAST_BRANCH_RECORD_SIZE(rec);
    }
    default:
      return 0;
  }
}

}  // namespace cpuperf
