28 if (
static_cast<int>(in_size) < 0)
29 Throw<std::runtime_error>(
"lz4_decompress: integer overflow (input)");
36 if (n == 0 || n >= in_size)
37 Throw<std::runtime_error>(
"lz4_decompress: invalid blob");
39 if (
static_cast<int>(outSize) <= 0)
40 Throw<std::runtime_error>(
"lz4_decompress: integer overflow (output)");
42 void*
const out = bf(outSize);
44 if (LZ4_decompress_safe(
45 reinterpret_cast<char const*
>(
in) + n,
46 reinterpret_cast<char*
>(
out),
47 static_cast<int>(in_size - n),
48 static_cast<int>(outSize)) !=
static_cast<int>(outSize))
49 Throw<std::runtime_error>(
"lz4_decompress: LZ4_decompress_safe");
51 return {
out, outSize};
93 using namespace nudb::detail;
99 Throw<std::runtime_error>(
"nodeobject decompress");
119 auto const hs = field<std::uint16_t>::size;
120 if (in_size < hs + 32)
121 Throw<std::runtime_error>(
122 "nodeobject codec v1: short inner node size: " +
125 istream is(p, in_size);
127 read<std::uint16_t>(is, mask);
133 write<std::uint32_t>(os, 0);
134 write<std::uint32_t>(os, 0);
136 write<std::uint32_t>(
139 Throw<std::runtime_error>(
140 "nodeobject codec v1: empty inner node");
142 for (
int i = 16; i--; bit >>= 1)
147 Throw<std::runtime_error>(
148 "nodeobject codec v1: short inner node subsize: " +
161 Throw<std::runtime_error>(
162 "nodeobject codec v1: long inner node, in_size = " +
168 if (in_size != 16 * 32)
169 Throw<std::runtime_error>(
170 "nodeobject codec v1: short full inner node, in_size = " +
172 istream is(p, in_size);
177 write<std::uint32_t>(os, 0);
178 write<std::uint32_t>(os, 0);
180 write<std::uint32_t>(
182 write(os, is(512), 512);
186 Throw<std::runtime_error>(
205 using namespace nudb::detail;
210 istream is(
in, in_size);
215 read<std::uint32_t>(is, index);
216 read<std::uint32_t>(is, unused);
217 read<std::uint8_t>(is, kind);
218 read<std::uint32_t>(is, prefix);
224 for (
unsigned bit = 0x8000; bit; bit >>= 1)
226 void const*
const h = is(32);
237 auto const type = 2U;
239 result.
second = vs + field<std::uint16_t>::size +
245 write<varint>(os, type);
246 write<std::uint16_t>(os, mask);
251 auto const type = 3U;
253 result.
second = vs + n * 32;
258 write<varint>(os, type);
282 result.
second = vn + lzr.second;
286 Throw<std::logic_error>(
300 using namespace nudb::detail;
305 istream is(
in, in_size);
310 read<std::uint32_t>(is, index);
311 read<std::uint32_t>(is, unused);
312 read<std::uint8_t>(is, kind);
313 read<std::uint32_t>(is, prefix);
317 write<std::uint32_t>(os, 0);
318 write<std::uint32_t>(os, 0);