aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/streams/brotli/dictionary.h
blob: f5bbcc513b0d23d991b0ff9e9b89f4ab72a5ee68 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once

#include "const.h"

#include <contrib/libs/brotli/c/include/brotli/encode.h>

#include <util/generic/strbuf.h>

class TBrotliDictionary: public TMoveOnly {
public:
    TBrotliDictionary(const ui8* dict, size_t size, int quality = NBrotli::BEST_BROTLI_QUALITY)
        : Data_(dict)
        , Size_(size)
        , PreparedDictionary_(
              BrotliEncoderPrepareDictionary(
                  /*type*/ BROTLI_SHARED_DICTIONARY_RAW,
                  /*size*/ Size_,
                  /*data*/ Data_,
                  /*quality*/ quality,
                  /*alloc_func*/ nullptr,
                  /*free_func*/ nullptr,
                  /*opaque*/ nullptr))
    {
    }

    explicit TBrotliDictionary(TStringBuf dict, int quality = NBrotli::BEST_BROTLI_QUALITY)
        : TBrotliDictionary(
              reinterpret_cast<const ui8*>(dict.data()),
              dict.size(),
              quality)
    {
    }

    ~TBrotliDictionary() {
        BrotliEncoderDestroyPreparedDictionary(PreparedDictionary_);
    }

    BrotliEncoderPreparedDictionary* GetPreparedDictionary() const {
        return PreparedDictionary_;
    }

    const ui8* GetData() const {
        return Data_;
    }

    size_t GetSize() const {
        return Size_;
    }

private:
    const ui8* Data_ = nullptr;
    const size_t Size_ = 0;
    BrotliEncoderPreparedDictionary* PreparedDictionary_ = nullptr;
};