diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/blockcodecs/codecs/lz4/lz4.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/blockcodecs/codecs/lz4/lz4.cpp')
-rw-r--r-- | library/cpp/blockcodecs/codecs/lz4/lz4.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/library/cpp/blockcodecs/codecs/lz4/lz4.cpp b/library/cpp/blockcodecs/codecs/lz4/lz4.cpp new file mode 100644 index 0000000000..fbf0fe110f --- /dev/null +++ b/library/cpp/blockcodecs/codecs/lz4/lz4.cpp @@ -0,0 +1,123 @@ +#include <library/cpp/blockcodecs/core/codecs.h> +#include <library/cpp/blockcodecs/core/common.h> +#include <library/cpp/blockcodecs/core/register.h> + +#include <contrib/libs/lz4/lz4.h> +#include <contrib/libs/lz4/lz4hc.h> +#include <contrib/libs/lz4/generated/iface.h> + +using namespace NBlockCodecs; + +namespace { + struct TLz4Base { + static inline size_t DoMaxCompressedLength(size_t in) { + return LZ4_compressBound(SafeIntegerCast<int>(in)); + } + }; + + struct TLz4FastCompress { + inline TLz4FastCompress(int memory) + : Memory(memory) + , Methods(LZ4Methods(Memory)) + { + } + + inline size_t DoCompress(const TData& in, void* buf) const { + return Methods->LZ4CompressLimited(in.data(), (char*)buf, in.size(), LZ4_compressBound(in.size())); + } + + inline TString CPrefix() { + return "fast" + ToString(Memory); + } + + const int Memory; + const TLZ4Methods* Methods; + }; + + struct TLz4BestCompress { + inline size_t DoCompress(const TData& in, void* buf) const { + return LZ4_compress_HC(in.data(), (char*)buf, in.size(), LZ4_compressBound(in.size()), 0); + } + + static inline TString CPrefix() { + return "hc"; + } + }; + + struct TLz4FastDecompress { + inline void DoDecompress(const TData& in, void* out, size_t len) const { + ssize_t res = LZ4_decompress_fast(in.data(), (char*)out, len); + if (res < 0) { + ythrow TDecompressError(res); + } + } + + static inline TStringBuf DPrefix() { + return TStringBuf("fast"); + } + }; + + struct TLz4SafeDecompress { + inline void DoDecompress(const TData& in, void* out, size_t len) const { + ssize_t res = LZ4_decompress_safe(in.data(), (char*)out, in.size(), len); + if (res < 0) { + ythrow TDecompressError(res); + } + } + + static inline TStringBuf DPrefix() { + return TStringBuf("safe"); + } + }; + + template <class TC, class TD> + struct TLz4Codec: public TAddLengthCodec<TLz4Codec<TC, TD>>, public TLz4Base, public TC, public TD { + inline TLz4Codec() + : MyName("lz4-" + TC::CPrefix() + "-" + TD::DPrefix()) + { + } + + template <class T> + inline TLz4Codec(const T& t) + : TC(t) + , MyName("lz4-" + TC::CPrefix() + "-" + TD::DPrefix()) + { + } + + TStringBuf Name() const noexcept override { + return MyName; + } + + const TString MyName; + }; + + struct TLz4Registrar { + TLz4Registrar() { + for (int i = 0; i < 30; ++i) { + typedef TLz4Codec<TLz4FastCompress, TLz4FastDecompress> T1; + typedef TLz4Codec<TLz4FastCompress, TLz4SafeDecompress> T2; + + THolder<T1> t1(new T1(i)); + THolder<T2> t2(new T2(i)); + + if (t1->Methods) { + RegisterCodec(std::move(t1)); + } + + if (t2->Methods) { + RegisterCodec(std::move(t2)); + } + } + + RegisterCodec(MakeHolder<TLz4Codec<TLz4BestCompress, TLz4FastDecompress>>()); + RegisterCodec(MakeHolder<TLz4Codec<TLz4BestCompress, TLz4SafeDecompress>>()); + + RegisterAlias("lz4-fast-safe", "lz4-fast14-safe"); + RegisterAlias("lz4-fast-fast", "lz4-fast14-fast"); + RegisterAlias("lz4", "lz4-fast-safe"); + RegisterAlias("lz4fast", "lz4-fast-fast"); + RegisterAlias("lz4hc", "lz4-hc-safe"); + } + }; + const TLz4Registrar Registrar{}; +} |