couchbase 3.0.0.alpha.1-universal-darwin-19 → 3.0.0.alpha.2-universal-darwin-19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests-6.0.3.yml +49 -0
  3. data/.github/workflows/tests.yml +47 -0
  4. data/.gitmodules +3 -0
  5. data/.idea/dictionaries/gem_terms.xml +5 -0
  6. data/.idea/inspectionProfiles/Project_Default.xml +1 -0
  7. data/.idea/vcs.xml +1 -0
  8. data/Gemfile +1 -0
  9. data/README.md +55 -2
  10. data/Rakefile +18 -0
  11. data/bin/init-cluster +62 -0
  12. data/bin/setup +1 -0
  13. data/couchbase.gemspec +3 -2
  14. data/examples/crud.rb +1 -2
  15. data/examples/managing_buckets.rb +47 -0
  16. data/examples/managing_collections.rb +58 -0
  17. data/examples/managing_query_indexes.rb +63 -0
  18. data/examples/query.rb +3 -2
  19. data/examples/query_with_consistency.rb +76 -0
  20. data/examples/subdocument.rb +23 -1
  21. data/ext/.clang-format +1 -1
  22. data/ext/.idea/dictionaries/couchbase_terms.xml +2 -0
  23. data/ext/.idea/vcs.xml +1 -0
  24. data/ext/CMakeLists.txt +30 -12
  25. data/ext/build_version.hxx.in +26 -0
  26. data/ext/couchbase/bucket.hxx +69 -8
  27. data/ext/couchbase/cluster.hxx +70 -54
  28. data/ext/couchbase/collections_manifest.hxx +3 -3
  29. data/ext/couchbase/configuration.hxx +14 -0
  30. data/ext/couchbase/couchbase.cxx +2044 -383
  31. data/ext/couchbase/{operations/document_id.hxx → document_id.hxx} +5 -4
  32. data/ext/couchbase/io/http_message.hxx +5 -1
  33. data/ext/couchbase/io/http_parser.hxx +2 -1
  34. data/ext/couchbase/io/http_session.hxx +6 -3
  35. data/ext/couchbase/io/{binary_message.hxx → mcbp_message.hxx} +15 -12
  36. data/ext/couchbase/io/mcbp_parser.hxx +99 -0
  37. data/ext/couchbase/io/{key_value_session.hxx → mcbp_session.hxx} +200 -95
  38. data/ext/couchbase/io/session_manager.hxx +37 -22
  39. data/ext/couchbase/mutation_token.hxx +2 -1
  40. data/ext/couchbase/operations.hxx +38 -8
  41. data/ext/couchbase/operations/bucket_create.hxx +138 -0
  42. data/ext/couchbase/operations/bucket_drop.hxx +65 -0
  43. data/ext/couchbase/operations/bucket_flush.hxx +65 -0
  44. data/ext/couchbase/operations/bucket_get.hxx +69 -0
  45. data/ext/couchbase/operations/bucket_get_all.hxx +62 -0
  46. data/ext/couchbase/operations/bucket_settings.hxx +111 -0
  47. data/ext/couchbase/operations/bucket_update.hxx +115 -0
  48. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +60 -0
  49. data/ext/couchbase/operations/collection_create.hxx +86 -0
  50. data/ext/couchbase/operations/collection_drop.hxx +82 -0
  51. data/ext/couchbase/operations/command.hxx +10 -10
  52. data/ext/couchbase/operations/document_decrement.hxx +80 -0
  53. data/ext/couchbase/operations/document_exists.hxx +80 -0
  54. data/ext/couchbase/operations/{get.hxx → document_get.hxx} +4 -2
  55. data/ext/couchbase/operations/document_get_and_lock.hxx +64 -0
  56. data/ext/couchbase/operations/document_get_and_touch.hxx +64 -0
  57. data/ext/couchbase/operations/document_increment.hxx +80 -0
  58. data/ext/couchbase/operations/document_insert.hxx +74 -0
  59. data/ext/couchbase/operations/{lookup_in.hxx → document_lookup_in.hxx} +2 -2
  60. data/ext/couchbase/operations/{mutate_in.hxx → document_mutate_in.hxx} +11 -2
  61. data/ext/couchbase/operations/{query.hxx → document_query.hxx} +101 -6
  62. data/ext/couchbase/operations/document_remove.hxx +67 -0
  63. data/ext/couchbase/operations/document_replace.hxx +76 -0
  64. data/ext/couchbase/operations/{upsert.hxx → document_touch.hxx} +14 -14
  65. data/ext/couchbase/operations/{remove.hxx → document_unlock.hxx} +12 -10
  66. data/ext/couchbase/operations/document_upsert.hxx +74 -0
  67. data/ext/couchbase/operations/query_index_build_deferred.hxx +85 -0
  68. data/ext/couchbase/operations/query_index_create.hxx +134 -0
  69. data/ext/couchbase/operations/query_index_drop.hxx +108 -0
  70. data/ext/couchbase/operations/query_index_get_all.hxx +106 -0
  71. data/ext/couchbase/operations/scope_create.hxx +81 -0
  72. data/ext/couchbase/operations/scope_drop.hxx +79 -0
  73. data/ext/couchbase/operations/scope_get_all.hxx +72 -0
  74. data/ext/couchbase/protocol/client_opcode.hxx +35 -0
  75. data/ext/couchbase/protocol/client_request.hxx +56 -9
  76. data/ext/couchbase/protocol/client_response.hxx +52 -15
  77. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +81 -0
  78. data/ext/couchbase/protocol/cmd_decrement.hxx +187 -0
  79. data/ext/couchbase/protocol/cmd_exists.hxx +171 -0
  80. data/ext/couchbase/protocol/cmd_get.hxx +31 -8
  81. data/ext/couchbase/protocol/cmd_get_and_lock.hxx +142 -0
  82. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +142 -0
  83. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +16 -3
  84. data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +16 -3
  85. data/ext/couchbase/protocol/cmd_get_error_map.hxx +16 -3
  86. data/ext/couchbase/protocol/cmd_hello.hxx +24 -8
  87. data/ext/couchbase/protocol/cmd_increment.hxx +187 -0
  88. data/ext/couchbase/protocol/cmd_info.hxx +1 -0
  89. data/ext/couchbase/protocol/cmd_insert.hxx +172 -0
  90. data/ext/couchbase/protocol/cmd_lookup_in.hxx +28 -13
  91. data/ext/couchbase/protocol/cmd_mutate_in.hxx +65 -13
  92. data/ext/couchbase/protocol/cmd_remove.hxx +59 -4
  93. data/ext/couchbase/protocol/cmd_replace.hxx +172 -0
  94. data/ext/couchbase/protocol/cmd_sasl_auth.hxx +15 -3
  95. data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +15 -3
  96. data/ext/couchbase/protocol/cmd_sasl_step.hxx +15 -3
  97. data/ext/couchbase/protocol/cmd_select_bucket.hxx +14 -2
  98. data/ext/couchbase/protocol/cmd_touch.hxx +102 -0
  99. data/ext/couchbase/protocol/cmd_unlock.hxx +95 -0
  100. data/ext/couchbase/protocol/cmd_upsert.hxx +50 -14
  101. data/ext/couchbase/protocol/durability_level.hxx +67 -0
  102. data/ext/couchbase/protocol/frame_info_id.hxx +187 -0
  103. data/ext/couchbase/protocol/hello_feature.hxx +137 -0
  104. data/ext/couchbase/protocol/server_opcode.hxx +57 -0
  105. data/ext/couchbase/protocol/server_request.hxx +122 -0
  106. data/ext/couchbase/protocol/unsigned_leb128.h +15 -15
  107. data/ext/couchbase/utils/byteswap.hxx +1 -2
  108. data/ext/couchbase/utils/url_codec.hxx +225 -0
  109. data/ext/couchbase/version.hxx +3 -1
  110. data/ext/extconf.rb +4 -1
  111. data/ext/test/main.cxx +37 -113
  112. data/ext/third_party/snappy/.appveyor.yml +36 -0
  113. data/ext/third_party/snappy/.gitignore +8 -0
  114. data/ext/third_party/snappy/.travis.yml +98 -0
  115. data/ext/third_party/snappy/AUTHORS +1 -0
  116. data/ext/third_party/snappy/CMakeLists.txt +345 -0
  117. data/ext/third_party/snappy/CONTRIBUTING.md +26 -0
  118. data/ext/third_party/snappy/COPYING +54 -0
  119. data/ext/third_party/snappy/NEWS +188 -0
  120. data/ext/third_party/snappy/README.md +148 -0
  121. data/ext/third_party/snappy/cmake/SnappyConfig.cmake.in +33 -0
  122. data/ext/third_party/snappy/cmake/config.h.in +59 -0
  123. data/ext/third_party/snappy/docs/README.md +72 -0
  124. data/ext/third_party/snappy/format_description.txt +110 -0
  125. data/ext/third_party/snappy/framing_format.txt +135 -0
  126. data/ext/third_party/snappy/snappy-c.cc +90 -0
  127. data/ext/third_party/snappy/snappy-c.h +138 -0
  128. data/ext/third_party/snappy/snappy-internal.h +315 -0
  129. data/ext/third_party/snappy/snappy-sinksource.cc +121 -0
  130. data/ext/third_party/snappy/snappy-sinksource.h +182 -0
  131. data/ext/third_party/snappy/snappy-stubs-internal.cc +42 -0
  132. data/ext/third_party/snappy/snappy-stubs-internal.h +493 -0
  133. data/ext/third_party/snappy/snappy-stubs-public.h.in +63 -0
  134. data/ext/third_party/snappy/snappy-test.cc +613 -0
  135. data/ext/third_party/snappy/snappy-test.h +526 -0
  136. data/ext/third_party/snappy/snappy.cc +1770 -0
  137. data/ext/third_party/snappy/snappy.h +209 -0
  138. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +60 -0
  139. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +58 -0
  140. data/ext/third_party/snappy/snappy_unittest.cc +1512 -0
  141. data/ext/third_party/snappy/testdata/alice29.txt +3609 -0
  142. data/ext/third_party/snappy/testdata/asyoulik.txt +4122 -0
  143. data/ext/third_party/snappy/testdata/baddata1.snappy +0 -0
  144. data/ext/third_party/snappy/testdata/baddata2.snappy +0 -0
  145. data/ext/third_party/snappy/testdata/baddata3.snappy +0 -0
  146. data/ext/third_party/snappy/testdata/fireworks.jpeg +0 -0
  147. data/ext/third_party/snappy/testdata/geo.protodata +0 -0
  148. data/ext/third_party/snappy/testdata/html +1 -0
  149. data/ext/third_party/snappy/testdata/html_x_4 +1 -0
  150. data/ext/third_party/snappy/testdata/kppkn.gtb +0 -0
  151. data/ext/third_party/snappy/testdata/lcet10.txt +7519 -0
  152. data/ext/third_party/snappy/testdata/paper-100k.pdf +600 -2
  153. data/ext/third_party/snappy/testdata/plrabn12.txt +10699 -0
  154. data/ext/third_party/snappy/testdata/urls.10K +10000 -0
  155. data/lib/couchbase/binary_collection.rb +33 -76
  156. data/lib/couchbase/binary_collection_options.rb +94 -0
  157. data/lib/couchbase/bucket.rb +9 -3
  158. data/lib/couchbase/cluster.rb +161 -23
  159. data/lib/couchbase/collection.rb +108 -191
  160. data/lib/couchbase/collection_options.rb +430 -0
  161. data/lib/couchbase/errors.rb +136 -134
  162. data/lib/couchbase/json_transcoder.rb +32 -0
  163. data/lib/couchbase/management/analytics_index_manager.rb +185 -9
  164. data/lib/couchbase/management/bucket_manager.rb +84 -33
  165. data/lib/couchbase/management/collection_manager.rb +166 -1
  166. data/lib/couchbase/management/query_index_manager.rb +261 -0
  167. data/lib/couchbase/management/search_index_manager.rb +291 -0
  168. data/lib/couchbase/management/user_manager.rb +12 -10
  169. data/lib/couchbase/management/view_index_manager.rb +151 -1
  170. data/lib/couchbase/mutation_state.rb +11 -1
  171. data/lib/couchbase/scope.rb +4 -4
  172. data/lib/couchbase/version.rb +1 -1
  173. metadata +113 -18
  174. data/.travis.yml +0 -7
  175. data/ext/couchbase/io/binary_parser.hxx +0 -64
  176. data/lib/couchbase/results.rb +0 -307
