Unreviewed, adding Ross Kirsling to contributors.json\n\n* Scripts/webkitpy/common...
[WebKit.git] / Source / WTF / wtf / persistence / Decoder.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 #pragma once
27
28 #include <wtf/SHA1.h>
29 #include <wtf/persistence/Coder.h>
30
31 namespace WTF {
32 namespace Persistence {
33
34 class Decoder {
35     WTF_MAKE_FAST_ALLOCATED;
36 public:
37     WTF_EXPORT_PRIVATE Decoder(const uint8_t* buffer, size_t bufferSize);
38     WTF_EXPORT_PRIVATE ~Decoder();
39
40     size_t length() const { return m_bufferEnd - m_buffer; }
41     size_t currentOffset() const { return m_bufferPosition - m_buffer; }
42
43     WTF_EXPORT_PRIVATE bool verifyChecksum();
44
45     WTF_EXPORT_PRIVATE bool decodeFixedLengthData(uint8_t*, size_t);
46
47     WTF_EXPORT_PRIVATE bool decode(bool&);
48     WTF_EXPORT_PRIVATE bool decode(uint8_t&);
49     WTF_EXPORT_PRIVATE bool decode(uint16_t&);
50     WTF_EXPORT_PRIVATE bool decode(uint32_t&);
51     WTF_EXPORT_PRIVATE bool decode(uint64_t&);
52     WTF_EXPORT_PRIVATE bool decode(int32_t&);
53     WTF_EXPORT_PRIVATE bool decode(int64_t&);
54     WTF_EXPORT_PRIVATE bool decode(float&);
55     WTF_EXPORT_PRIVATE bool decode(double&);
56
57     template<typename T> bool decodeEnum(T& result)
58     {
59         static_assert(sizeof(T) <= 8, "Enum type T must not be larger than 64 bits!");
60
61         uint64_t value;
62         if (!decode(value))
63             return false;
64         
65         result = static_cast<T>(value);
66         return true;
67     }
68
69     template<typename T> bool decode(T& t)
70     {
71         return Coder<T>::decode(*this, t);
72     }
73
74     template<typename T>
75     bool bufferIsLargeEnoughToContain(size_t numElements) const
76     {
77         static_assert(std::is_arithmetic<T>::value, "Type T must have a fixed, known encoded size!");
78
79         if (numElements > std::numeric_limits<size_t>::max() / sizeof(T))
80             return false;
81
82         return bufferIsLargeEnoughToContain(numElements * sizeof(T));
83     }
84
85     static const bool isIPCDecoder = false;
86
87 private:
88     WTF_EXPORT_PRIVATE bool bufferIsLargeEnoughToContain(size_t) const;
89     template<typename Type> bool decodeNumber(Type&);
90
91     const uint8_t* m_buffer;
92     const uint8_t* m_bufferPosition;
93     const uint8_t* m_bufferEnd;
94
95     SHA1 m_sha1;
96 };
97
98
99 }
100