Update ANGLE
[WebKit-https.git] / Source / WebCore / platform / ThreadSafeDataBuffer.h
1 /*
2  * Copyright (C) 2015 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef ThreadSafeDataBuffer_h
27 #define ThreadSafeDataBuffer_h
28
29 #include <wtf/ThreadSafeRefCounted.h>
30 #include <wtf/Vector.h>
31
32 namespace WebCore {
33
34 class ThreadSafeDataBuffer;
35
36 class ThreadSafeDataBufferImpl : public ThreadSafeRefCounted<ThreadSafeDataBufferImpl> {
37 friend class ThreadSafeDataBuffer;
38 private:
39     enum AdoptVectorTag { AdoptVector };
40     ThreadSafeDataBufferImpl(Vector<uint8_t>& data, AdoptVectorTag)
41     {
42         m_data.swap(data);
43     }
44
45     ThreadSafeDataBufferImpl(const Vector<uint8_t>& data)
46         : m_data(data)
47     {
48     }
49
50     Vector<uint8_t> m_data;
51 };
52
53 class ThreadSafeDataBuffer {
54 public:
55     static ThreadSafeDataBuffer adoptVector(Vector<uint8_t>& data)
56     {
57         return ThreadSafeDataBuffer(data, ThreadSafeDataBufferImpl::AdoptVector);
58     }
59     
60     static ThreadSafeDataBuffer copyVector(const Vector<uint8_t>& data)
61     {
62         return ThreadSafeDataBuffer(data);
63     }
64
65     ThreadSafeDataBuffer()
66     {
67     }
68     
69     const Vector<uint8_t>* data() const
70     {
71         return m_impl ? &m_impl->m_data : nullptr;
72     }
73
74     template<class Encoder> void encode(Encoder&) const;
75     template<class Decoder> static bool decode(Decoder&, ThreadSafeDataBuffer&);
76
77 private:
78     explicit ThreadSafeDataBuffer(Vector<uint8_t>& data, ThreadSafeDataBufferImpl::AdoptVectorTag tag)
79     {
80         m_impl = adoptRef(new ThreadSafeDataBufferImpl(data, tag));
81     }
82
83     explicit ThreadSafeDataBuffer(const Vector<uint8_t>& data)
84     {
85         m_impl = adoptRef(new ThreadSafeDataBufferImpl(data));
86     }
87
88     RefPtr<ThreadSafeDataBufferImpl> m_impl;
89 };
90
91 template<class Encoder>
92 void ThreadSafeDataBuffer::encode(Encoder& encoder) const
93 {
94     bool hasData = m_impl;
95     encoder << hasData;
96
97     if (hasData)
98         encoder << m_impl->m_data;
99 }
100
101 template<class Decoder>
102 bool ThreadSafeDataBuffer::decode(Decoder& decoder, ThreadSafeDataBuffer& result)
103 {
104     bool hasData;
105     if (!decoder.decode(hasData))
106         return false;
107
108     if (hasData) {
109         Vector<uint8_t> data;
110         if (!decoder.decode(data))
111             return false;
112
113         result = ThreadSafeDataBuffer::adoptVector(data);
114     }
115
116     return true;
117 }
118
119 } // namespace WebCore
120
121 #endif // ThreadSafeDataBuffer_h