aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/util/bufferwriter.h
blob: 656164865a2b5df1c91943edaec109b115137008 (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
55
56
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#pragma once

#include <cstddef>

namespace search {

/**
 * Abstract class to write to a buffer with an abstract backing store
 * and abstract backing buffer.  Each time backing buffer is full,
 * flush() is called to resize it or drain it to the backing store.
 */
class BufferWriter
{
    char *_cur;
    char *_end;
    char *_start;
protected:
    void rewind() { _cur = _start; }

    void setup(void *start, size_t len) {
        _start = static_cast<char *>(start);
        _end = _start + len;
        rewind();
    }

    size_t freeLen() const { return _end - _cur; }
    size_t usedLen() const { return _cur - _start; }

    void writeFast(const void *src, size_t len)
    {
        __builtin_memcpy(_cur, src, len);
        _cur += len;
    }

    void writeSlow(const void *src, size_t len);

public:
    BufferWriter();

    virtual ~BufferWriter();

    virtual void flush() = 0;

    void write(const void *src, size_t len)
    {
        if (__builtin_expect(len <= freeLen(), true)) {
            writeFast(src, len);
            return;
        }
        writeSlow(src, len);
    }
};

} // namespace search