97dc3206aa8c7a7a9a630a5fe502816980b2efc7
[WebKit-https.git] / Source / JavaScriptCore / profiler / ProfilerUID.h
1 /*
2  * Copyright (C) 2016 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 "JSCJSValue.h"
29 #include <wtf/HashMap.h>
30 #include <wtf/PrintStream.h>
31
32 namespace JSC { namespace Profiler {
33
34 class UID {
35 public:
36     UID()
37         : m_uid(0)
38     {
39     }
40     
41     static UID fromInt(uint64_t value)
42     {
43         UID result;
44         result.m_uid = value;
45         return result;
46     }
47     
48     UID(WTF::HashTableDeletedValueType)
49         : m_uid(std::numeric_limits<uint64_t>::max())
50     {
51     }
52     
53     static UID create();
54     
55     uint64_t toInt() const
56     {
57         return m_uid;
58     }
59     
60     bool operator==(const UID& other) const
61     {
62         return m_uid == other.m_uid;
63     }
64     
65     bool operator!=(const UID& other) const
66     {
67         return !(*this == other);
68     }
69     
70     explicit operator bool() const
71     {
72         return *this != UID();
73     }
74     
75     bool isHashTableDeletedValue() const
76     {
77         return *this != UID(WTF::HashTableDeletedValue);
78     }
79     
80     unsigned hash() const
81     {
82         return IntHash<uint64_t>::hash(m_uid);
83     }
84     
85     void dump(PrintStream&) const;
86     JSValue toJS(ExecState*) const;
87     
88 private:
89     uint64_t m_uid;
90 };
91
92 struct UIDHash {
93     static unsigned hash(const UID& key) { return key.hash(); }
94     static bool equal(const UID& a, const UID& b) { return a == b; }
95     static const bool safeToCompareToEmptyOrDeleted = true;
96 };
97
98 } } // namespace JSC::Profiler
99
100 namespace WTF {
101
102 template<typename T> struct DefaultHash;
103 template<> struct DefaultHash<JSC::Profiler::UID> {
104     typedef JSC::Profiler::UIDHash Hash;
105 };
106
107 template<typename T> struct HashTraits;
108 template<> struct HashTraits<JSC::Profiler::UID> : SimpleClassHashTraits<JSC::Profiler::UID> { };
109
110 } // namespace WTF