15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef IDBKey_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IDBKey_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/SharedBuffer.h"
30f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Forward.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Vector.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/WTFString.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)class IDBKey : public GarbageCollectedFinalized<IDBKey> {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
39d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    typedef HeapVector<Member<IDBKey> > KeyArray;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBKey* createInvalid()
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
43d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return new IDBKey();
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBKey* createNumber(double number)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
48d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return new IDBKey(NumberType, number);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBKey* createBinary(PassRefPtr<SharedBuffer> binary)
5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
53d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return new IDBKey(binary);
5451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
56d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBKey* createString(const String& string)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return new IDBKey(string);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
61d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBKey* createDate(double date)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return new IDBKey(DateType, date);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBKey* createMultiEntryArray(const KeyArray& array)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        KeyArray result;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < array.size(); i++) {
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!array[i]->isValid())
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            bool skip = false;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (size_t j = 0; j < result.size(); j++) {
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (array[i]->isEqual(result[j].get())) {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    skip = true;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!skip) {
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.append(array[i]);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        IDBKey* idbKey = new IDBKey(result);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(idbKey->isValid());
87d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return idbKey;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
90d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBKey* createArray(const KeyArray& array)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return new IDBKey(array);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~IDBKey();
96f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void trace(Visitor*);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In order of the least to the highest precedent in terms of sort order.
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum Type {
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InvalidType = 0,
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ArrayType,
10251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        BinaryType,
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StringType,
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DateType,
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NumberType,
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        MinType
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Type type() const { return m_type; }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isValid() const;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const KeyArray& array() const
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == ArrayType);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_array;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    PassRefPtr<SharedBuffer> binary() const
11951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
12051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ASSERT(m_type == BinaryType);
12151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return m_binary;
12251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
12351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& string() const
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == StringType);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_string;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double date() const
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == DateType);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_number;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double number() const
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == NumberType);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_number;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int compare(const IDBKey* other) const;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isLessThan(const IDBKey* other) const;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isEqual(const IDBKey* other) const;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
14751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    IDBKey() : m_type(InvalidType), m_number(0) { }
14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    IDBKey(Type type, double number) : m_type(type), m_number(number) { }
14951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    explicit IDBKey(const String& value) : m_type(StringType), m_string(value), m_number(0) { }
15051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    explicit IDBKey(PassRefPtr<SharedBuffer> value) : m_type(BinaryType), m_binary(value), m_number(0) { }
15151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    explicit IDBKey(const KeyArray& keyArray) : m_type(ArrayType), m_array(keyArray), m_number(0) { }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Type m_type;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const KeyArray m_array;
15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<SharedBuffer> m_binary;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String m_string;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const double m_number;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
160c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // IDBKey_h
163