Path: blob/main/misc/emulator/xnes/snes9x/apu/ring_buffer.h
28798 views
/* Simple byte-based ring buffer. Licensed under public domain (C) BearOso. */12#ifndef __RING_BUFFER_H3#define __RING_BUFFER_H45#include <string.h>67#undef MIN8#define MIN(a, b) ((a) < (b) ? (a) : (b))910class ring_buffer11{12protected:13int size;14int buffer_size;15int start;16unsigned char *buffer;1718public:19ring_buffer (int buffer_size)20{21this->buffer_size = buffer_size;22buffer = new unsigned char[this->buffer_size];23memset (buffer, 0, this->buffer_size);2425size = 0;26start = 0;27}2829~ring_buffer (void)30{31delete[] buffer;32}3334bool35push (unsigned char *src, int bytes)36{37if (space_empty () < bytes)38return false;3940int end = (start + size) % buffer_size;41int first_write_size = MIN (bytes, buffer_size - end);4243memcpy (buffer + end, src, first_write_size);4445if (bytes > first_write_size)46memcpy (buffer, src + first_write_size, bytes - first_write_size);4748size += bytes;4950return true;51}5253bool54pull (unsigned char *dst, int bytes)55{56if (space_filled () < bytes)57return false;5859memcpy (dst, buffer + start, MIN (bytes, buffer_size - start));6061if (bytes > (buffer_size - start))62memcpy (dst + (buffer_size - start), buffer, bytes - (buffer_size - start));6364start = (start + bytes) % buffer_size;65size -= bytes;6667return true;68}6970inline int71space_empty (void)72{73return buffer_size - size;74}7576inline int77space_filled (void)78{79return size;80}8182void83clear (void)84{85start = 0;86size = 0;87memset (buffer, 0, buffer_size);88}8990void91resize (int size)92{93delete[] buffer;94buffer_size = size;95buffer = new unsigned char[buffer_size];96memset (buffer, 0, this->buffer_size);9798size = 0;99start = 0;100}101102inline void103cache_silence (void)104{105clear ();106size = buffer_size;107}108};109110#endif111112113