1 /* 2 * Copyright (C) 2010 University of Szeged 3 * Copyright (C) 2010 Renata Hodovan (hodovan (at) 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 void constructDeletedValue(JSC::RegExpKey& slot) { slot.flagsValue = JSC::DeletedValueFlags; } 107 static bool isDeletedValue(const JSC::RegExpKey& value) { return value.flagsValue == JSC::DeletedValueFlags; } 108 }; 109 } // namespace WTF 110 111 #endif // RegExpKey_h 112