f3250e7a42b950040002be3e13a3153dde71e117
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGMinifiedID.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #include "DFGCommon.h"
29 #include <wtf/HashMap.h>
30 #include <wtf/Packed.h>
31 #include <wtf/PrintStream.h>
32
33 namespace JSC { namespace DFG {
34
35 class Graph;
36 class MinifiedNode;
37 class ValueSource;
38 struct Node;
39
40 class MinifiedID {
41 public:
42     MinifiedID() = default;
43     MinifiedID(WTF::HashTableDeletedValueType) : m_index(otherInvalidIndex()) { }
44     explicit MinifiedID(Node* node);
45     
46     bool operator!() const { return m_index.get() == invalidIndex(); }
47     
48     bool operator==(const MinifiedID& other) const { return m_index.get() == other.m_index.get(); }
49     bool operator!=(const MinifiedID& other) const { return m_index.get() != other.m_index.get(); }
50     bool operator<(const MinifiedID& other) const { return m_index.get() < other.m_index.get(); }
51     bool operator>(const MinifiedID& other) const { return m_index.get() > other.m_index.get(); }
52     bool operator<=(const MinifiedID& other) const { return m_index.get() <= other.m_index.get(); }
53     bool operator>=(const MinifiedID& other) const { return m_index.get() >= other.m_index.get(); }
54     
55     unsigned hash() const { return WTF::IntHash<unsigned>::hash(m_index.get()); }
56     
57     void dump(PrintStream& out) const { out.print(m_index.get()); }
58     
59     bool isHashTableDeletedValue() const { return m_index.get() == otherInvalidIndex(); }
60     
61     static MinifiedID fromBits(unsigned value)
62     {
63         MinifiedID result;
64         result.m_index = value;
65         return result;
66     }
67     
68     unsigned bits() const { return m_index.get(); }
69
70 private:
71     friend class MinifiedNode;
72     
73     static constexpr unsigned invalidIndex() { return static_cast<unsigned>(-1); }
74     static constexpr unsigned otherInvalidIndex() { return static_cast<unsigned>(-2); }
75     
76     Packed<unsigned> m_index { invalidIndex() };
77 };
78
79 struct MinifiedIDHash {
80     static unsigned hash(const MinifiedID& key) { return key.hash(); }
81     static bool equal(const MinifiedID& a, const MinifiedID& b) { return a == b; }
82     static const bool safeToCompareToEmptyOrDeleted = true;
83 };
84
85 } } // namespace JSC::DFG
86
87 namespace WTF {
88
89 template<typename T> struct DefaultHash;
90 template<> struct DefaultHash<JSC::DFG::MinifiedID> {
91     typedef JSC::DFG::MinifiedIDHash Hash;
92 };
93
94 template<typename T> struct HashTraits;
95 template<> struct HashTraits<JSC::DFG::MinifiedID> : SimpleClassHashTraits<JSC::DFG::MinifiedID> {
96     static const bool emptyValueIsZero = false;
97 };
98
99 } // namespace WTF