8#define LZ4_DISABLE_DEPRECATE_WARNINGS
10#include <xrpl/basics/contract.h>
11#include <xrpl/basics/safe_cast.h>
12#include <xrpl/nodestore/NodeObject.h>
13#include <xrpl/nodestore/detail/Varint.h>
14#include <xrpl/protocol/HashPrefix.h>
16#include <nudb/detail/field.hpp>
26template <
class BufferFactory>
27std::pair<void const*, std::size_t>
30 if (
static_cast<int>(inSize) < 0)
37 if (n == 0 || n >= inSize)
40 if (
static_cast<int>(outSize) <= 0)
43 void*
const out = bf(outSize);
45 if (LZ4_decompress_safe(
46 reinterpret_cast<char const*
>(in) + n,
47 reinterpret_cast<char*
>(out),
48 static_cast<int>(inSize - n),
49 static_cast<int>(outSize)) !=
static_cast<int>(outSize))
52 return {out, outSize};
55template <
class BufferFactory>
60 using namespace nudb::detail;
64 auto const outMax = LZ4_compressBound(inSize);
65 auto* out =
reinterpret_cast<std::uint8_t*
>(bf(n + outMax));
68 auto const outSize = LZ4_compress_default(
69 reinterpret_cast<char const*
>(in),
reinterpret_cast<char*
>(out + n), inSize, outMax);
72 result.
second = n + outSize;
87template <
class BufferFactory>
91 using namespace nudb::detail;
93 auto const* p =
reinterpret_cast<std::uint8_t const*
>(in);
117 auto const hs = field<std::uint16_t>::size;
118 if (inSize < hs + 32)
121 "nodeobject codec v1: short inner node size: " +
std::string(
"in_size = ") +
124 istream is(p, inSize);
129 void*
const out = bf(result.
second);
131 ostream os(out, result.
second);
139 for (
int i = 16; i--; bit >>= 1)
146 "nodeobject codec v1: short inner node subsize: " +
161 "nodeobject codec v1: long inner node, in_size = " +
std::to_string(inSize));
167 if (inSize != 16 * 32)
170 "nodeobject codec v1: short full inner node, in_size = " +
173 istream is(p, inSize);
175 void*
const out = bf(result.
second);
177 ostream os(out, result.
second);
182 write(os, is(512), 512);
191template <
class =
void>
199template <
class BufferFactory>
204 using namespace nudb::detail;
209 istream is(in, inSize);
223 for (
unsigned bit = 0x8000; bit; bit >>= 1)
225 void const*
const h = is(32);
236 auto const type = 2U;
238 result.
second = vs + field<std::uint16_t>::size +
242 ostream os(out, result.
second);
249 auto const type = 3U;
251 result.
second = vs + (n * 32);
254 ostream os(out, result.
second);
278 result.
second = vn + lzr.second;
291template <
class =
void>
295 using namespace nudb::detail;
300 istream is(in, inSize);
std::pair< void const *, std::size_t > nodeobjectCompress(void const *in, std::size_t inSize, BufferFactory &&bf)
std::size_t readVarint(void const *buf, std::size_t buflen, std::size_t &t)
std::pair< void const *, std::size_t > lz4Decompress(void const *in, std::size_t inSize, BufferFactory &&bf)
std::pair< void const *, std::size_t > lz4Compress(void const *in, std::size_t inSize, BufferFactory &&bf)
std::size_t writeVarint(void *p0, std::size_t v)
std::size_t sizeVarint(T v)
void write(nudb::detail::ostream &os, std::size_t t)
std::pair< void const *, std::size_t > nodeobjectDecompress(void const *in, std::size_t inSize, BufferFactory &&bf)
void read(nudb::detail::istream &is, std::size_t &u)
void filterInner(void *in, std::size_t inSize)
constexpr Dest safeCast(Src s) noexcept
@ InnerNode
inner node in V1 tree
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)