// Copyright 2019 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 "src/developer/debug/shared/mock_memory.h"

#include "src/developer/debug/shared/largest_less_or_equal.h"

namespace debug_ipc {

void MockMemory::AddMemory(uint64_t address, std::vector<uint8_t> data) {
  mem_[address] = std::move(data);
}

std::vector<uint8_t> MockMemory::ReadMemory(uint64_t address, uint32_t size) const {
  auto found = FindBlockForAddress(address);
  if (found == mem_.end())
    return {};

  size_t offset = address - found->first;

  uint32_t size_to_return = std::min(size, static_cast<uint32_t>(found->second.size() - offset));

  std::vector<uint8_t> subset;
  subset.resize(size_to_return);
  memcpy(&subset[0], &found->second[offset], size_to_return);
  return subset;
}

MockMemory::RegisteredMemory::const_iterator MockMemory::FindBlockForAddress(
    uint64_t address) const {
  // Locates the potential map entry covering this address.
  auto found = debug_ipc::LargestLessOrEqual(
      mem_.begin(), mem_.end(), address,
      [](const RegisteredMemory::value_type& v, uint64_t a) { return v.first < a; },
      [](const RegisteredMemory::value_type& v, uint64_t a) { return v.first == a; });

  if (found == mem_.end())
    return mem_.end();

  // Validate the address is within the data range.
  if (address >= found->first + found->second.size())
    return mem_.end();  // Address is after this range.
  return found;
}

}  // namespace debug_ipc
