Coverage Report

Created: 2025-06-13 06:55

/work/snappy_ep-prefix/src/snappy_ep/snappy-sinksource.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2011 Google Inc. All Rights Reserved.
2
//
3
// Redistribution and use in source and binary forms, with or without
4
// modification, are permitted provided that the following conditions are
5
// met:
6
//
7
//     * Redistributions of source code must retain the above copyright
8
// notice, this list of conditions and the following disclaimer.
9
//     * Redistributions in binary form must reproduce the above
10
// copyright notice, this list of conditions and the following disclaimer
11
// in the documentation and/or other materials provided with the
12
// distribution.
13
//     * Neither the name of Google Inc. nor the names of its
14
// contributors may be used to endorse or promote products derived from
15
// this software without specific prior written permission.
16
//
17
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29
#ifndef THIRD_PARTY_SNAPPY_SNAPPY_SINKSOURCE_H_
30
#define THIRD_PARTY_SNAPPY_SNAPPY_SINKSOURCE_H_
31
32
#include <stddef.h>
33
34
namespace snappy {
35
36
// A Sink is an interface that consumes a sequence of bytes.
37
class Sink {
38
 public:
39
0
  Sink() { }
40
  virtual ~Sink();
41
42
  // Append "bytes[0,n-1]" to this.
43
  virtual void Append(const char* bytes, size_t n) = 0;
44
45
  // Returns a writable buffer of the specified length for appending.
46
  // May return a pointer to the caller-owned scratch buffer which
47
  // must have at least the indicated length.  The returned buffer is
48
  // only valid until the next operation on this Sink.
49
  //
50
  // After writing at most "length" bytes, call Append() with the
51
  // pointer returned from this function and the number of bytes
52
  // written.  Many Append() implementations will avoid copying
53
  // bytes if this function returned an internal buffer.
54
  //
55
  // If a non-scratch buffer is returned, the caller may only pass a
56
  // prefix of it to Append().  That is, it is not correct to pass an
57
  // interior pointer of the returned array to Append().
58
  //
59
  // The default implementation always returns the scratch buffer.
60
  virtual char* GetAppendBuffer(size_t length, char* scratch);
61
62
  // For higher performance, Sink implementations can provide custom
63
  // AppendAndTakeOwnership() and GetAppendBufferVariable() methods.
64
  // These methods can reduce the number of copies done during
65
  // compression/decompression.
66
67
  // Append "bytes[0,n-1] to the sink. Takes ownership of "bytes"
68
  // and calls the deleter function as (*deleter)(deleter_arg, bytes, n)
69
  // to free the buffer. deleter function must be non NULL.
70
  //
71
  // The default implementation just calls Append and frees "bytes".
72
  // Other implementations may avoid a copy while appending the buffer.
73
  virtual void AppendAndTakeOwnership(
74
      char* bytes, size_t n, void (*deleter)(void*, const char*, size_t),
75
      void *deleter_arg);
76
77
  // Returns a writable buffer for appending and writes the buffer's capacity to
78
  // *allocated_size. Guarantees *allocated_size >= min_size.
79
  // May return a pointer to the caller-owned scratch buffer which must have
80
  // scratch_size >= min_size.
81
  //
82
  // The returned buffer is only valid until the next operation
83
  // on this ByteSink.
84
  //
85
  // After writing at most *allocated_size bytes, call Append() with the
86
  // pointer returned from this function and the number of bytes written.
87
  // Many Append() implementations will avoid copying bytes if this function
88
  // returned an internal buffer.
89
  //
90
  // If the sink implementation allocates or reallocates an internal buffer,
91
  // it should use the desired_size_hint if appropriate. If a caller cannot
92
  // provide a reasonable guess at the desired capacity, it should set
93
  // desired_size_hint = 0.
94
  //
95
  // If a non-scratch buffer is returned, the caller may only pass
96
  // a prefix to it to Append(). That is, it is not correct to pass an
97
  // interior pointer to Append().
98
  //
99
  // The default implementation always returns the scratch buffer.
100
  virtual char* GetAppendBufferVariable(
101
      size_t min_size, size_t desired_size_hint, char* scratch,
102
      size_t scratch_size, size_t* allocated_size);
103
104
 private:
105
  // No copying
106
  Sink(const Sink&);
107
  void operator=(const Sink&);
108
};
109
110
// A Source is an interface that yields a sequence of bytes
111
class Source {
112
 public:
113
3.42k
  Source() { }
114
  virtual ~Source();
115
116
  // Return the number of bytes left to read from the source
117
  virtual size_t Available() const = 0;
118
119
  // Peek at the next flat region of the source.  Does not reposition
120
  // the source.  The returned region is empty iff Available()==0.
121
  //
122
  // Returns a pointer to the beginning of the region and store its
123
  // length in *len.
124
  //
125
  // The returned region is valid until the next call to Skip() or
126
  // until this object is destroyed, whichever occurs first.
127
  //
128
  // The returned region may be larger than Available() (for example
129
  // if this ByteSource is a view on a substring of a larger source).
130
  // The caller is responsible for ensuring that it only reads the
131
  // Available() bytes.
132
  virtual const char* Peek(size_t* len) = 0;
133
134
  // Skip the next n bytes.  Invalidates any buffer returned by
135
  // a previous call to Peek().
136
  // REQUIRES: Available() >= n
137
  virtual void Skip(size_t n) = 0;
138
139
 private:
140
  // No copying
141
  Source(const Source&);
142
  void operator=(const Source&);
143
};
144
145
// A Source implementation that yields the contents of a flat array
146
class ByteArraySource : public Source {
147
 public:
148
3.42k
  ByteArraySource(const char* p, size_t n) : ptr_(p), left_(n) { }
149
  ~ByteArraySource() override;
150
  size_t Available() const override;
151
  const char* Peek(size_t* len) override;
152
  void Skip(size_t n) override;
153
 private:
154
  const char* ptr_;
155
  size_t left_;
156
};
157
158
// A Sink implementation that writes to a flat array without any bound checks.
159
class UncheckedByteArraySink : public Sink {
160
 public:
161
0
  explicit UncheckedByteArraySink(char* dest) : dest_(dest) { }
162
  ~UncheckedByteArraySink() override;
163
  void Append(const char* data, size_t n) override;
164
  char* GetAppendBuffer(size_t len, char* scratch) override;
165
  char* GetAppendBufferVariable(
166
      size_t min_size, size_t desired_size_hint, char* scratch,
167
      size_t scratch_size, size_t* allocated_size) override;
168
  void AppendAndTakeOwnership(
169
      char* bytes, size_t n, void (*deleter)(void*, const char*, size_t),
170
      void *deleter_arg) override;
171
172
  // Return the current output pointer so that a caller can see how
173
  // many bytes were produced.
174
  // Note: this is not a Sink method.
175
0
  char* CurrentDestination() const { return dest_; }
176
 private:
177
  char* dest_;
178
};
179
180
}  // namespace snappy
181
182
#endif  // THIRD_PARTY_SNAPPY_SNAPPY_SINKSOURCE_H_