File: buffer.h

package info (click to toggle)
lsp-plugins 1.2.26-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 130,004 kB
  • sloc: cpp: 642,749; xml: 78,805; makefile: 14,229; php: 1,361; sh: 185
file content (171 lines) | stat: -rw-r--r-- 6,029 bytes parent folder | download
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
 * Copyright (C) 2025 Linux Studio Plugins Project <https://lsp-plug.in/>
 *           (C) 2025 Vladimir Sadovnikov <sadko4u@gmail.com>
 *
 * This file is part of lsp-runtime-lib
 * Created on: 13 мар. 2021 г.
 *
 * lsp-runtime-lib is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * lsp-runtime-lib is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with lsp-runtime-lib. If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef LSP_PLUG_IN_RESOURCE_BUFFER_H_
#define LSP_PLUG_IN_RESOURCE_BUFFER_H_

#include <lsp-plug.in/runtime/version.h>
#include <lsp-plug.in/common/types.h>
#include <lsp-plug.in/common/status.h>

namespace lsp
{
    namespace resource
    {
        /**
         * The maximum number of characters appended to the replay buffer
         * if the character repeat at the tail is used.
         */
        static const size_t REPEAT_BUF_MAX          = 4;

        /**
         * Location in the buffer
         */
        typedef struct location_t
        {
            ssize_t     offset;     // Offset relative to the buffer
            size_t      len;        // Length of the block
            size_t      repeat;     // Number of repeats
        } location_t;

        /**
         * Compression buffer
         */
        typedef struct cbuffer_t
        {
            public:
                uint8_t    *data;       // Buffer data (2 x capacity)
                uint32_t   *index;      // Index
                uint32_t   *root;       // Root index
                uint32_t    head;       // Head of the buffer
                uint32_t    length;     // Buffer length
                uint32_t    cap;        // Buffer capacity

            public:
                explicit cbuffer_t();
                ~cbuffer_t();

                status_t        init(size_t capacity);
                void            destroy();

            public:
                /**
                 * Append buffer to compression buffer
                 * @param src buffer to append
                 * @param count the length of the buffer to append
                 */
                void            append(const void *src, size_t count);

                /**
                 * Append single byte to compression buffer
                 * @param v byte to append
                 */
                void            append(uint8_t v);

                /**
                 * Lookup for byte sequence inside of the buffer
                 * @param out relative offset of the sub-sequence in the buffer to the last byte stored in the buffer
                 * @param src byte sequence to search inside of the buffer
                 * @param avail number of bytes available in the sequence
                 * @return the length of sub-sequence found in the buffer
                 */
                size_t          lookup(size_t *out, const void *src, size_t avail);

                /**
                 * Get byte relative to the last written byte
                 * @param offset offset relative to the last written byte
                 * @return byte
                 */
                uint8_t         byte_at(size_t offset);

                /**
                 * Cleanup state of the buffer
                 */
                void            clear();

                /**
                 * Get size of data currently stored in the buffer
                 * @return size of data currently stored in the buffer
                 */
                inline size_t   size() const { return lsp_min(length, cap); }

        } cbuffer_t;

        /**
         * Decompression buffer
         */
        typedef struct dbuffer_t
        {
            public:
                uint8_t    *data;       // Buffer data (2 x capacity)
                uint32_t    length;     // Actual size of buffer
                uint32_t    head;       // Head of the buffer
                uint32_t    cap;        // Buffer capacity

            public:
                explicit dbuffer_t();
                ~dbuffer_t();

                status_t        init(size_t capacity);
                void            destroy();

            public:
                /**
                 * Extract data from buffer
                 * @param dst destination pointer to store result
                 * @param offset relative offset of the subsequence in the buffer to the last byte store in the buffer
                 * @param count number of bytes to extract
                 * @return status of operation (error on buffer underflow)
                 */
                status_t        extract(void *dst, size_t offset, size_t count);

                /**
                 * Append multiple bytes to the buffer
                 * @param src data to append to the buffer
                 * @param count number of bytes to append
                 */
                void            append(const void *src, size_t count);

                /**
                 * Append single byte to the buffer
                 * @param v byt to append
                 */
                void            append(uint8_t v);

                /**
                 * Clear buffer state
                 */
                void            clear();

                /**
                 * Get size of data currently stored in the buffer
                 * @return size of data currently stored in the buffer
                 */
                inline size_t   size() const { return length; }

        } duffer_t;

    } /* namespace resource */
} /* namespace lsp */



#endif /* LSP_PLUG_IN_RESOURCE_BUFFER_H_ */