filiptepper-leveldb-ruby 0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. data/LICENSE +24 -0
  2. data/README +72 -0
  3. data/ext/leveldb/extconf.rb +14 -0
  4. data/ext/leveldb/leveldb.cc +530 -0
  5. data/ext/leveldb/platform.rb +83 -0
  6. data/leveldb/Makefile +191 -0
  7. data/leveldb/build_detect_platform +160 -0
  8. data/leveldb/db/builder.cc +88 -0
  9. data/leveldb/db/builder.h +34 -0
  10. data/leveldb/db/c.cc +581 -0
  11. data/leveldb/db/corruption_test.cc +359 -0
  12. data/leveldb/db/db_bench.cc +970 -0
  13. data/leveldb/db/db_impl.cc +1448 -0
  14. data/leveldb/db/db_impl.h +194 -0
  15. data/leveldb/db/db_iter.cc +299 -0
  16. data/leveldb/db/db_iter.h +26 -0
  17. data/leveldb/db/db_test.cc +1901 -0
  18. data/leveldb/db/dbformat.cc +140 -0
  19. data/leveldb/db/dbformat.h +227 -0
  20. data/leveldb/db/dbformat_test.cc +112 -0
  21. data/leveldb/db/filename.cc +139 -0
  22. data/leveldb/db/filename.h +80 -0
  23. data/leveldb/db/filename_test.cc +122 -0
  24. data/leveldb/db/log_format.h +35 -0
  25. data/leveldb/db/log_reader.cc +259 -0
  26. data/leveldb/db/log_reader.h +108 -0
  27. data/leveldb/db/log_test.cc +500 -0
  28. data/leveldb/db/log_writer.cc +103 -0
  29. data/leveldb/db/log_writer.h +48 -0
  30. data/leveldb/db/memtable.cc +145 -0
  31. data/leveldb/db/memtable.h +91 -0
  32. data/leveldb/db/repair.cc +389 -0
  33. data/leveldb/db/skiplist.h +379 -0
  34. data/leveldb/db/skiplist_test.cc +378 -0
  35. data/leveldb/db/snapshot.h +66 -0
  36. data/leveldb/db/table_cache.cc +121 -0
  37. data/leveldb/db/table_cache.h +61 -0
  38. data/leveldb/db/version_edit.cc +266 -0
  39. data/leveldb/db/version_edit.h +107 -0
  40. data/leveldb/db/version_edit_test.cc +46 -0
  41. data/leveldb/db/version_set.cc +1402 -0
  42. data/leveldb/db/version_set.h +370 -0
  43. data/leveldb/db/version_set_test.cc +179 -0
  44. data/leveldb/db/write_batch.cc +147 -0
  45. data/leveldb/db/write_batch_internal.h +49 -0
  46. data/leveldb/db/write_batch_test.cc +120 -0
  47. data/leveldb/helpers/memenv/memenv.cc +374 -0
  48. data/leveldb/helpers/memenv/memenv.h +20 -0
  49. data/leveldb/helpers/memenv/memenv_test.cc +232 -0
  50. data/leveldb/include/leveldb/c.h +275 -0
  51. data/leveldb/include/leveldb/cache.h +99 -0
  52. data/leveldb/include/leveldb/comparator.h +63 -0
  53. data/leveldb/include/leveldb/db.h +161 -0
  54. data/leveldb/include/leveldb/env.h +323 -0
  55. data/leveldb/include/leveldb/filter_policy.h +70 -0
  56. data/leveldb/include/leveldb/iterator.h +100 -0
  57. data/leveldb/include/leveldb/options.h +195 -0
  58. data/leveldb/include/leveldb/slice.h +109 -0
  59. data/leveldb/include/leveldb/status.h +106 -0
  60. data/leveldb/include/leveldb/table.h +85 -0
  61. data/leveldb/include/leveldb/table_builder.h +92 -0
  62. data/leveldb/include/leveldb/write_batch.h +64 -0
  63. data/leveldb/port/atomic_pointer.h +144 -0
  64. data/leveldb/port/port.h +21 -0
  65. data/leveldb/port/port_android.cc +64 -0
  66. data/leveldb/port/port_android.h +159 -0
  67. data/leveldb/port/port_example.h +125 -0
  68. data/leveldb/port/port_posix.cc +50 -0
  69. data/leveldb/port/port_posix.h +129 -0
  70. data/leveldb/port/win/stdint.h +24 -0
  71. data/leveldb/table/block.cc +267 -0
  72. data/leveldb/table/block.h +44 -0
  73. data/leveldb/table/block_builder.cc +109 -0
  74. data/leveldb/table/block_builder.h +57 -0
  75. data/leveldb/table/filter_block.cc +111 -0
  76. data/leveldb/table/filter_block.h +68 -0
  77. data/leveldb/table/filter_block_test.cc +128 -0
  78. data/leveldb/table/format.cc +145 -0
  79. data/leveldb/table/format.h +108 -0
  80. data/leveldb/table/iterator.cc +67 -0
  81. data/leveldb/table/iterator_wrapper.h +63 -0
  82. data/leveldb/table/merger.cc +197 -0
  83. data/leveldb/table/merger.h +26 -0
  84. data/leveldb/table/table.cc +276 -0
  85. data/leveldb/table/table_builder.cc +270 -0
  86. data/leveldb/table/table_test.cc +838 -0
  87. data/leveldb/table/two_level_iterator.cc +182 -0
  88. data/leveldb/table/two_level_iterator.h +34 -0
  89. data/leveldb/util/arena.cc +68 -0
  90. data/leveldb/util/arena.h +68 -0
  91. data/leveldb/util/arena_test.cc +68 -0
  92. data/leveldb/util/bloom.cc +95 -0
  93. data/leveldb/util/bloom_test.cc +159 -0
  94. data/leveldb/util/cache.cc +328 -0
  95. data/leveldb/util/cache_test.cc +186 -0
  96. data/leveldb/util/coding.cc +194 -0
  97. data/leveldb/util/coding.h +104 -0
  98. data/leveldb/util/coding_test.cc +173 -0
  99. data/leveldb/util/comparator.cc +76 -0
  100. data/leveldb/util/crc32c.cc +332 -0
  101. data/leveldb/util/crc32c.h +45 -0
  102. data/leveldb/util/crc32c_test.cc +72 -0
  103. data/leveldb/util/env.cc +96 -0
  104. data/leveldb/util/env_posix.cc +609 -0
  105. data/leveldb/util/env_test.cc +104 -0
  106. data/leveldb/util/filter_policy.cc +11 -0
  107. data/leveldb/util/hash.cc +45 -0
  108. data/leveldb/util/hash.h +19 -0
  109. data/leveldb/util/histogram.cc +139 -0
  110. data/leveldb/util/histogram.h +42 -0
  111. data/leveldb/util/logging.cc +81 -0
  112. data/leveldb/util/logging.h +47 -0
  113. data/leveldb/util/mutexlock.h +39 -0
  114. data/leveldb/util/options.cc +29 -0
  115. data/leveldb/util/posix_logger.h +98 -0
  116. data/leveldb/util/random.h +59 -0
  117. data/leveldb/util/status.cc +75 -0
  118. data/leveldb/util/testharness.cc +77 -0
  119. data/leveldb/util/testharness.h +138 -0
  120. data/leveldb/util/testutil.cc +51 -0
  121. data/leveldb/util/testutil.h +53 -0
  122. data/lib/leveldb.rb +76 -0
  123. metadata +175 -0
