// 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 <iterator>

namespace perfmon {

RecordType GetRecordType(const RecordHeader* hdr) {
  switch (hdr->type) {
    case kRecordTypeTime:
    case kRecordTypeTick:
    case kRecordTypeCount:
    case kRecordTypeValue:
    case kRecordTypePc:
    case kRecordTypeLastBranch:
      return static_cast<RecordType>(hdr->type);
    default:
      return kRecordTypeInvalid;
  }
}

size_t GetRecordSize(const RecordHeader* hdr) {
  switch (hdr->type) {
    case kRecordTypeTime:
      return sizeof(TimeRecord);
    case kRecordTypeTick:
      return sizeof(TickRecord);
    case kRecordTypeCount:
      return sizeof(CountRecord);
    case kRecordTypeValue:
      return sizeof(ValueRecord);
    case kRecordTypePc:
      return sizeof(PcRecord);
    case kRecordTypeLastBranch: {
      auto rec = reinterpret_cast<const LastBranchRecord*>(hdr);
      if (rec->num_branches > std::size(rec->branches))
        return 0;
      return LastBranchRecordSize(rec);
    }
    default:
      return 0;
  }
}

}  // namespace perfmon
