Add support for private names
[WebKit-https.git] / Source / JavaScriptCore / runtime / RegExpKey.h
1 /*
2  * Copyright (C) 2010 University of Szeged
3  * Copyright (C) 2010 Renata Hodovan (hodovan@inf.u-szeged.hu)
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 #ifndef RegExpKey_h
29 #define RegExpKey_h
30
31 #include "UString.h"
32 #include <wtf/text/StringHash.h>
33
34 namespace JSC {
35
36 enum RegExpFlags {
37     NoFlags = 0,
38     FlagGlobal = 1,
39     FlagIgnoreCase = 2,
40     FlagMultiline = 4,
41     InvalidFlags = 8,
42     DeletedValueFlags = -1
43 };
44
45 struct RegExpKey {
46     RegExpFlags flagsValue;
47     RefPtr<StringImpl> pattern;
48
49     RegExpKey()
50         : flagsValue(NoFlags)
51     {
52     }
53
54     RegExpKey(RegExpFlags flags)
55         : flagsValue(flags)
56     {
57     }
58
59     RegExpKey(RegExpFlags flags, const UString& pattern)
60         : flagsValue(flags)
61         , pattern(pattern.impl())
62     {
63     }
64
65     RegExpKey(RegExpFlags flags, const PassRefPtr<StringImpl> pattern)
66         : flagsValue(flags)
67         , pattern(pattern)
68     {
69     }
70
71     RegExpKey(RegExpFlags flags, const RefPtr<StringImpl>& pattern)
72         : flagsValue(flags)
73         , pattern(pattern)
74     {
75     }
76 };
77
78 inline bool operator==(const RegExpKey& a, const RegExpKey& b) 
79 {
80     if (a.flagsValue != b.flagsValue)
81         return false;
82     if (!a.pattern)
83         return !b.pattern;
84     if (!b.pattern)
85         return false;
86     return equal(a.pattern.get(), b.pattern.get());
87 }
88
89 } // namespace JSC
90
91 namespace WTF {
92 template<typename T> struct DefaultHash;
93 template<typename T> struct RegExpHash;
94
95 template<> struct RegExpHash<JSC::RegExpKey> {
96     static unsigned hash(const JSC::RegExpKey& key) { return key.pattern->hash(); }
97     static bool equal(const JSC::RegExpKey& a, const JSC::RegExpKey& b) { return a == b; }
98     static const bool safeToCompareToEmptyOrDeleted = false;
99 };
100
101 template<> struct DefaultHash<JSC::RegExpKey> {
102     typedef RegExpHash<JSC::RegExpKey> Hash;
103 };
104
105 template<> struct HashTraits<JSC::RegExpKey> : GenericHashTraits<JSC::RegExpKey> {
106     static const bool emptyValueIsZero = true;
107     static void constructDeletedValue(JSC::RegExpKey& slot) { slot.flagsValue = JSC::DeletedValueFlags; }
108     static bool isDeletedValue(const JSC::RegExpKey& value) { return value.flagsValue == JSC::DeletedValueFlags; }
109 };
110 } // namespace WTF
111
112 #endif // RegExpKey_h