Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
RishiRecon
GitHub Repository: RishiRecon/exploits
Path: blob/main/misc/emulator/xnes/snes9x/apu/ring_buffer.h
28798 views
1
/* Simple byte-based ring buffer. Licensed under public domain (C) BearOso. */
2
3
#ifndef __RING_BUFFER_H
4
#define __RING_BUFFER_H
5
6
#include <string.h>
7
8
#undef MIN
9
#define MIN(a, b) ((a) < (b) ? (a) : (b))
10
11
class ring_buffer
12
{
13
protected:
14
int size;
15
int buffer_size;
16
int start;
17
unsigned char *buffer;
18
19
public:
20
ring_buffer (int buffer_size)
21
{
22
this->buffer_size = buffer_size;
23
buffer = new unsigned char[this->buffer_size];
24
memset (buffer, 0, this->buffer_size);
25
26
size = 0;
27
start = 0;
28
}
29
30
~ring_buffer (void)
31
{
32
delete[] buffer;
33
}
34
35
bool
36
push (unsigned char *src, int bytes)
37
{
38
if (space_empty () < bytes)
39
return false;
40
41
int end = (start + size) % buffer_size;
42
int first_write_size = MIN (bytes, buffer_size - end);
43
44
memcpy (buffer + end, src, first_write_size);
45
46
if (bytes > first_write_size)
47
memcpy (buffer, src + first_write_size, bytes - first_write_size);
48
49
size += bytes;
50
51
return true;
52
}
53
54
bool
55
pull (unsigned char *dst, int bytes)
56
{
57
if (space_filled () < bytes)
58
return false;
59
60
memcpy (dst, buffer + start, MIN (bytes, buffer_size - start));
61
62
if (bytes > (buffer_size - start))
63
memcpy (dst + (buffer_size - start), buffer, bytes - (buffer_size - start));
64
65
start = (start + bytes) % buffer_size;
66
size -= bytes;
67
68
return true;
69
}
70
71
inline int
72
space_empty (void)
73
{
74
return buffer_size - size;
75
}
76
77
inline int
78
space_filled (void)
79
{
80
return size;
81
}
82
83
void
84
clear (void)
85
{
86
start = 0;
87
size = 0;
88
memset (buffer, 0, buffer_size);
89
}
90
91
void
92
resize (int size)
93
{
94
delete[] buffer;
95
buffer_size = size;
96
buffer = new unsigned char[buffer_size];
97
memset (buffer, 0, this->buffer_size);
98
99
size = 0;
100
start = 0;
101
}
102
103
inline void
104
cache_silence (void)
105
{
106
clear ();
107
size = buffer_size;
108
}
109
};
110
111
#endif
112
113