X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/4e4e5a6f2694187498445a6ac6f1634ce8141119..refs/heads/master:/runtime/RegExpKey.h diff --git a/runtime/RegExpKey.h b/runtime/RegExpKey.h index e5ab438..58fa387 100644 --- a/runtime/RegExpKey.h +++ b/runtime/RegExpKey.h @@ -25,64 +25,65 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "UString.h" - #ifndef RegExpKey_h #define RegExpKey_h +#include +#include + namespace JSC { +enum RegExpFlags { + NoFlags = 0, + FlagGlobal = 1, + FlagIgnoreCase = 2, + FlagMultiline = 4, + InvalidFlags = 8, + DeletedValueFlags = -1 +}; + struct RegExpKey { - int flagsValue; - RefPtr pattern; + RegExpFlags flagsValue; + RefPtr pattern; RegExpKey() - : flagsValue(0) + : flagsValue(NoFlags) { } - RegExpKey(int flags) + RegExpKey(RegExpFlags flags) : flagsValue(flags) { } - RegExpKey(int flags, const UString& pattern) + RegExpKey(RegExpFlags flags, const String& pattern) : flagsValue(flags) - , pattern(pattern.rep()) + , pattern(pattern.impl()) { } - RegExpKey(int flags, const PassRefPtr pattern) + RegExpKey(RegExpFlags flags, const PassRefPtr pattern) : flagsValue(flags) , pattern(pattern) { } - RegExpKey(const UString& flags, const UString& pattern) - : pattern(pattern.rep()) + RegExpKey(RegExpFlags flags, const RefPtr& pattern) + : flagsValue(flags) + , pattern(pattern) { - flagsValue = getFlagsValue(flags); } - int getFlagsValue(const UString flags) - { - flagsValue = 0; - if (flags.find('g') != UString::NotFound) - flagsValue += 4; - if (flags.find('i') != UString::NotFound) - flagsValue += 2; - if (flags.find('m') != UString::NotFound) - flagsValue += 1; - return flagsValue; - } -}; -} // namespace JSC + friend inline bool operator==(const RegExpKey& a, const RegExpKey& b); -namespace WTF { -template struct DefaultHash; -template struct RegExpHash; + struct Hash { + static unsigned hash(const RegExpKey& key) { return key.pattern->hash(); } + static bool equal(const RegExpKey& a, const RegExpKey& b) { return a == b; } + static const bool safeToCompareToEmptyOrDeleted = false; + }; +}; -inline bool operator==(const JSC::RegExpKey& a, const JSC::RegExpKey& b) +inline bool operator==(const RegExpKey& a, const RegExpKey& b) { if (a.flagsValue != b.flagsValue) return false; @@ -93,19 +94,19 @@ inline bool operator==(const JSC::RegExpKey& a, const JSC::RegExpKey& b) return equal(a.pattern.get(), b.pattern.get()); } -template<> struct RegExpHash { - static unsigned hash(const JSC::RegExpKey& key) { return key.pattern->hash(); } - static bool equal(const JSC::RegExpKey& a, const JSC::RegExpKey& b) { return a == b; } - static const bool safeToCompareToEmptyOrDeleted = false; -}; +} // namespace JSC + +namespace WTF { +template struct DefaultHash; template<> struct DefaultHash { - typedef RegExpHash Hash; + typedef JSC::RegExpKey::Hash Hash; }; template<> struct HashTraits : GenericHashTraits { - static void constructDeletedValue(JSC::RegExpKey& slot) { slot.flagsValue = -1; } - static bool isDeletedValue(const JSC::RegExpKey& value) { return value.flagsValue == -1; } + static const bool emptyValueIsZero = true; + static void constructDeletedValue(JSC::RegExpKey& slot) { slot.flagsValue = JSC::DeletedValueFlags; } + static bool isDeletedValue(const JSC::RegExpKey& value) { return value.flagsValue == JSC::DeletedValueFlags; } }; } // namespace WTF