4#define LZ4_DISABLE_DEPRECATE_WARNINGS
6#include <xrpl/basics/contract.h>
7#include <xrpl/basics/safe_cast.h>
8#include <xrpl/nodestore/NodeObject.h>
9#include <xrpl/nodestore/detail/varint.h>
10#include <xrpl/protocol/HashPrefix.h>
12#include <nudb/detail/field.hpp>
22template <
class BufferFactory>
23std::pair<void const*, std::size_t>
26 if (
static_cast<int>(inSize) < 0)
33 if (n == 0 || n >= inSize)
36 if (
static_cast<int>(outSize) <= 0)
39 void*
const out = bf(outSize);
41 if (LZ4_decompress_safe(
42 reinterpret_cast<char const*
>(in) + n,
43 reinterpret_cast<char*
>(out),
44 static_cast<int>(inSize - n),
45 static_cast<int>(outSize)) !=
static_cast<int>(outSize))
48 return {out, outSize};
51template <
class BufferFactory>
56 using namespace nudb::detail;
60 auto const outMax = LZ4_compressBound(inSize);
64 auto const outSize = LZ4_compress_default(
65 reinterpret_cast<char const*
>(in),
reinterpret_cast<char*
>(out + n), inSize, outMax);
68 result.
second = n + outSize;
83template <
class BufferFactory>
87 using namespace nudb::detail;
113 auto const hs = field<std::uint16_t>::size;
114 if (inSize < hs + 32)
117 "nodeobject codec v1: short inner node size: " +
std::string(
"in_size = ") +
120 istream is(p, inSize);
125 void*
const out = bf(result.
second);
127 ostream os(out, result.
second);
135 for (
int i = 16; i--; bit >>= 1)
142 "nodeobject codec v1: short inner node subsize: " +
157 "nodeobject codec v1: long inner node, in_size = " +
std::to_string(inSize));
163 if (inSize != 16 * 32)
166 "nodeobject codec v1: short full inner node, in_size = " +
169 istream is(p, inSize);
171 void*
const out = bf(result.
second);
173 ostream os(out, result.
second);
178 write(os, is(512), 512);
187template <
class =
void>
195template <
class BufferFactory>
200 using namespace nudb::detail;
205 istream is(in, inSize);
219 for (
unsigned bit = 0x8000; bit; bit >>= 1)
221 void const*
const h = is(32);
232 auto const type = 2U;
234 result.
second = vs + field<std::uint16_t>::size +
238 ostream os(out, result.
second);
245 auto const type = 3U;
247 result.
second = vs + (n * 32);
250 ostream os(out, result.
second);
274 result.
second = vn + lzr.second;
287template <
class =
void>
291 using namespace nudb::detail;
296 istream is(in, inSize);
void filterInner(void *in, std::size_t inSize)
void read(nudb::detail::istream &is, std::size_t &u)
std::size_t readVarint(void const *buf, std::size_t buflen, std::size_t &t)
std::size_t writeVarint(void *p0, std::size_t v)
std::pair< void const *, std::size_t > nodeobjectCompress(void const *in, std::size_t inSize, BufferFactory &&bf)
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)
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)
std::size_t sizeVarint(T v)
constexpr std::enable_if_t< std::is_integral_v< Dest > &&std::is_integral_v< Src >, Dest > safeCast(Src s) noexcept
@ InnerNode
inner node in V1 tree
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)