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)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Forward.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/RefCounted.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Vector.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/WTFString.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class IDBKey : public RefCounted<IDBKey> {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef Vector<RefPtr<IDBKey> > KeyArray;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<IDBKey> createInvalid()
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new IDBKey());
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<IDBKey> createNumber(double number)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new IDBKey(NumberType, number));
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<IDBKey> createString(const String& string)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new IDBKey(string));
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<IDBKey> createDate(double date)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new IDBKey(DateType, date));
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<IDBKey> createMultiEntryArray(const KeyArray& array)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        KeyArray result;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size_t sizeEstimate = 0;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < array.size(); i++) {
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!array[i]->isValid())
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            bool skip = false;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (size_t j = 0; j < result.size(); j++) {
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (array[i]->isEqual(result[j].get())) {
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    skip = true;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!skip) {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.append(array[i]);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                sizeEstimate += array[i]->m_sizeEstimate;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<IDBKey> idbKey = adoptRef(new IDBKey(result, sizeEstimate));
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(idbKey->isValid());
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return idbKey.release();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<IDBKey> createArray(const KeyArray& array)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size_t sizeEstimate = 0;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < array.size(); ++i)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sizeEstimate += array[i]->m_sizeEstimate;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new IDBKey(array, sizeEstimate));
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~IDBKey();
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In order of the least to the highest precedent in terms of sort order.
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum Type {
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InvalidType = 0,
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ArrayType,
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StringType,
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DateType,
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NumberType,
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        MinType
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Type type() const { return m_type; }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isValid() const;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const KeyArray& array() const
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == ArrayType);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_array;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& string() const
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == StringType);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_string;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double date() const
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == DateType);
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_number;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double number() const
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_type == NumberType);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_number;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int compare(const IDBKey* other) const;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isLessThan(const IDBKey* other) const;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isEqual(const IDBKey* other) const;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t sizeEstimate() const { return m_sizeEstimate; }
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static int compareTypes(Type a, Type b)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return b - a;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    using RefCounted<IDBKey>::ref;
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    using RefCounted<IDBKey>::deref;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBKey() : m_type(InvalidType), m_number(0), m_sizeEstimate(OverheadSize) { }
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBKey(Type type, double number) : m_type(type), m_number(number), m_sizeEstimate(OverheadSize + sizeof(double)) { }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit IDBKey(const String& value) : m_type(StringType), m_string(value), m_number(0), m_sizeEstimate(OverheadSize + value.length() * sizeof(UChar)) { }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBKey(const KeyArray& keyArray, size_t arraySize) : m_type(ArrayType), m_array(keyArray), m_number(0), m_sizeEstimate(OverheadSize + arraySize) { }
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Type m_type;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const KeyArray m_array;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String m_string;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const double m_number;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const size_t m_sizeEstimate;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Very rough estimate of minimum key size overhead.
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum { OverheadSize = 16 };
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} // namespace WebCore
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // IDBKey_h
168