1// Copyright 2019 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_FEEDBACK_SOURCE_H_
6#define V8_COMPILER_FEEDBACK_SOURCE_H_
7
8#include "src/compiler/heap-refs.h"
9#include "src/objects/feedback-vector.h"
10
11namespace v8 {
12namespace internal {
13namespace compiler {
14
15struct FeedbackSource {
16  FeedbackSource() { DCHECK(!IsValid()); }
17  V8_EXPORT_PRIVATE FeedbackSource(Handle<FeedbackVector> vector_,
18                                   FeedbackSlot slot_);
19  FeedbackSource(FeedbackVectorRef vector_, FeedbackSlot slot_);
20
21  bool IsValid() const { return !vector.is_null() && !slot.IsInvalid(); }
22  int index() const;
23
24  Handle<FeedbackVector> vector;
25  FeedbackSlot slot;
26
27  struct Hash {
28    size_t operator()(FeedbackSource const& source) const {
29      return base::hash_combine(source.vector.address(), source.slot);
30    }
31  };
32
33  struct Equal {
34    bool operator()(FeedbackSource const& lhs,
35                    FeedbackSource const& rhs) const {
36      return lhs.vector.equals(rhs.vector) && lhs.slot == rhs.slot;
37    }
38  };
39};
40
41bool operator==(FeedbackSource const&, FeedbackSource const&);
42bool operator!=(FeedbackSource const&, FeedbackSource const&);
43
44V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
45                                           FeedbackSource const&);
46
47}  // namespace compiler
48}  // namespace internal
49}  // namespace v8
50
51#endif  // V8_COMPILER_FEEDBACK_SOURCE_H_
52