mame/3rdparty/bx/include/bx/ringbuffer.h

184 lines
2.9 KiB
C++

/*
* Copyright 2010-2018 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bx#license-bsd-2-clause
*/
#ifndef BX_RINGBUFFER_H_HEADER_GUARD
#define BX_RINGBUFFER_H_HEADER_GUARD
#include "bx.h"
#include "cpu.h"
#include "uint32_t.h"
namespace bx
{
///
class RingBufferControl
{
BX_CLASS(RingBufferControl
, NO_COPY
, NO_ASSIGNMENT
);
public:
///
RingBufferControl(uint32_t _size);
///
~RingBufferControl();
///
uint32_t available() const;
///
uint32_t consume(uint32_t _size); // consumer only
///
uint32_t reserve(uint32_t _size, bool _mustSucceed = false); // producer only
///
uint32_t commit(uint32_t _size); // producer only
///
uint32_t distance(uint32_t _from, uint32_t _to) const; // both
///
void reset();
const uint32_t m_size;
uint32_t m_current;
uint32_t m_write;
uint32_t m_read;
};
///
class SpScRingBufferControl
{
BX_CLASS(SpScRingBufferControl
, NO_COPY
, NO_ASSIGNMENT
);
public:
///
SpScRingBufferControl(uint32_t _size);
///
~SpScRingBufferControl();
///
uint32_t available() const;
///
uint32_t consume(uint32_t _size); // consumer only
///
uint32_t reserve(uint32_t _size); // producer only
///
uint32_t commit(uint32_t _size); // producer only
///
uint32_t distance(uint32_t _from, uint32_t _to) const; // both
///
void reset();
const uint32_t m_size;
uint32_t m_current;
uint32_t m_write;
uint32_t m_read;
};
///
template <typename ControlT>
class ReadRingBufferT
{
BX_CLASS(ReadRingBufferT
, NO_DEFAULT_CTOR
, NO_COPY
, NO_ASSIGNMENT
);
public:
///
ReadRingBufferT(ControlT& _control, const char* _buffer, uint32_t _size);
///
~ReadRingBufferT();
///
void end();
///
void read(char* _data, uint32_t _len);
///
void skip(uint32_t _len);
private:
template <typename Ty>
friend class WriteRingBufferT;
ControlT& m_control;
uint32_t m_read;
uint32_t m_end;
const uint32_t m_size;
const char* m_buffer;
};
///
typedef ReadRingBufferT<RingBufferControl> ReadRingBuffer;
///
typedef ReadRingBufferT<SpScRingBufferControl> SpScReadRingBuffer;
///
template <typename ControlT>
class WriteRingBufferT
{
BX_CLASS(WriteRingBufferT
, NO_DEFAULT_CTOR
, NO_COPY
, NO_ASSIGNMENT
);
public:
///
WriteRingBufferT(ControlT& _control, char* _buffer, uint32_t _size);
///
~WriteRingBufferT();
///
void end();
///
void write(const char* _data, uint32_t _len);
///
void write(ReadRingBufferT<ControlT>& _read, uint32_t _len);
///
void skip(uint32_t _len);
private:
ControlT& m_control;
uint32_t m_write;
uint32_t m_end;
const uint32_t m_size;
char* m_buffer;
};
///
typedef WriteRingBufferT<RingBufferControl> WriteRingBuffer;
///
typedef WriteRingBufferT<SpScRingBufferControl> SpScWriteRingBuffer;
} // namespace bx
#include "inline/ringbuffer.inl"
#endif // BX_RINGBUFFER_H_HEADER_GUARD