// Copyright 2013 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_PROFILER_HEAP_SNAPSHOT_GENERATOR_INL_H_
#define V8_PROFILER_HEAP_SNAPSHOT_GENERATOR_INL_H_

#include "src/profiler/heap-snapshot-generator.h"

namespace v8 {
namespace internal {


HeapEntry* HeapGraphEdge::from() const {
  return &snapshot()->entries()[from_index()];
}


Isolate* HeapGraphEdge::isolate() const {
  return snapshot()->profiler()->isolate();
}


HeapSnapshot* HeapGraphEdge::snapshot() const {
  return to_entry_->snapshot();
}


int HeapEntry::index() const {
  return static_cast<int>(this - &snapshot_->entries().front());
}


int HeapEntry::set_children_index(int index) {
  children_index_ = index;
  int next_index = index + children_count_;
  children_count_ = 0;
  return next_index;
}

std::deque<HeapGraphEdge*>::iterator HeapEntry::children_begin() {
  DCHECK_GE(children_index_, 0);
  SLOW_DCHECK(
      children_index_ < static_cast<int>(snapshot_->children().size()) ||
      (children_index_ == static_cast<int>(snapshot_->children().size()) &&
       children_count_ == 0));
  return snapshot_->children().begin() + children_index_;
}

std::deque<HeapGraphEdge*>::iterator HeapEntry::children_end() {
  return children_begin() + children_count_;
}


Isolate* HeapEntry::isolate() const { return snapshot_->profiler()->isolate(); }

}  // namespace internal
}  // namespace v8

#endif  // V8_PROFILER_HEAP_SNAPSHOT_GENERATOR_INL_H_
