// Copyright 2020 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/symbols/inheritance_path.h"

#include <lib/syslog/cpp/macros.h>

namespace zxdb {

InheritancePath::InheritancePath(fxl::RefPtr<Collection> derived, fxl::RefPtr<InheritedFrom> from,
                                 fxl::RefPtr<Collection> base) {
  path_.emplace_back(std::move(derived));
  path_.emplace_back(std::move(from), std::move(base));
}

std::optional<uint32_t> InheritancePath::BaseOffsetInDerived() const {
  uint32_t result = 0;
  // Skip path_[0] because there's no InheritedFrom class to get from a class to itself.
  for (size_t i = 1; i < path_.size(); i++) {
    if (path_[i].from->kind() == InheritedFrom::kConstant) {
      result += path_[i].from->offset();
    } else {
      return std::nullopt;  // Non-constant can't compute a simple offset.
    }
  }
  return result;
}

InheritancePath InheritancePath::SubPath(size_t begin_index, size_t len) const {
  FX_DCHECK(len != 0);
  FX_DCHECK(begin_index >= 0 && begin_index < path_.size());
  FX_DCHECK(len == kToEnd || begin_index + len <= path_.size());

  InheritancePath result;
  result.path_.insert(result.path_.begin(), path_.begin() + begin_index,
                      len == kToEnd ? path_.end() : path_.begin() + (begin_index + len));

  // The first element of the result shouldn't have a "from" since it's not coming from anywhere.
  result.path_.front().from.reset();

  return result;
}

}  // namespace zxdb
