2 * Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef TemplateRegistryKey_h
27 #define TemplateRegistryKey_h
30 #include <wtf/Vector.h>
31 #include <wtf/text/StringHash.h>
32 #include <wtf/text/WTFString.h>
36 class TemplateRegistryKey
{
38 typedef Vector
<String
, 4> StringVector
;
40 TemplateRegistryKey(const StringVector
& rawStrings
, const StringVector
& cookedStrings
);
41 enum DeletedValueTag
{ DeletedValue
};
42 TemplateRegistryKey(DeletedValueTag
);
43 enum EmptyValueTag
{ EmptyValue
};
44 TemplateRegistryKey(EmptyValueTag
);
46 bool isDeletedValue() const { return m_rawStrings
.isEmpty() && m_hash
== std::numeric_limits
<unsigned>::max(); }
48 bool isEmptyValue() const { return m_rawStrings
.isEmpty() && !m_hash
; }
50 unsigned hash() const { return m_hash
; }
52 const StringVector
& rawStrings() const { return m_rawStrings
; }
53 const StringVector
& cookedStrings() const { return m_cookedStrings
; }
55 bool operator==(const TemplateRegistryKey
& other
) const { return m_hash
== other
.m_hash
&& m_rawStrings
== other
.m_rawStrings
; }
56 bool operator!=(const TemplateRegistryKey
& other
) const { return m_hash
!= other
.m_hash
|| m_rawStrings
!= other
.m_rawStrings
; }
59 static unsigned hash(const TemplateRegistryKey
& key
) { return key
.hash(); }
60 static bool equal(const TemplateRegistryKey
& a
, const TemplateRegistryKey
& b
) { return a
== b
; }
61 static const bool safeToCompareToEmptyOrDeleted
= false;
65 StringVector m_rawStrings
;
66 StringVector m_cookedStrings
;
67 unsigned m_hash
{ 0 };
70 inline TemplateRegistryKey::TemplateRegistryKey(const StringVector
& rawStrings
, const StringVector
& cookedStrings
)
71 : m_rawStrings(rawStrings
)
72 , m_cookedStrings(cookedStrings
)
75 for (const String
& string
: rawStrings
)
76 m_hash
+= WTF::StringHash::hash(string
);
79 inline TemplateRegistryKey::TemplateRegistryKey(DeletedValueTag
)
80 : m_hash(std::numeric_limits
<unsigned>::max())
84 inline TemplateRegistryKey::TemplateRegistryKey(EmptyValueTag
)
92 template<typename T
> struct DefaultHash
;
94 template<> struct DefaultHash
<JSC::TemplateRegistryKey
> {
95 typedef JSC::TemplateRegistryKey::Hasher Hash
;
98 template<> struct HashTraits
<JSC::TemplateRegistryKey
> : CustomHashTraits
<JSC::TemplateRegistryKey
> {
103 #endif // TemplateRegistryKey_h