@@ -0,0 +1,173 @@
1
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
4
+
5
+ #include "util/coding.h"
6
+
7
+ #include "util/testharness.h"
8
+
9
+ namespace leveldb {
10
+
11
+ class Coding { };
12
+
13
+ TEST(Coding, Fixed32) {
14
+ std::string s;
15
+ for (uint32_t v = 0; v < 100000; v++) {
16
+ PutFixed32(&s, v);
17
+ }
18
+
19
+ const char* p = s.data();
20
+ for (uint32_t v = 0; v < 100000; v++) {
21
+ uint32_t actual = DecodeFixed32(p);
22
+ ASSERT_EQ(v, actual);
23
+ p += sizeof(uint32_t);
24
+ }
25
+ }
26
+
27
+ TEST(Coding, Fixed64) {
28
+ std::string s;
29
+ for (int power = 0; power <= 63; power++) {
30
+ uint64_t v = static_cast<uint64_t>(1) << power;
31
+ PutFixed64(&s, v - 1);
32
+ PutFixed64(&s, v + 0);
33
+ PutFixed64(&s, v + 1);
34
+ }
35
+
36
+ const char* p = s.data();
37
+ for (int power = 0; power <= 63; power++) {
38
+ uint64_t v = static_cast<uint64_t>(1) << power;
39
+ uint64_t actual;
40
+ actual = DecodeFixed64(p);
41
+ ASSERT_EQ(v-1, actual);
42
+ p += sizeof(uint64_t);
43
+
44
+ actual = DecodeFixed64(p);
45
+ ASSERT_EQ(v+0, actual);
46
+ p += sizeof(uint64_t);
47
+
48
+ actual = DecodeFixed64(p);
49
+ ASSERT_EQ(v+1, actual);
50
+ p += sizeof(uint64_t);
51
+ }
52
+ }
53
+
54
+ TEST(Coding, Varint32) {
55
+ std::string s;
56
+ for (uint32_t i = 0; i < (32 * 32); i++) {
57
+ uint32_t v = (i / 32) << (i % 32);
58
+ PutVarint32(&s, v);
59
+ }
60
+
61
+ const char* p = s.data();
62
+ const char* limit = p + s.size();
63
+ for (uint32_t i = 0; i < (32 * 32); i++) {
64
+ uint32_t expected = (i / 32) << (i % 32);
65
+ uint32_t actual;
66
+ const char* start = p;
67
+ p = GetVarint32Ptr(p, limit, &actual);
68
+ ASSERT_TRUE(p != NULL);
69
+ ASSERT_EQ(expected, actual);
70
+ ASSERT_EQ(VarintLength(actual), p - start);
71
+ }
72
+ ASSERT_EQ(p, s.data() + s.size());
73
+ }
74
+
75
+ TEST(Coding, Varint64) {
76
+ // Construct the list of values to check
77
+ std::vector<uint64_t> values;
78
+ // Some special values
79
+ values.push_back(0);
80
+ values.push_back(100);
81
+ values.push_back(~static_cast<uint64_t>(0));
82
+ values.push_back(~static_cast<uint64_t>(0) - 1);
83
+ for (uint32_t k = 0; k < 64; k++) {
84
+ // Test values near powers of two
85
+ const uint64_t power = 1ull << k;
86
+ values.push_back(power);
87
+ values.push_back(power-1);
88
+ values.push_back(power+1);
89
+ };
90
+
91
+ std::string s;
92
+ for (int i = 0; i < values.size(); i++) {
93
+ PutVarint64(&s, values[i]);
94
+ }
95
+
96
+ const char* p = s.data();
97
+ const char* limit = p + s.size();
98
+ for (int i = 0; i < values.size(); i++) {
99
+ ASSERT_TRUE(p < limit);
100
+ uint64_t actual;
101
+ const char* start = p;
102
+ p = GetVarint64Ptr(p, limit, &actual);
103
+ ASSERT_TRUE(p != NULL);
104
+ ASSERT_EQ(values[i], actual);
105
+ ASSERT_EQ(VarintLength(actual), p - start);
106
+ }
107
+ ASSERT_EQ(p, limit);
108
+
109
+ }
110
+
111
+ TEST(Coding, Varint32Overflow) {
112
+ uint32_t result;
113
+ std::string input("\x81\x82\x83\x84\x85\x11");
114
+ ASSERT_TRUE(GetVarint32Ptr(input.data(), input.data() + input.size(), &result)
115
+ == NULL);
116
+ }
117
+
118
+ TEST(Coding, Varint32Truncation) {
119
+ uint32_t large_value = (1u << 31) + 100;
120
+ std::string s;
121
+ PutVarint32(&s, large_value);
122
+ uint32_t result;
123
+ for (int len = 0; len < s.size() - 1; len++) {
124
+ ASSERT_TRUE(GetVarint32Ptr(s.data(), s.data() + len, &result) == NULL);
125
+ }
126
+ ASSERT_TRUE(GetVarint32Ptr(s.data(), s.data() + s.size(), &result) != NULL);
127
+ ASSERT_EQ(large_value, result);
128
+ }
129
+
130
+ TEST(Coding, Varint64Overflow) {
131
+ uint64_t result;
132
+ std::string input("\x81\x82\x83\x84\x85\x81\x82\x83\x84\x85\x11");
133
+ ASSERT_TRUE(GetVarint64Ptr(input.data(), input.data() + input.size(), &result)
134
+ == NULL);
135
+ }
136
+
137
+ TEST(Coding, Varint64Truncation) {
138
+ uint64_t large_value = (1ull << 63) + 100ull;
139
+ std::string s;
140
+ PutVarint64(&s, large_value);
141
+ uint64_t result;
142
+ for (int len = 0; len < s.size() - 1; len++) {
143
+ ASSERT_TRUE(GetVarint64Ptr(s.data(), s.data() + len, &result) == NULL);
144
+ }
145
+ ASSERT_TRUE(GetVarint64Ptr(s.data(), s.data() + s.size(), &result) != NULL);
146
+ ASSERT_EQ(large_value, result);
147
+ }
148
+
149
+ TEST(Coding, Strings) {
150
+ std::string s;
151
+ PutLengthPrefixedSlice(&s, Slice(""));
152
+ PutLengthPrefixedSlice(&s, Slice("foo"));
153
+ PutLengthPrefixedSlice(&s, Slice("bar"));
154
+ PutLengthPrefixedSlice(&s, Slice(std::string(200, 'x')));
155
+
156
+ Slice input(s);
157
+ Slice v;
158
+ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));
159
+ ASSERT_EQ("", v.ToString());
160
+ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));
161
+ ASSERT_EQ("foo", v.ToString());
162
+ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));
163
+ ASSERT_EQ("bar", v.ToString());
164
+ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));
165
+ ASSERT_EQ(std::string(200, 'x'), v.ToString());
166
+ ASSERT_EQ("", input.ToString());
167
+ }
168
+
169
+ } // namespace leveldb
170
+
171
+ int main(int argc, char** argv) {
172
+ return leveldb::test::RunAllTests();
173
+ }
@@ -0,0 +1,76 @@
1
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
4
+
5
+ #include <algorithm>
6
+ #include <stdint.h>
7
+ #include "leveldb/comparator.h"
8
+ #include "leveldb/slice.h"
9
+ #include "util/logging.h"
10
+
11
+ namespace leveldb {
12
+
13
+ Comparator::~Comparator() { }
14
+
15
+ namespace {
16
+ class BytewiseComparatorImpl : public Comparator {
17
+ public:
18
+ BytewiseComparatorImpl() { }
19
+
20
+ virtual const char* Name() const {
21
+ return "leveldb.BytewiseComparator";
22
+ }
23
+
24
+ virtual int Compare(const Slice& a, const Slice& b) const {
25
+ return a.compare(b);
26
+ }
27
+
28
+ virtual void FindShortestSeparator(
29
+ std::string* start,
30
+ const Slice& limit) const {
31
+ // Find length of common prefix
32
+ size_t min_length = std::min(start->size(), limit.size());
33
+ size_t diff_index = 0;
34
+ while ((diff_index < min_length) &&
35
+ ((*start)[diff_index] == limit[diff_index])) {
36
+ diff_index++;
37
+ }
38
+
39
+ if (diff_index >= min_length) {
40
+ // Do not shorten if one string is a prefix of the other
41
+ } else {
42
+ uint8_t diff_byte = static_cast<uint8_t>((*start)[diff_index]);
43
+ if (diff_byte < static_cast<uint8_t>(0xff) &&
44
+ diff_byte + 1 < static_cast<uint8_t>(limit[diff_index])) {
45
+ (*start)[diff_index]++;
46
+ start->resize(diff_index + 1);
47
+ assert(Compare(*start, limit) < 0);
48
+ }
49
+ }
50
+ }
51
+
52
+ virtual void FindShortSuccessor(std::string* key) const {
53
+ // Find first character that can be incremented
54
+ size_t n = key->size();
55
+ for (size_t i = 0; i < n; i++) {
56
+ const uint8_t byte = (*key)[i];
57
+ if (byte != static_cast<uint8_t>(0xff)) {
58
+ (*key)[i] = byte + 1;
59
+ key->resize(i+1);
60
+ return;
61
+ }
62
+ }
63
+ // *key is a run of 0xffs. Leave it alone.
64
+ }
65
+ };
66
+ } // namespace
67
+
68
+ // Intentionally not destroyed to prevent destructor racing
69
+ // with background threads.
70
+ static const Comparator* bytewise = new BytewiseComparatorImpl;
71
+
72
+ const Comparator* BytewiseComparator() {
73
+ return bytewise;
74
+ }
75
+
76
+ } // namespace leveldb
@@ -0,0 +1,332 @@
1
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
4
+ //
5
+ // A portable implementation of crc32c, optimized to handle
6
+ // four bytes at a time.
7
+
8
+ #include "util/crc32c.h"
9
+
10
+ #include <stdint.h>
11
+ #include "util/coding.h"
12
+
13
+ namespace leveldb {
14
+ namespace crc32c {
15
+
16
+ static const uint32_t table0_[256] = {
17
+ 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,
18
+ 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,
19
+ 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
20
+ 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,
21
+ 0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,
22
+ 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
23
+ 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,
24
+ 0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,
25
+ 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
26
+ 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,
27
+ 0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,
28
+ 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
29
+ 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,
30
+ 0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,
31
+ 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
32
+ 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,
33
+ 0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,
34
+ 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
35
+ 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,
36
+ 0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,
37
+ 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
38
+ 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,
39
+ 0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,
40
+ 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
41
+ 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,
42
+ 0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,
43
+ 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
44
+ 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,
45
+ 0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,
46
+ 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
47
+ 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,
48
+ 0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,
49
+ 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
50
+ 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,
51
+ 0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,
52
+ 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
53
+ 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,
54
+ 0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,
55
+ 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
56
+ 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,
57
+ 0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,
58
+ 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
59
+ 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,
60
+ 0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,
61
+ 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
62
+ 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,
63
+ 0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,
64
+ 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
65
+ 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,
66
+ 0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,
67
+ 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
68
+ 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,
69
+ 0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,
70
+ 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
71
+ 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,
72
+ 0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,
73
+ 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
74
+ 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,
75
+ 0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,
76
+ 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
77
+ 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,
78
+ 0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,
79
+ 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
80
+ 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351
81
+ };
82
+ static const uint32_t table1_[256] = {
83
+ 0x00000000, 0x13a29877, 0x274530ee, 0x34e7a899,
84
+ 0x4e8a61dc, 0x5d28f9ab, 0x69cf5132, 0x7a6dc945,
85
+ 0x9d14c3b8, 0x8eb65bcf, 0xba51f356, 0xa9f36b21,
86
+ 0xd39ea264, 0xc03c3a13, 0xf4db928a, 0xe7790afd,
87
+ 0x3fc5f181, 0x2c6769f6, 0x1880c16f, 0x0b225918,
88
+ 0x714f905d, 0x62ed082a, 0x560aa0b3, 0x45a838c4,
89
+ 0xa2d13239, 0xb173aa4e, 0x859402d7, 0x96369aa0,
90
+ 0xec5b53e5, 0xfff9cb92, 0xcb1e630b, 0xd8bcfb7c,
91
+ 0x7f8be302, 0x6c297b75, 0x58ced3ec, 0x4b6c4b9b,
92
+ 0x310182de, 0x22a31aa9, 0x1644b230, 0x05e62a47,
93
+ 0xe29f20ba, 0xf13db8cd, 0xc5da1054, 0xd6788823,
94
+ 0xac154166, 0xbfb7d911, 0x8b507188, 0x98f2e9ff,
95
+ 0x404e1283, 0x53ec8af4, 0x670b226d, 0x74a9ba1a,
96
+ 0x0ec4735f, 0x1d66eb28, 0x298143b1, 0x3a23dbc6,
97
+ 0xdd5ad13b, 0xcef8494c, 0xfa1fe1d5, 0xe9bd79a2,
98
+ 0x93d0b0e7, 0x80722890, 0xb4958009, 0xa737187e,
99
+ 0xff17c604, 0xecb55e73, 0xd852f6ea, 0xcbf06e9d,
100
+ 0xb19da7d8, 0xa23f3faf, 0x96d89736, 0x857a0f41,
101
+ 0x620305bc, 0x71a19dcb, 0x45463552, 0x56e4ad25,
102
+ 0x2c896460, 0x3f2bfc17, 0x0bcc548e, 0x186eccf9,
103
+ 0xc0d23785, 0xd370aff2, 0xe797076b, 0xf4359f1c,
104
+ 0x8e585659, 0x9dface2e, 0xa91d66b7, 0xbabffec0,
105
+ 0x5dc6f43d, 0x4e646c4a, 0x7a83c4d3, 0x69215ca4,
106
+ 0x134c95e1, 0x00ee0d96, 0x3409a50f, 0x27ab3d78,
107
+ 0x809c2506, 0x933ebd71, 0xa7d915e8, 0xb47b8d9f,
108
+ 0xce1644da, 0xddb4dcad, 0xe9537434, 0xfaf1ec43,
109
+ 0x1d88e6be, 0x0e2a7ec9, 0x3acdd650, 0x296f4e27,
110
+ 0x53028762, 0x40a01f15, 0x7447b78c, 0x67e52ffb,
111
+ 0xbf59d487, 0xacfb4cf0, 0x981ce469, 0x8bbe7c1e,
112
+ 0xf1d3b55b, 0xe2712d2c, 0xd69685b5, 0xc5341dc2,
113
+ 0x224d173f, 0x31ef8f48, 0x050827d1, 0x16aabfa6,
114
+ 0x6cc776e3, 0x7f65ee94, 0x4b82460d, 0x5820de7a,
115
+ 0xfbc3faf9, 0xe861628e, 0xdc86ca17, 0xcf245260,
116
+ 0xb5499b25, 0xa6eb0352, 0x920cabcb, 0x81ae33bc,
117
+ 0x66d73941, 0x7575a136, 0x419209af, 0x523091d8,
118
+ 0x285d589d, 0x3bffc0ea, 0x0f186873, 0x1cbaf004,
119
+ 0xc4060b78, 0xd7a4930f, 0xe3433b96, 0xf0e1a3e1,
120
+ 0x8a8c6aa4, 0x992ef2d3, 0xadc95a4a, 0xbe6bc23d,
121
+ 0x5912c8c0, 0x4ab050b7, 0x7e57f82e, 0x6df56059,
122
+ 0x1798a91c, 0x043a316b, 0x30dd99f2, 0x237f0185,
123
+ 0x844819fb, 0x97ea818c, 0xa30d2915, 0xb0afb162,
124
+ 0xcac27827, 0xd960e050, 0xed8748c9, 0xfe25d0be,
125
+ 0x195cda43, 0x0afe4234, 0x3e19eaad, 0x2dbb72da,
126
+ 0x57d6bb9f, 0x447423e8, 0x70938b71, 0x63311306,
127
+ 0xbb8de87a, 0xa82f700d, 0x9cc8d894, 0x8f6a40e3,
128
+ 0xf50789a6, 0xe6a511d1, 0xd242b948, 0xc1e0213f,
129
+ 0x26992bc2, 0x353bb3b5, 0x01dc1b2c, 0x127e835b,
130
+ 0x68134a1e, 0x7bb1d269, 0x4f567af0, 0x5cf4e287,
131
+ 0x04d43cfd, 0x1776a48a, 0x23910c13, 0x30339464,
132
+ 0x4a5e5d21, 0x59fcc556, 0x6d1b6dcf, 0x7eb9f5b8,
133
+ 0x99c0ff45, 0x8a626732, 0xbe85cfab, 0xad2757dc,
134
+ 0xd74a9e99, 0xc4e806ee, 0xf00fae77, 0xe3ad3600,
135
+ 0x3b11cd7c, 0x28b3550b, 0x1c54fd92, 0x0ff665e5,
136
+ 0x759baca0, 0x663934d7, 0x52de9c4e, 0x417c0439,
137
+ 0xa6050ec4, 0xb5a796b3, 0x81403e2a, 0x92e2a65d,
138
+ 0xe88f6f18, 0xfb2df76f, 0xcfca5ff6, 0xdc68c781,
139
+ 0x7b5fdfff, 0x68fd4788, 0x5c1aef11, 0x4fb87766,
140
+ 0x35d5be23, 0x26772654, 0x12908ecd, 0x013216ba,
141
+ 0xe64b1c47, 0xf5e98430, 0xc10e2ca9, 0xd2acb4de,
142
+ 0xa8c17d9b, 0xbb63e5ec, 0x8f844d75, 0x9c26d502,
143
+ 0x449a2e7e, 0x5738b609, 0x63df1e90, 0x707d86e7,
144
+ 0x0a104fa2, 0x19b2d7d5, 0x2d557f4c, 0x3ef7e73b,
145
+ 0xd98eedc6, 0xca2c75b1, 0xfecbdd28, 0xed69455f,
146
+ 0x97048c1a, 0x84a6146d, 0xb041bcf4, 0xa3e32483
147
+ };
148
+ static const uint32_t table2_[256] = {
149
+ 0x00000000, 0xa541927e, 0x4f6f520d, 0xea2ec073,
150
+ 0x9edea41a, 0x3b9f3664, 0xd1b1f617, 0x74f06469,
151
+ 0x38513ec5, 0x9d10acbb, 0x773e6cc8, 0xd27ffeb6,
152
+ 0xa68f9adf, 0x03ce08a1, 0xe9e0c8d2, 0x4ca15aac,
153
+ 0x70a27d8a, 0xd5e3eff4, 0x3fcd2f87, 0x9a8cbdf9,
154
+ 0xee7cd990, 0x4b3d4bee, 0xa1138b9d, 0x045219e3,
155
+ 0x48f3434f, 0xedb2d131, 0x079c1142, 0xa2dd833c,
156
+ 0xd62de755, 0x736c752b, 0x9942b558, 0x3c032726,
157
+ 0xe144fb14, 0x4405696a, 0xae2ba919, 0x0b6a3b67,
158
+ 0x7f9a5f0e, 0xdadbcd70, 0x30f50d03, 0x95b49f7d,
159
+ 0xd915c5d1, 0x7c5457af, 0x967a97dc, 0x333b05a2,
160
+ 0x47cb61cb, 0xe28af3b5, 0x08a433c6, 0xade5a1b8,
161
+ 0x91e6869e, 0x34a714e0, 0xde89d493, 0x7bc846ed,
162
+ 0x0f382284, 0xaa79b0fa, 0x40577089, 0xe516e2f7,
163
+ 0xa9b7b85b, 0x0cf62a25, 0xe6d8ea56, 0x43997828,
164
+ 0x37691c41, 0x92288e3f, 0x78064e4c, 0xdd47dc32,
165
+ 0xc76580d9, 0x622412a7, 0x880ad2d4, 0x2d4b40aa,
166
+ 0x59bb24c3, 0xfcfab6bd, 0x16d476ce, 0xb395e4b0,
167
+ 0xff34be1c, 0x5a752c62, 0xb05bec11, 0x151a7e6f,
168
+ 0x61ea1a06, 0xc4ab8878, 0x2e85480b, 0x8bc4da75,
169
+ 0xb7c7fd53, 0x12866f2d, 0xf8a8af5e, 0x5de93d20,
170
+ 0x29195949, 0x8c58cb37, 0x66760b44, 0xc337993a,
171
+ 0x8f96c396, 0x2ad751e8, 0xc0f9919b, 0x65b803e5,
172
+ 0x1148678c, 0xb409f5f2, 0x5e273581, 0xfb66a7ff,
173
+ 0x26217bcd, 0x8360e9b3, 0x694e29c0, 0xcc0fbbbe,
174
+ 0xb8ffdfd7, 0x1dbe4da9, 0xf7908dda, 0x52d11fa4,
175
+ 0x1e704508, 0xbb31d776, 0x511f1705, 0xf45e857b,
176
+ 0x80aee112, 0x25ef736c, 0xcfc1b31f, 0x6a802161,
177
+ 0x56830647, 0xf3c29439, 0x19ec544a, 0xbcadc634,
178
+ 0xc85da25d, 0x6d1c3023, 0x8732f050, 0x2273622e,
179
+ 0x6ed23882, 0xcb93aafc, 0x21bd6a8f, 0x84fcf8f1,
180
+ 0xf00c9c98, 0x554d0ee6, 0xbf63ce95, 0x1a225ceb,
181
+ 0x8b277743, 0x2e66e53d, 0xc448254e, 0x6109b730,
182
+ 0x15f9d359, 0xb0b84127, 0x5a968154, 0xffd7132a,
183
+ 0xb3764986, 0x1637dbf8, 0xfc191b8b, 0x595889f5,
184
+ 0x2da8ed9c, 0x88e97fe2, 0x62c7bf91, 0xc7862def,
185
+ 0xfb850ac9, 0x5ec498b7, 0xb4ea58c4, 0x11abcaba,
186
+ 0x655baed3, 0xc01a3cad, 0x2a34fcde, 0x8f756ea0,
187
+ 0xc3d4340c, 0x6695a672, 0x8cbb6601, 0x29faf47f,
188
+ 0x5d0a9016, 0xf84b0268, 0x1265c21b, 0xb7245065,
189
+ 0x6a638c57, 0xcf221e29, 0x250cde5a, 0x804d4c24,
190
+ 0xf4bd284d, 0x51fcba33, 0xbbd27a40, 0x1e93e83e,
191
+ 0x5232b292, 0xf77320ec, 0x1d5de09f, 0xb81c72e1,
192
+ 0xccec1688, 0x69ad84f6, 0x83834485, 0x26c2d6fb,
193
+ 0x1ac1f1dd, 0xbf8063a3, 0x55aea3d0, 0xf0ef31ae,
194
+ 0x841f55c7, 0x215ec7b9, 0xcb7007ca, 0x6e3195b4,
195
+ 0x2290cf18, 0x87d15d66, 0x6dff9d15, 0xc8be0f6b,
196
+ 0xbc4e6b02, 0x190ff97c, 0xf321390f, 0x5660ab71,
197
+ 0x4c42f79a, 0xe90365e4, 0x032da597, 0xa66c37e9,
198
+ 0xd29c5380, 0x77ddc1fe, 0x9df3018d, 0x38b293f3,
199
+ 0x7413c95f, 0xd1525b21, 0x3b7c9b52, 0x9e3d092c,
200
+ 0xeacd6d45, 0x4f8cff3b, 0xa5a23f48, 0x00e3ad36,
201
+ 0x3ce08a10, 0x99a1186e, 0x738fd81d, 0xd6ce4a63,
202
+ 0xa23e2e0a, 0x077fbc74, 0xed517c07, 0x4810ee79,
203
+ 0x04b1b4d5, 0xa1f026ab, 0x4bdee6d8, 0xee9f74a6,
204
+ 0x9a6f10cf, 0x3f2e82b1, 0xd50042c2, 0x7041d0bc,
205
+ 0xad060c8e, 0x08479ef0, 0xe2695e83, 0x4728ccfd,
206
+ 0x33d8a894, 0x96993aea, 0x7cb7fa99, 0xd9f668e7,
207
+ 0x9557324b, 0x3016a035, 0xda386046, 0x7f79f238,
208
+ 0x0b899651, 0xaec8042f, 0x44e6c45c, 0xe1a75622,
209
+ 0xdda47104, 0x78e5e37a, 0x92cb2309, 0x378ab177,
210
+ 0x437ad51e, 0xe63b4760, 0x0c158713, 0xa954156d,
211
+ 0xe5f54fc1, 0x40b4ddbf, 0xaa9a1dcc, 0x0fdb8fb2,
212
+ 0x7b2bebdb, 0xde6a79a5, 0x3444b9d6, 0x91052ba8
213
+ };
214
+ static const uint32_t table3_[256] = {
215
+ 0x00000000, 0xdd45aab8, 0xbf672381, 0x62228939,
216
+ 0x7b2231f3, 0xa6679b4b, 0xc4451272, 0x1900b8ca,
217
+ 0xf64463e6, 0x2b01c95e, 0x49234067, 0x9466eadf,
218
+ 0x8d665215, 0x5023f8ad, 0x32017194, 0xef44db2c,
219
+ 0xe964b13d, 0x34211b85, 0x560392bc, 0x8b463804,
220
+ 0x924680ce, 0x4f032a76, 0x2d21a34f, 0xf06409f7,
221
+ 0x1f20d2db, 0xc2657863, 0xa047f15a, 0x7d025be2,
222
+ 0x6402e328, 0xb9474990, 0xdb65c0a9, 0x06206a11,
223
+ 0xd725148b, 0x0a60be33, 0x6842370a, 0xb5079db2,
224
+ 0xac072578, 0x71428fc0, 0x136006f9, 0xce25ac41,
225
+ 0x2161776d, 0xfc24ddd5, 0x9e0654ec, 0x4343fe54,
226
+ 0x5a43469e, 0x8706ec26, 0xe524651f, 0x3861cfa7,
227
+ 0x3e41a5b6, 0xe3040f0e, 0x81268637, 0x5c632c8f,
228
+ 0x45639445, 0x98263efd, 0xfa04b7c4, 0x27411d7c,
229
+ 0xc805c650, 0x15406ce8, 0x7762e5d1, 0xaa274f69,
230
+ 0xb327f7a3, 0x6e625d1b, 0x0c40d422, 0xd1057e9a,
231
+ 0xaba65fe7, 0x76e3f55f, 0x14c17c66, 0xc984d6de,
232
+ 0xd0846e14, 0x0dc1c4ac, 0x6fe34d95, 0xb2a6e72d,
233
+ 0x5de23c01, 0x80a796b9, 0xe2851f80, 0x3fc0b538,
234
+ 0x26c00df2, 0xfb85a74a, 0x99a72e73, 0x44e284cb,
235
+ 0x42c2eeda, 0x9f874462, 0xfda5cd5b, 0x20e067e3,
236
+ 0x39e0df29, 0xe4a57591, 0x8687fca8, 0x5bc25610,
237
+ 0xb4868d3c, 0x69c32784, 0x0be1aebd, 0xd6a40405,
238
+ 0xcfa4bccf, 0x12e11677, 0x70c39f4e, 0xad8635f6,
239
+ 0x7c834b6c, 0xa1c6e1d4, 0xc3e468ed, 0x1ea1c255,
240
+ 0x07a17a9f, 0xdae4d027, 0xb8c6591e, 0x6583f3a6,
241
+ 0x8ac7288a, 0x57828232, 0x35a00b0b, 0xe8e5a1b3,
242
+ 0xf1e51979, 0x2ca0b3c1, 0x4e823af8, 0x93c79040,
243
+ 0x95e7fa51, 0x48a250e9, 0x2a80d9d0, 0xf7c57368,
244
+ 0xeec5cba2, 0x3380611a, 0x51a2e823, 0x8ce7429b,
245
+ 0x63a399b7, 0xbee6330f, 0xdcc4ba36, 0x0181108e,
246
+ 0x1881a844, 0xc5c402fc, 0xa7e68bc5, 0x7aa3217d,
247
+ 0x52a0c93f, 0x8fe56387, 0xedc7eabe, 0x30824006,
248
+ 0x2982f8cc, 0xf4c75274, 0x96e5db4d, 0x4ba071f5,
249
+ 0xa4e4aad9, 0x79a10061, 0x1b838958, 0xc6c623e0,
250
+ 0xdfc69b2a, 0x02833192, 0x60a1b8ab, 0xbde41213,
251
+ 0xbbc47802, 0x6681d2ba, 0x04a35b83, 0xd9e6f13b,
252
+ 0xc0e649f1, 0x1da3e349, 0x7f816a70, 0xa2c4c0c8,
253
+ 0x4d801be4, 0x90c5b15c, 0xf2e73865, 0x2fa292dd,
254
+ 0x36a22a17, 0xebe780af, 0x89c50996, 0x5480a32e,
255
+ 0x8585ddb4, 0x58c0770c, 0x3ae2fe35, 0xe7a7548d,
256
+ 0xfea7ec47, 0x23e246ff, 0x41c0cfc6, 0x9c85657e,
257
+ 0x73c1be52, 0xae8414ea, 0xcca69dd3, 0x11e3376b,
258
+ 0x08e38fa1, 0xd5a62519, 0xb784ac20, 0x6ac10698,
259
+ 0x6ce16c89, 0xb1a4c631, 0xd3864f08, 0x0ec3e5b0,
260
+ 0x17c35d7a, 0xca86f7c2, 0xa8a47efb, 0x75e1d443,
261
+ 0x9aa50f6f, 0x47e0a5d7, 0x25c22cee, 0xf8878656,
262
+ 0xe1873e9c, 0x3cc29424, 0x5ee01d1d, 0x83a5b7a5,
263
+ 0xf90696d8, 0x24433c60, 0x4661b559, 0x9b241fe1,
264
+ 0x8224a72b, 0x5f610d93, 0x3d4384aa, 0xe0062e12,
265
+ 0x0f42f53e, 0xd2075f86, 0xb025d6bf, 0x6d607c07,
266
+ 0x7460c4cd, 0xa9256e75, 0xcb07e74c, 0x16424df4,
267
+ 0x106227e5, 0xcd278d5d, 0xaf050464, 0x7240aedc,
268
+ 0x6b401616, 0xb605bcae, 0xd4273597, 0x09629f2f,
269
+ 0xe6264403, 0x3b63eebb, 0x59416782, 0x8404cd3a,
270
+ 0x9d0475f0, 0x4041df48, 0x22635671, 0xff26fcc9,
271
+ 0x2e238253, 0xf36628eb, 0x9144a1d2, 0x4c010b6a,
272
+ 0x5501b3a0, 0x88441918, 0xea669021, 0x37233a99,
273
+ 0xd867e1b5, 0x05224b0d, 0x6700c234, 0xba45688c,
274
+ 0xa345d046, 0x7e007afe, 0x1c22f3c7, 0xc167597f,
275
+ 0xc747336e, 0x1a0299d6, 0x782010ef, 0xa565ba57,
276
+ 0xbc65029d, 0x6120a825, 0x0302211c, 0xde478ba4,
277
+ 0x31035088, 0xec46fa30, 0x8e647309, 0x5321d9b1,
278
+ 0x4a21617b, 0x9764cbc3, 0xf54642fa, 0x2803e842
279
+ };
280
+
281
+ // Used to fetch a naturally-aligned 32-bit word in little endian byte-order
282
+ static inline uint32_t LE_LOAD32(const uint8_t *p) {
283
+ return DecodeFixed32(reinterpret_cast<const char*>(p));
284
+ }
285
+
286
+ uint32_t Extend(uint32_t crc, const char* buf, size_t size) {
287
+ const uint8_t *p = reinterpret_cast<const uint8_t *>(buf);
288
+ const uint8_t *e = p + size;
289
+ uint32_t l = crc ^ 0xffffffffu;
290
+
291
+ #define STEP1 do { \
292
+ int c = (l & 0xff) ^ *p++; \
293
+ l = table0_[c] ^ (l >> 8); \
294
+ } while (0)
295
+ #define STEP4 do { \
296
+ uint32_t c = l ^ LE_LOAD32(p); \
297
+ p += 4; \
298
+ l = table3_[c & 0xff] ^ \
299
+ table2_[(c >> 8) & 0xff] ^ \
300
+ table1_[(c >> 16) & 0xff] ^ \
301
+ table0_[c >> 24]; \
302
+ } while (0)
303
+
304
+ // Point x at first 4-byte aligned byte in string. This might be
305
+ // just past the end of the string.
306
+ const uintptr_t pval = reinterpret_cast<uintptr_t>(p);
307
+ const uint8_t* x = reinterpret_cast<const uint8_t*>(((pval + 3) >> 2) << 2);
308
+ if (x <= e) {
309
+ // Process bytes until finished or p is 4-byte aligned
310
+ while (p != x) {
311
+ STEP1;
312
+ }
313
+ }
314
+ // Process bytes 16 at a time
315
+ while ((e-p) >= 16) {
316
+ STEP4; STEP4; STEP4; STEP4;
317
+ }
318
+ // Process bytes 4 at a time
319
+ while ((e-p) >= 4) {
320
+ STEP4;
321
+ }
322
+ // Process the last few bytes
323
+ while (p != e) {
324
+ STEP1;
325
+ }
326
+ #undef STEP4
327
+ #undef STEP1
328
+ return l ^ 0xffffffffu;
329
+ }
330
+
331
+ } // namespace crc32c
332
+ } // namespace leveldb