aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/containers/comptrie/protopacker.h
blob: 5bedde270d2f0d45bbaf320472a8f67607bf8908 (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
#pragma once

#include <util/stream/mem.h>
#include <util/ysaveload.h>

template <class Proto> 
class TProtoPacker {
public:
    TProtoPacker() = default;

    void UnpackLeaf(const char* p, Proto& entry) const {
        TMemoryInput in(p + sizeof(ui32), SkipLeaf(p) - sizeof(ui32));
        entry.ParseFromArcadiaStream(&in);
    }
    void PackLeaf(char* p, const Proto& entry, size_t size) const {
        TMemoryOutput out(p, size + sizeof(ui32));
        Save<ui32>(&out, size);
        entry.SerializeToArcadiaStream(&out);
    }
    size_t MeasureLeaf(const Proto& entry) const {
        return entry.ByteSize() + sizeof(ui32);
    }
    size_t SkipLeaf(const char* p) const {
        TMemoryInput in(p, sizeof(ui32));
        ui32 size;
        Load<ui32>(&in, size);
        return size;
    }
};