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

#include "garnet/lib/debug_ipc/register_test_support.h"

#include <string.h>

namespace debug_ipc {

namespace {

std::vector<uint8_t> CreateData(size_t length) {
  std::vector<uint8_t> data;
  data.reserve(length);
  // So that we get the number backwards (0x0102...).
  uint8_t base = length;
  for (size_t i = 0; i < length; i++) {
    data.emplace_back(base - i);
  }
  return data;
}

}  // namespace

Register CreateRegister(RegisterID id, size_t length) {
  Register reg;
  reg.id = id;
  reg.data = std::vector<uint8_t>(length);
  // Zero out.
  memset(reg.data.data(), 0, length);
  return reg;
}

Register CreateRegisterWithData(RegisterID id, size_t length) {
  Register reg;
  reg.id = id;
  reg.data = CreateData(length);
  return reg;
}

Register CreateUint64Register(RegisterID id, uint64_t value) {
  Register reg;
  reg.id = id;
  reg.data = std::vector<uint8_t>(sizeof(uint64_t));
  *reinterpret_cast<uint64_t*>(reg.data.data()) = value;
  return reg;
}

}  // namespace debug_ipc
