Make IDBKeyData from a struct to a class.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBKeyData.h
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef IDBKeyData_h
27 #define IDBKeyData_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBKey.h"
32
33 namespace WebCore {
34
35 class KeyedDecoder;
36 class KeyedEncoder;
37
38 class IDBKeyData {
39 public:
40     IDBKeyData()
41         : m_type(KeyType::Invalid)
42         , m_isNull(true)
43     {
44     }
45
46     WEBCORE_EXPORT IDBKeyData(const IDBKey*);
47
48     static IDBKeyData minimum()
49     {
50         IDBKeyData result;
51         result.m_type = KeyType::Min;
52         result.m_isNull = false;
53         return result;
54     }
55
56     static IDBKeyData maximum()
57     {
58         IDBKeyData result;
59         result.m_type = KeyType::Max;
60         result.m_isNull = false;
61         return result;
62     }
63
64     WEBCORE_EXPORT PassRefPtr<IDBKey> maybeCreateIDBKey() const;
65
66     IDBKeyData isolatedCopy() const;
67
68     WEBCORE_EXPORT void encode(KeyedEncoder&) const;
69     WEBCORE_EXPORT static bool decode(KeyedDecoder&, IDBKeyData&);
70
71     // compare() has the same semantics as strcmp().
72     //   - Returns negative if this IDBKeyData is less than other.
73     //   - Returns positive if this IDBKeyData is greater than other.
74     //   - Returns zero if this IDBKeyData is equal to other.
75     WEBCORE_EXPORT int compare(const IDBKeyData& other) const;
76
77     void setArrayValue(const Vector<IDBKeyData>&);
78     void setStringValue(const String&);
79     void setDateValue(double);
80     WEBCORE_EXPORT void setNumberValue(double);
81
82     template<class Encoder> void encode(Encoder&) const;
83     template<class Decoder> static bool decode(Decoder&, IDBKeyData&);
84     
85 #ifndef NDEBUG
86     WEBCORE_EXPORT String loggingString() const;
87 #endif
88
89     bool isNull() const { return m_isNull; }
90     KeyType type() const { return m_type; }
91
92 private:
93     KeyType m_type;
94     Vector<IDBKeyData> m_arrayValue;
95     String m_stringValue;
96     double m_numberValue { 0 };
97     bool m_isNull { false };
98 };
99
100 template<class Encoder>
101 void IDBKeyData::encode(Encoder& encoder) const
102 {
103     encoder << m_isNull;
104     if (m_isNull)
105         return;
106
107     encoder.encodeEnum(m_type);
108
109     switch (m_type) {
110     case KeyType::Invalid:
111         break;
112     case KeyType::Array:
113         encoder << m_arrayValue;
114         break;
115     case KeyType::String:
116         encoder << m_stringValue;
117         break;
118     case KeyType::Date:
119     case KeyType::Number:
120         encoder << m_numberValue;
121         break;
122     case KeyType::Max:
123     case KeyType::Min:
124         // MaxType and MinType are only used for comparison to other keys.
125         // They should never be encoded/decoded.
126         ASSERT_NOT_REACHED();
127         break;
128     }
129 }
130
131 template<class Decoder>
132 bool IDBKeyData::decode(Decoder& decoder, IDBKeyData& keyData)
133 {
134     if (!decoder.decode(keyData.m_isNull))
135         return false;
136
137     if (keyData.m_isNull)
138         return true;
139
140     if (!decoder.decodeEnum(keyData.m_type))
141         return false;
142
143     switch (keyData.m_type) {
144     case KeyType::Invalid:
145         break;
146     case KeyType::Array:
147         if (!decoder.decode(keyData.m_arrayValue))
148             return false;
149         break;
150     case KeyType::String:
151         if (!decoder.decode(keyData.m_stringValue))
152             return false;
153         break;
154     case KeyType::Date:
155     case KeyType::Number:
156         if (!decoder.decode(keyData.m_numberValue))
157             return false;
158         break;
159     case KeyType::Max:
160     case KeyType::Min:
161         // MaxType and MinType are only used for comparison to other keys.
162         // They should never be encoded/decoded.
163         ASSERT_NOT_REACHED();
164         decoder.markInvalid();
165         return false;
166     }
167
168     return true;
169 }
170
171 } // namespace WebCore
172
173 #endif // ENABLE(INDEXED_DATABASE)
174 #endif // IDBKeyData_h