codecs.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma once
  2. #include <util/generic/buffer.h>
  3. #include <util/generic/strbuf.h>
  4. #include <util/generic/string.h>
  5. #include <util/generic/typetraits.h>
  6. #include <util/generic/vector.h>
  7. #include <util/generic/yexception.h>
  8. namespace NBlockCodecs {
  9. struct TData: public TStringBuf {
  10. inline TData() = default;
  11. Y_HAS_MEMBER(Data);
  12. Y_HAS_MEMBER(Size);
  13. template <class T, std::enable_if_t<!THasSize<T>::value || !THasData<T>::value, int> = 0>
  14. inline TData(const T& t)
  15. : TStringBuf((const char*)t.data(), t.size())
  16. {
  17. }
  18. template <class T, std::enable_if_t<THasSize<T>::value && THasData<T>::value, int> = 0>
  19. inline TData(const T& t)
  20. : TStringBuf((const char*)t.Data(), t.Size())
  21. {
  22. }
  23. };
  24. template <>
  25. inline TData::TData(const TString& t)
  26. : TStringBuf((const char*)t.data(), t.size())
  27. {
  28. }
  29. struct TCodecError: public yexception {
  30. };
  31. struct TNotFound: public TCodecError {
  32. };
  33. struct TDataError: public TCodecError {
  34. };
  35. struct ICodec {
  36. virtual ~ICodec();
  37. // main interface
  38. virtual size_t DecompressedLength(const TData& in) const = 0;
  39. virtual size_t MaxCompressedLength(const TData& in) const = 0;
  40. virtual size_t Compress(const TData& in, void* out) const = 0;
  41. virtual size_t Decompress(const TData& in, void* out) const = 0;
  42. virtual TStringBuf Name() const noexcept = 0;
  43. // some useful helpers
  44. void Encode(const TData& in, TBuffer& out) const;
  45. void Decode(const TData& in, TBuffer& out) const;
  46. void Encode(const TData& in, TString& out) const;
  47. void Decode(const TData& in, TString& out) const;
  48. inline TString Encode(const TData& in) const {
  49. TString out;
  50. Encode(in, out);
  51. return out;
  52. }
  53. inline TString Decode(const TData& in) const {
  54. TString out;
  55. Decode(in, out);
  56. return out;
  57. }
  58. private:
  59. size_t GetDecompressedLength(const TData& in) const;
  60. };
  61. using TCodecPtr = THolder<ICodec>;
  62. const ICodec* Codec(const TStringBuf& name);
  63. // some aux methods
  64. typedef TVector<TStringBuf> TCodecList;
  65. TCodecList ListAllCodecs();
  66. TString ListAllCodecsAsString();
  67. // SEARCH-8344: Get the size of max possible decompressed block
  68. size_t GetMaxPossibleDecompressedLength();
  69. // SEARCH-8344: Globally set the size of max possible decompressed block
  70. void SetMaxPossibleDecompressedLength(size_t maxPossibleDecompressedLength);
  71. }