// 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/zxdb/common/mock_memory.h"

namespace zxdb {

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 {
  // Finds the first block >= address.
  auto found = mem_.lower_bound(address);

  // We need the first block <= address.
  if (found != mem_.end() && found->first == address)
    return found;  // Got exact match.

  // Now find the first block < address.
  if (found == mem_.begin())
    return mem_.end();  // Nothing before the address.

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

}  // namespace zxdb
