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

#include "src/vector-slot-pair.h"

#include "src/feedback-vector.h"

namespace v8 {
namespace internal {

VectorSlotPair::VectorSlotPair() = default;

int VectorSlotPair::index() const {
  return vector_.is_null() ? -1 : FeedbackVector::GetIndex(slot_);
}

bool operator==(VectorSlotPair const& lhs, VectorSlotPair const& rhs) {
  return lhs.slot() == rhs.slot() &&
         lhs.vector().location() == rhs.vector().location() &&
         lhs.ic_state() == rhs.ic_state();
}

bool operator!=(VectorSlotPair const& lhs, VectorSlotPair const& rhs) {
  return !(lhs == rhs);
}

std::ostream& operator<<(std::ostream& os, const VectorSlotPair& p) {
  if (p.IsValid()) {
    return os << "VectorSlotPair(" << p.slot() << ", "
              << InlineCacheState2String(p.ic_state()) << ")";
  }
  return os << "VectorSlotPair(INVALID)";
}

size_t hash_value(VectorSlotPair const& p) {
  return base::hash_combine(p.slot(), p.vector().location(), p.ic_state());
}

}  // namespace internal
}  // namespace v8