@@ -0,0 +1,121 @@
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
+ #include <stddef.h>
30
+ #include <cstring>
31
+
32
+ #include "snappy-sinksource.h"
33
+
34
+ namespace snappy {
35
+
36
+ Source::~Source() = default;
37
+
38
+ Sink::~Sink() = default;
39
+
40
+ char* Sink::GetAppendBuffer(size_t length, char* scratch) {
41
+ // TODO: Switch to [[maybe_unused]] when we can assume C++17.
42
+ (void)length;
43
+
44
+ return scratch;
45
+ }
46
+
47
+ char* Sink::GetAppendBufferVariable(
48
+ size_t min_size, size_t desired_size_hint, char* scratch,
49
+ size_t scratch_size, size_t* allocated_size) {
50
+ // TODO: Switch to [[maybe_unused]] when we can assume C++17.
51
+ (void)min_size;
52
+ (void)desired_size_hint;
53
+
54
+ *allocated_size = scratch_size;
55
+ return scratch;
56
+ }
57
+
58
+ void Sink::AppendAndTakeOwnership(
59
+ char* bytes, size_t n,
60
+ void (*deleter)(void*, const char*, size_t),
61
+ void *deleter_arg) {
62
+ Append(bytes, n);
63
+ (*deleter)(deleter_arg, bytes, n);
64
+ }
65
+
66
+ ByteArraySource::~ByteArraySource() = default;
67
+
68
+ size_t ByteArraySource::Available() const { return left_; }
69
+
70
+ const char* ByteArraySource::Peek(size_t* len) {
71
+ *len = left_;
72
+ return ptr_;
73
+ }
74
+
75
+ void ByteArraySource::Skip(size_t n) {
76
+ left_ -= n;
77
+ ptr_ += n;
78
+ }
79
+
80
+ UncheckedByteArraySink::~UncheckedByteArraySink() { }
81
+
82
+ void UncheckedByteArraySink::Append(const char* data, size_t n) {
83
+ // Do no copying if the caller filled in the result of GetAppendBuffer()
84
+ if (data != dest_) {
85
+ std::memcpy(dest_, data, n);
86
+ }
87
+ dest_ += n;
88
+ }
89
+
90
+ char* UncheckedByteArraySink::GetAppendBuffer(size_t len, char* scratch) {
91
+ // TODO: Switch to [[maybe_unused]] when we can assume C++17.
92
+ (void)len;
93
+ (void)scratch;
94
+
95
+ return dest_;
96
+ }
97
+
98
+ void UncheckedByteArraySink::AppendAndTakeOwnership(
99
+ char* bytes, size_t n,
100
+ void (*deleter)(void*, const char*, size_t),
101
+ void *deleter_arg) {
102
+ if (bytes != dest_) {
103
+ std::memcpy(dest_, bytes, n);
104
+ (*deleter)(deleter_arg, bytes, n);
105
+ }
106
+ dest_ += n;
107
+ }
108
+
109
+ char* UncheckedByteArraySink::GetAppendBufferVariable(
110
+ size_t min_size, size_t desired_size_hint, char* scratch,
111
+ size_t scratch_size, size_t* allocated_size) {
112
+ // TODO: Switch to [[maybe_unused]] when we can assume C++17.
113
+ (void)min_size;
114
+ (void)scratch;
115
+ (void)scratch_size;
116
+
117
+ *allocated_size = desired_size_hint;
118
+ return dest_;
119
+ }
120
+
121
+ } // namespace snappy
@@ -0,0 +1,182 @@
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
+ 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
+ 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
+ ByteArraySource(const char* p, size_t n) : ptr_(p), left_(n) { }
149
+ virtual ~ByteArraySource();
150
+ virtual size_t Available() const;
151
+ virtual const char* Peek(size_t* len);
152
+ virtual void Skip(size_t n);
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
+ explicit UncheckedByteArraySink(char* dest) : dest_(dest) { }
162
+ virtual ~UncheckedByteArraySink();
163
+ virtual void Append(const char* data, size_t n);
164
+ virtual char* GetAppendBuffer(size_t len, char* scratch);
165
+ virtual char* GetAppendBufferVariable(
166
+ size_t min_size, size_t desired_size_hint, char* scratch,
167
+ size_t scratch_size, size_t* allocated_size);
168
+ virtual void AppendAndTakeOwnership(
169
+ char* bytes, size_t n, void (*deleter)(void*, const char*, size_t),
170
+ void *deleter_arg);
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
+ char* CurrentDestination() const { return dest_; }
176
+ private:
177
+ char* dest_;
178
+ };
179
+
180
+ } // namespace snappy
181
+
182
+ #endif // THIRD_PARTY_SNAPPY_SNAPPY_SINKSOURCE_H_
@@ -0,0 +1,42 @@
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
+ #include <algorithm>
30
+ #include <string>
31
+
32
+ #include "snappy-stubs-internal.h"
33
+
34
+ namespace snappy {
35
+
36
+ void Varint::Append32(std::string* s, uint32_t value) {
37
+ char buf[Varint::kMax32];
38
+ const char* p = Varint::Encode32(buf, value);
39
+ s->append(buf, p - buf);
40
+ }
41
+
42
+ } // namespace snappy
@@ -0,0 +1,493 @@
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
+ // Various stubs for the open-source version of Snappy.
30
+
31
+ #ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_
32
+ #define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_
33
+
34
+ #ifdef HAVE_CONFIG_H
35
+ #include "config.h"
36
+ #endif
37
+
38
+ #include <stdint.h>
39
+
40
+ #include <cassert>
41
+ #include <cstdlib>
42
+ #include <cstring>
43
+ #include <limits>
44
+ #include <string>
45
+
46
+ #ifdef HAVE_SYS_MMAN_H
47
+ #include <sys/mman.h>
48
+ #endif
49
+
50
+ #ifdef HAVE_UNISTD_H
51
+ #include <unistd.h>
52
+ #endif
53
+
54
+ #if defined(_MSC_VER)
55
+ #include <intrin.h>
56
+ #endif // defined(_MSC_VER)
57
+
58
+ #ifndef __has_feature
59
+ #define __has_feature(x) 0
60
+ #endif
61
+
62
+ #if __has_feature(memory_sanitizer)
63
+ #include <sanitizer/msan_interface.h>
64
+ #define SNAPPY_ANNOTATE_MEMORY_IS_INITIALIZED(address, size) \
65
+ __msan_unpoison((address), (size))
66
+ #else
67
+ #define SNAPPY_ANNOTATE_MEMORY_IS_INITIALIZED(address, size) /* empty */
68
+ #endif // __has_feature(memory_sanitizer)
69
+
70
+ #include "snappy-stubs-public.h"
71
+
72
+ // Used to enable 64-bit optimized versions of some routines.
73
+ #if defined(__x86_64__) || defined(_M_X64)
74
+ #define ARCH_K8 1
75
+ #elif defined(__PPC64__) || defined(__powerpc64__)
76
+ #define ARCH_PPC 1
77
+ #elif defined(__aarch64__) || defined(_M_ARM64)
78
+ #define ARCH_ARM 1
79
+ #endif
80
+
81
+ // Needed by OS X, among others.
82
+ #ifndef MAP_ANONYMOUS
83
+ #define MAP_ANONYMOUS MAP_ANON
84
+ #endif
85
+
86
+ // The size of an array, if known at compile-time.
87
+ // Will give unexpected results if used on a pointer.
88
+ // We undefine it first, since some compilers already have a definition.
89
+ #ifdef ARRAYSIZE
90
+ #undef ARRAYSIZE
91
+ #endif
92
+ #define ARRAYSIZE(a) int{sizeof(a) / sizeof(*(a))}
93
+
94
+ // Static prediction hints.
95
+ #ifdef HAVE_BUILTIN_EXPECT
96
+ #define SNAPPY_PREDICT_FALSE(x) (__builtin_expect(x, 0))
97
+ #define SNAPPY_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
98
+ #else
99
+ #define SNAPPY_PREDICT_FALSE(x) x
100
+ #define SNAPPY_PREDICT_TRUE(x) x
101
+ #endif
102
+
103
+ // Inlining hints.
104
+ #ifdef HAVE_ATTRIBUTE_ALWAYS_INLINE
105
+ #define SNAPPY_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline))
106
+ #else
107
+ #define SNAPPY_ATTRIBUTE_ALWAYS_INLINE
108
+ #endif
109
+
110
+ // This is only used for recomputing the tag byte table used during
111
+ // decompression; for simplicity we just remove it from the open-source
112
+ // version (anyone who wants to regenerate it can just do the call
113
+ // themselves within main()).
114
+ #define DEFINE_bool(flag_name, default_value, description) \
115
+ bool FLAGS_ ## flag_name = default_value
116
+ #define DECLARE_bool(flag_name) \
117
+ extern bool FLAGS_ ## flag_name
118
+
119
+ namespace snappy {
120
+
121
+ static const uint32_t kuint32max = std::numeric_limits<uint32_t>::max();
122
+ static const int64_t kint64max = std::numeric_limits<int64_t>::max();
123
+
124
+ // Potentially unaligned loads and stores.
125
+
126
+ inline uint16_t UNALIGNED_LOAD16(const void *p) {
127
+ // Compiles to a single movzx/ldrh on clang/gcc/msvc.
128
+ uint16_t v;
129
+ std::memcpy(&v, p, sizeof(v));
130
+ return v;
131
+ }
132
+
133
+ inline uint32_t UNALIGNED_LOAD32(const void *p) {
134
+ // Compiles to a single mov/ldr on clang/gcc/msvc.
135
+ uint32_t v;
136
+ std::memcpy(&v, p, sizeof(v));
137
+ return v;
138
+ }
139
+
140
+ inline uint64_t UNALIGNED_LOAD64(const void *p) {
141
+ // Compiles to a single mov/ldr on clang/gcc/msvc.
142
+ uint64_t v;
143
+ std::memcpy(&v, p, sizeof(v));
144
+ return v;
145
+ }
146
+
147
+ inline void UNALIGNED_STORE16(void *p, uint16_t v) {
148
+ // Compiles to a single mov/strh on clang/gcc/msvc.
149
+ std::memcpy(p, &v, sizeof(v));
150
+ }
151
+
152
+ inline void UNALIGNED_STORE32(void *p, uint32_t v) {
153
+ // Compiles to a single mov/str on clang/gcc/msvc.
154
+ std::memcpy(p, &v, sizeof(v));
155
+ }
156
+
157
+ inline void UNALIGNED_STORE64(void *p, uint64_t v) {
158
+ // Compiles to a single mov/str on clang/gcc/msvc.
159
+ std::memcpy(p, &v, sizeof(v));
160
+ }
161
+
162
+ // Convert to little-endian storage, opposite of network format.
163
+ // Convert x from host to little endian: x = LittleEndian.FromHost(x);
164
+ // convert x from little endian to host: x = LittleEndian.ToHost(x);
165
+ //
166
+ // Store values into unaligned memory converting to little endian order:
167
+ // LittleEndian.Store16(p, x);
168
+ //
169
+ // Load unaligned values stored in little endian converting to host order:
170
+ // x = LittleEndian.Load16(p);
171
+ class LittleEndian {
172
+ public:
173
+ // Functions to do unaligned loads and stores in little-endian order.
174
+ static inline uint16_t Load16(const void *ptr) {
175
+ const uint8_t* const buffer = reinterpret_cast<const uint8_t*>(ptr);
176
+
177
+ // Compiles to a single mov/str on recent clang and gcc.
178
+ return (static_cast<uint16_t>(buffer[0])) |
179
+ (static_cast<uint16_t>(buffer[1]) << 8);
180
+ }
181
+
182
+ static inline uint32_t Load32(const void *ptr) {
183
+ const uint8_t* const buffer = reinterpret_cast<const uint8_t*>(ptr);
184
+
185
+ // Compiles to a single mov/str on recent clang and gcc.
186
+ return (static_cast<uint32_t>(buffer[0])) |
187
+ (static_cast<uint32_t>(buffer[1]) << 8) |
188
+ (static_cast<uint32_t>(buffer[2]) << 16) |
189
+ (static_cast<uint32_t>(buffer[3]) << 24);
190
+ }
191
+
192
+ static inline uint64_t Load64(const void *ptr) {
193
+ const uint8_t* const buffer = reinterpret_cast<const uint8_t*>(ptr);
194
+
195
+ // Compiles to a single mov/str on recent clang and gcc.
196
+ return (static_cast<uint64_t>(buffer[0])) |
197
+ (static_cast<uint64_t>(buffer[1]) << 8) |
198
+ (static_cast<uint64_t>(buffer[2]) << 16) |
199
+ (static_cast<uint64_t>(buffer[3]) << 24) |
200
+ (static_cast<uint64_t>(buffer[4]) << 32) |
201
+ (static_cast<uint64_t>(buffer[5]) << 40) |
202
+ (static_cast<uint64_t>(buffer[6]) << 48) |
203
+ (static_cast<uint64_t>(buffer[7]) << 56);
204
+ }
205
+
206
+ static inline void Store16(void *dst, uint16_t value) {
207
+ uint8_t* const buffer = reinterpret_cast<uint8_t*>(dst);
208
+
209
+ // Compiles to a single mov/str on recent clang and gcc.
210
+ buffer[0] = static_cast<uint8_t>(value);
211
+ buffer[1] = static_cast<uint8_t>(value >> 8);
212
+ }
213
+
214
+ static void Store32(void *dst, uint32_t value) {
215
+ uint8_t* const buffer = reinterpret_cast<uint8_t*>(dst);
216
+
217
+ // Compiles to a single mov/str on recent clang and gcc.
218
+ buffer[0] = static_cast<uint8_t>(value);
219
+ buffer[1] = static_cast<uint8_t>(value >> 8);
220
+ buffer[2] = static_cast<uint8_t>(value >> 16);
221
+ buffer[3] = static_cast<uint8_t>(value >> 24);
222
+ }
223
+
224
+ static void Store64(void* dst, uint64_t value) {
225
+ uint8_t* const buffer = reinterpret_cast<uint8_t*>(dst);
226
+
227
+ // Compiles to a single mov/str on recent clang and gcc.
228
+ buffer[0] = static_cast<uint8_t>(value);
229
+ buffer[1] = static_cast<uint8_t>(value >> 8);
230
+ buffer[2] = static_cast<uint8_t>(value >> 16);
231
+ buffer[3] = static_cast<uint8_t>(value >> 24);
232
+ buffer[4] = static_cast<uint8_t>(value >> 32);
233
+ buffer[5] = static_cast<uint8_t>(value >> 40);
234
+ buffer[6] = static_cast<uint8_t>(value >> 48);
235
+ buffer[7] = static_cast<uint8_t>(value >> 56);
236
+ }
237
+
238
+ static inline constexpr bool IsLittleEndian() {
239
+ #if defined(SNAPPY_IS_BIG_ENDIAN)
240
+ return false;
241
+ #else
242
+ return true;
243
+ #endif // defined(SNAPPY_IS_BIG_ENDIAN)
244
+ }
245
+ };
246
+
247
+ // Some bit-manipulation functions.
248
+ class Bits {
249
+ public:
250
+ // Return floor(log2(n)) for positive integer n.
251
+ static int Log2FloorNonZero(uint32_t n);
252
+
253
+ // Return floor(log2(n)) for positive integer n. Returns -1 iff n == 0.
254
+ static int Log2Floor(uint32_t n);
255
+
256
+ // Return the first set least / most significant bit, 0-indexed. Returns an
257
+ // undefined value if n == 0. FindLSBSetNonZero() is similar to ffs() except
258
+ // that it's 0-indexed.
259
+ static int FindLSBSetNonZero(uint32_t n);
260
+
261
+ static int FindLSBSetNonZero64(uint64_t n);
262
+
263
+ private:
264
+ // No copying
265
+ Bits(const Bits&);
266
+ void operator=(const Bits&);
267
+ };
268
+
269
+ #if defined(HAVE_BUILTIN_CTZ)
270
+
271
+ inline int Bits::Log2FloorNonZero(uint32_t n) {
272
+ assert(n != 0);
273
+ // (31 ^ x) is equivalent to (31 - x) for x in [0, 31]. An easy proof
274
+ // represents subtraction in base 2 and observes that there's no carry.
275
+ //
276
+ // GCC and Clang represent __builtin_clz on x86 as 31 ^ _bit_scan_reverse(x).
277
+ // Using "31 ^" here instead of "31 -" allows the optimizer to strip the
278
+ // function body down to _bit_scan_reverse(x).
279
+ return 31 ^ __builtin_clz(n);
280
+ }
281
+
282
+ inline int Bits::Log2Floor(uint32_t n) {
283
+ return (n == 0) ? -1 : Bits::Log2FloorNonZero(n);
284
+ }
285
+
286
+ inline int Bits::FindLSBSetNonZero(uint32_t n) {
287
+ assert(n != 0);
288
+ return __builtin_ctz(n);
289
+ }
290
+
291
+ #elif defined(_MSC_VER)
292
+
293
+ inline int Bits::Log2FloorNonZero(uint32_t n) {
294
+ assert(n != 0);
295
+ // NOLINTNEXTLINE(runtime/int): The MSVC intrinsic demands unsigned long.
296
+ unsigned long where;
297
+ _BitScanReverse(&where, n);
298
+ return static_cast<int>(where);
299
+ }
300
+
301
+ inline int Bits::Log2Floor(uint32_t n) {
302
+ // NOLINTNEXTLINE(runtime/int): The MSVC intrinsic demands unsigned long.
303
+ unsigned long where;
304
+ if (_BitScanReverse(&where, n))
305
+ return static_cast<int>(where);
306
+ return -1;
307
+ }
308
+
309
+ inline int Bits::FindLSBSetNonZero(uint32_t n) {
310
+ assert(n != 0);
311
+ // NOLINTNEXTLINE(runtime/int): The MSVC intrinsic demands unsigned long.
312
+ unsigned long where;
313
+ if (_BitScanForward(&where, n))
314
+ return static_cast<int>(where);
315
+ return 32;
316
+ }
317
+
318
+ #else // Portable versions.
319
+
320
+ inline int Bits::Log2FloorNonZero(uint32_t n) {
321
+ assert(n != 0);
322
+
323
+ int log = 0;
324
+ uint32_t value = n;
325
+ for (int i = 4; i >= 0; --i) {
326
+ int shift = (1 << i);
327
+ uint32_t x = value >> shift;
328
+ if (x != 0) {
329
+ value = x;
330
+ log += shift;
331
+ }
332
+ }
333
+ assert(value == 1);
334
+ return log;
335
+ }
336
+
337
+ inline int Bits::Log2Floor(uint32_t n) {
338
+ return (n == 0) ? -1 : Bits::Log2FloorNonZero(n);
339
+ }
340
+
341
+ inline int Bits::FindLSBSetNonZero(uint32_t n) {
342
+ assert(n != 0);
343
+
344
+ int rc = 31;
345
+ for (int i = 4, shift = 1 << 4; i >= 0; --i) {
346
+ const uint32_t x = n << shift;
347
+ if (x != 0) {
348
+ n = x;
349
+ rc -= shift;
350
+ }
351
+ shift >>= 1;
352
+ }
353
+ return rc;
354
+ }
355
+
356
+ #endif // End portable versions.
357
+
358
+ #if defined(HAVE_BUILTIN_CTZ)
359
+
360
+ inline int Bits::FindLSBSetNonZero64(uint64_t n) {
361
+ assert(n != 0);
362
+ return __builtin_ctzll(n);
363
+ }
364
+
365
+ #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
366
+ // _BitScanForward64() is only available on x64 and ARM64.
367
+
368
+ inline int Bits::FindLSBSetNonZero64(uint64_t n) {
369
+ assert(n != 0);
370
+ // NOLINTNEXTLINE(runtime/int): The MSVC intrinsic demands unsigned long.
371
+ unsigned long where;
372
+ if (_BitScanForward64(&where, n))
373
+ return static_cast<int>(where);
374
+ return 64;
375
+ }
376
+
377
+ #else // Portable version.
378
+
379
+ // FindLSBSetNonZero64() is defined in terms of FindLSBSetNonZero().
380
+ inline int Bits::FindLSBSetNonZero64(uint64_t n) {
381
+ assert(n != 0);
382
+
383
+ const uint32_t bottombits = static_cast<uint32_t>(n);
384
+ if (bottombits == 0) {
385
+ // Bottom bits are zero, so scan the top bits.
386
+ return 32 + FindLSBSetNonZero(static_cast<uint32_t>(n >> 32));
387
+ } else {
388
+ return FindLSBSetNonZero(bottombits);
389
+ }
390
+ }
391
+
392
+ #endif // End portable version.
393
+
394
+ // Variable-length integer encoding.
395
+ class Varint {
396
+ public:
397
+ // Maximum lengths of varint encoding of uint32_t.
398
+ static const int kMax32 = 5;
399
+
400
+ // Attempts to parse a varint32 from a prefix of the bytes in [ptr,limit-1].
401
+ // Never reads a character at or beyond limit. If a valid/terminated varint32
402
+ // was found in the range, stores it in *OUTPUT and returns a pointer just
403
+ // past the last byte of the varint32. Else returns NULL. On success,
404
+ // "result <= limit".
405
+ static const char* Parse32WithLimit(const char* ptr, const char* limit,
406
+ uint32_t* OUTPUT);
407
+
408
+ // REQUIRES "ptr" points to a buffer of length sufficient to hold "v".
409
+ // EFFECTS Encodes "v" into "ptr" and returns a pointer to the
410
+ // byte just past the last encoded byte.
411
+ static char* Encode32(char* ptr, uint32_t v);
412
+
413
+ // EFFECTS Appends the varint representation of "value" to "*s".
414
+ static void Append32(std::string* s, uint32_t value);
415
+ };
416
+
417
+ inline const char* Varint::Parse32WithLimit(const char* p,
418
+ const char* l,
419
+ uint32_t* OUTPUT) {
420
+ const unsigned char* ptr = reinterpret_cast<const unsigned char*>(p);
421
+ const unsigned char* limit = reinterpret_cast<const unsigned char*>(l);
422
+ uint32_t b, result;
423
+ if (ptr >= limit) return NULL;
424
+ b = *(ptr++); result = b & 127; if (b < 128) goto done;
425
+ if (ptr >= limit) return NULL;
426
+ b = *(ptr++); result |= (b & 127) << 7; if (b < 128) goto done;
427
+ if (ptr >= limit) return NULL;
428
+ b = *(ptr++); result |= (b & 127) << 14; if (b < 128) goto done;
429
+ if (ptr >= limit) return NULL;
430
+ b = *(ptr++); result |= (b & 127) << 21; if (b < 128) goto done;
431
+ if (ptr >= limit) return NULL;
432
+ b = *(ptr++); result |= (b & 127) << 28; if (b < 16) goto done;
433
+ return NULL; // Value is too long to be a varint32
434
+ done:
435
+ *OUTPUT = result;
436
+ return reinterpret_cast<const char*>(ptr);
437
+ }
438
+
439
+ inline char* Varint::Encode32(char* sptr, uint32_t v) {
440
+ // Operate on characters as unsigneds
441
+ uint8_t* ptr = reinterpret_cast<uint8_t*>(sptr);
442
+ static const uint8_t B = 128;
443
+ if (v < (1 << 7)) {
444
+ *(ptr++) = static_cast<uint8_t>(v);
445
+ } else if (v < (1 << 14)) {
446
+ *(ptr++) = static_cast<uint8_t>(v | B);
447
+ *(ptr++) = static_cast<uint8_t>(v >> 7);
448
+ } else if (v < (1 << 21)) {
449
+ *(ptr++) = static_cast<uint8_t>(v | B);
450
+ *(ptr++) = static_cast<uint8_t>((v >> 7) | B);
451
+ *(ptr++) = static_cast<uint8_t>(v >> 14);
452
+ } else if (v < (1 << 28)) {
453
+ *(ptr++) = static_cast<uint8_t>(v | B);
454
+ *(ptr++) = static_cast<uint8_t>((v >> 7) | B);
455
+ *(ptr++) = static_cast<uint8_t>((v >> 14) | B);
456
+ *(ptr++) = static_cast<uint8_t>(v >> 21);
457
+ } else {
458
+ *(ptr++) = static_cast<uint8_t>(v | B);
459
+ *(ptr++) = static_cast<uint8_t>((v>>7) | B);
460
+ *(ptr++) = static_cast<uint8_t>((v>>14) | B);
461
+ *(ptr++) = static_cast<uint8_t>((v>>21) | B);
462
+ *(ptr++) = static_cast<uint8_t>(v >> 28);
463
+ }
464
+ return reinterpret_cast<char*>(ptr);
465
+ }
466
+
467
+ // If you know the internal layout of the std::string in use, you can
468
+ // replace this function with one that resizes the string without
469
+ // filling the new space with zeros (if applicable) --
470
+ // it will be non-portable but faster.
471
+ inline void STLStringResizeUninitialized(std::string* s, size_t new_size) {
472
+ s->resize(new_size);
473
+ }
474
+
475
+ // Return a mutable char* pointing to a string's internal buffer,
476
+ // which may not be null-terminated. Writing through this pointer will
477
+ // modify the string.
478
+ //
479
+ // string_as_array(&str)[i] is valid for 0 <= i < str.size() until the
480
+ // next call to a string method that invalidates iterators.
481
+ //
482
+ // As of 2006-04, there is no standard-blessed way of getting a
483
+ // mutable reference to a string's internal buffer. However, issue 530
484
+ // (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#530)
485
+ // proposes this as the method. It will officially be part of the standard
486
+ // for C++0x. This should already work on all current implementations.
487
+ inline char* string_as_array(std::string* str) {
488
+ return str->empty() ? NULL : &*str->begin();
489
+ }
490
+
491
+ } // namespace snappy
492
+
493
+ #endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_