106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen/*
206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 University of Szeged
306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Renata Hodovan (hodovan@inf.u-szeged.hu)
406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * All rights reserved.
506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Redistribution and use in source and binary forms, with or without
706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * modification, are permitted provided that the following conditions
806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * are met:
906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 1. Redistributions of source code must retain the above copyright
1006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer.
1106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright
1206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer in the
1306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    documentation and/or other materials provided with the distribution.
1406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
1506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
1606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
1906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
2306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen */
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifndef RegExpKey_h
2906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define RegExpKey_h
3006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
312bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "UString.h"
322bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/text/StringHash.h>
332bde8e466a4451c7319e3a072d118917957d6554Steve Block
3406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsennamespace JSC {
3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
362bde8e466a4451c7319e3a072d118917957d6554Steve Blockenum RegExpFlags {
372bde8e466a4451c7319e3a072d118917957d6554Steve Block    NoFlags = 0,
382bde8e466a4451c7319e3a072d118917957d6554Steve Block    FlagGlobal = 1,
392bde8e466a4451c7319e3a072d118917957d6554Steve Block    FlagIgnoreCase = 2,
402bde8e466a4451c7319e3a072d118917957d6554Steve Block    FlagMultiline = 4,
412bde8e466a4451c7319e3a072d118917957d6554Steve Block    InvalidFlags = 8,
422bde8e466a4451c7319e3a072d118917957d6554Steve Block    DeletedValueFlags = -1
432bde8e466a4451c7319e3a072d118917957d6554Steve Block};
442bde8e466a4451c7319e3a072d118917957d6554Steve Block
4506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstruct RegExpKey {
462bde8e466a4451c7319e3a072d118917957d6554Steve Block    RegExpFlags flagsValue;
47f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<StringImpl> pattern;
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
4906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    RegExpKey()
502bde8e466a4451c7319e3a072d118917957d6554Steve Block        : flagsValue(NoFlags)
5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    {
5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
542bde8e466a4451c7319e3a072d118917957d6554Steve Block    RegExpKey(RegExpFlags flags)
5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        : flagsValue(flags)
5606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    {
5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
5806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    RegExpKey(RegExpFlags flags, const UString& pattern)
6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        : flagsValue(flags)
61f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        , pattern(pattern.impl())
6206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    {
6306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
652bde8e466a4451c7319e3a072d118917957d6554Steve Block    RegExpKey(RegExpFlags flags, const PassRefPtr<StringImpl> pattern)
66f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        : flagsValue(flags)
67f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        , pattern(pattern)
68f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    {
69f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
70f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
712bde8e466a4451c7319e3a072d118917957d6554Steve Block    RegExpKey(RegExpFlags flags, const RefPtr<StringImpl>& pattern)
7206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        : flagsValue(flags)
7306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        , pattern(pattern)
7406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    {
7506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
7606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
7706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
78967717af5423377c967781471ee106e2bb4e11c8Ben Murdochinline bool operator==(const RegExpKey& a, const RegExpKey& b)
7906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
8006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (a.flagsValue != b.flagsValue)
8106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return false;
8206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!a.pattern)
8306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return !b.pattern;
8406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!b.pattern)
8506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return false;
8606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return equal(a.pattern.get(), b.pattern.get());
8706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
8806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
89967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} // namespace JSC
90967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
91967717af5423377c967781471ee106e2bb4e11c8Ben Murdochnamespace WTF {
92967717af5423377c967781471ee106e2bb4e11c8Ben Murdochtemplate<typename T> struct DefaultHash;
93967717af5423377c967781471ee106e2bb4e11c8Ben Murdochtemplate<typename T> struct RegExpHash;
94967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
9506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsentemplate<> struct RegExpHash<JSC::RegExpKey> {
9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static unsigned hash(const JSC::RegExpKey& key) { return key.pattern->hash(); }
9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static bool equal(const JSC::RegExpKey& a, const JSC::RegExpKey& b) { return a == b; }
9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const bool safeToCompareToEmptyOrDeleted = false;
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsentemplate<> struct DefaultHash<JSC::RegExpKey> {
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    typedef RegExpHash<JSC::RegExpKey> Hash;
10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsentemplate<> struct HashTraits<JSC::RegExpKey> : GenericHashTraits<JSC::RegExpKey> {
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void constructDeletedValue(JSC::RegExpKey& slot) { slot.flagsValue = JSC::DeletedValueFlags; }
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block    static bool isDeletedValue(const JSC::RegExpKey& value) { return value.flagsValue == JSC::DeletedValueFlags; }
10806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
10906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} // namespace WTF
11006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
11106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif // RegExpKey_h
112