1/*
2 * Copyright (C) 2010 University of Szeged
3 * Copyright (C) 2010 Renata Hodovan ([email protected])
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#pragma once
29
30#include "YarrFlags.h"
31#include <wtf/OptionSet.h>
32#include <wtf/text/StringHash.h>
33
34namespace JSC {
35
36struct RegExpKey {
37 OptionSet<Yarr::Flags> flagsValue;
38 RefPtr<StringImpl> pattern;
39
40 RegExpKey()
41 {
42 }
43
44 RegExpKey(OptionSet<Yarr::Flags> flags)
45 : flagsValue(flags)
46 {
47 }
48
49 RegExpKey(OptionSet<Yarr::Flags> flags, const String& pattern)
50 : flagsValue(flags)
51 , pattern(pattern.impl())
52 {
53 }
54
55 RegExpKey(OptionSet<Yarr::Flags> flags, RefPtr<StringImpl>&& pattern)
56 : flagsValue(flags)
57 , pattern(WTFMove(pattern))
58 {
59 }
60
61 RegExpKey(OptionSet<Yarr::Flags> flags, const RefPtr<StringImpl>& pattern)
62 : flagsValue(flags)
63 , pattern(pattern)
64 {
65 }
66
67 friend inline bool operator==(const RegExpKey& a, const RegExpKey& b);
68
69 struct Hash {
70 static unsigned hash(const RegExpKey& key) { return key.pattern->hash(); }
71 static bool equal(const RegExpKey& a, const RegExpKey& b) { return a == b; }
72 static const bool safeToCompareToEmptyOrDeleted = false;
73 };
74};
75
76inline bool operator==(const RegExpKey& a, const RegExpKey& b)
77{
78 if (a.flagsValue != b.flagsValue)
79 return false;
80 if (!a.pattern)
81 return !b.pattern;
82 if (!b.pattern)
83 return false;
84 return equal(a.pattern.get(), b.pattern.get());
85}
86
87} // namespace JSC
88
89namespace WTF {
90template<typename T> struct DefaultHash;
91
92template<> struct DefaultHash<JSC::RegExpKey> {
93 typedef JSC::RegExpKey::Hash Hash;
94};
95
96template<> struct HashTraits<JSC::RegExpKey> : GenericHashTraits<JSC::RegExpKey> {
97 static const bool emptyValueIsZero = true;
98 static void constructDeletedValue(JSC::RegExpKey& slot) { slot.flagsValue = JSC::Yarr::Flags::DeletedValue; }
99 static bool isDeletedValue(const JSC::RegExpKey& value) { return value.flagsValue == JSC::Yarr::Flags::DeletedValue; }
100};
101} // namespace WTF
102