uLib  User mode C/C++ extended API library for Win32 programmers.
RingBuffer.h
Go to the documentation of this file.
1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 // Project: uLib - User mode library.
3 // Module: RingBuffer -- A simple circular FIFO data buffer.
4 // Author: Copyright (c) Love Nystrom
5 // License: NNOSL (BSD descendant, see NNOSL.txt in the base directory).
6 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7 
8 #ifndef __RingBuffer_h_incl__
9 #define __RingBuffer_h_incl__
10 
11 #include <uLib/Common.h>
12 
13 //==---------------------------------------------------------------------------
23 //==---------------------------------------------------------------------------
25 
33 
34 class RingBuffer {
35 public:
36  PVOID UserData;
37 
38  RingBuffer( PBYTE Array, UINT Size );
39  RingBuffer( UINT Size );
40  ~RingBuffer();
41 
44 
45  void Attach( PBYTE Array, UINT Size );
46 
47  void Clear();
48  void Discard( UINT nBytes );
49 
50  UINT Used();
51  UINT Unused();
52  bool Empty();
53  bool Full() { return _full; }
54  UINT Size() { return _size; }
55 
56  //PBYTE HeadPtr() { return _buffer + _head; } //!< @dt Current insert point.
57  //PBYTE TailPtr() { return _buffer + _tail; } //!< @dt Current fetch point.
58 
59  bool Get( BYTE* Data );
60  bool Put( BYTE Data );
61  bool GetBlock( BYTE* Data, UINT nBytes );
62  bool PutBlock( BYTE* Data, UINT nBytes );
63 
64  bool GetWord( WORD* Data ) { return GetBlock( (PBYTE)Data, sizeof(WORD) ); }
65  bool GetDWord( DWORD* Data ) { return GetBlock( (PBYTE)Data, sizeof(DWORD) ); }
66  bool GetQWord( UINT64* Data ) { return GetBlock( (PBYTE)Data, sizeof(UINT64) ); }
67 
68  bool PutWord( WORD Data ) { return PutBlock( (PBYTE)&Data, sizeof(WORD) ); }
69  bool PutDWord( DWORD Data ) { return PutBlock( (PBYTE)&Data, sizeof(DWORD) ); }
70  bool PutQWord( UINT64 Data ) { return PutBlock( (PBYTE)&Data, sizeof(UINT64) ); }
71 
77 
78  bool GetStr( ASTR Buf, UINT BufLen );
79 
84 
85  bool PutStr( ACSTR Str, UINT Len=0 );
86 
97 
98  BYTE& operator[]( UINT Index );
99 
100 protected:
102  PBYTE _buffer; // Data buffer.
103  UINT _head; // Write index.
104  UINT _tail; // Read index.
105  UINT _size; // For bounds check.
106  bool _full; // Without a flag the buffer can only use N-1 bytes.
107  bool _dyna; // Buffer was allocated from heap.
109 };
111 // #ifdef __DOXYGEN__
112 // typedef class RingBuffer RingBuffer;
113 // #endif
114 
115 #define EXCEPTION_RINGBUFFER_INVALID_INDEX \
116  MAKE_SOFTEXCEPTION( ERROR_SEVERITY_ERROR, FACILITY_ULIB, ERROR_INVALID_INDEX )
117 
161 #endif //ndef __RingBuffer_h_incl__
163 // EOF
PVOID UserData
Definition: RingBuffer.h:36
unsigned long DWORD
Definition: Common.h:414
bool GetDWord(DWORD *Data)
Definition: RingBuffer.h:65
const char * ACSTR
Definition: Common.h:345
bool GetQWord(UINT64 *Data)
Definition: RingBuffer.h:66
unsigned short WORD
Definition: Common.h:413
bool PutQWord(UINT64 Data)
Definition: RingBuffer.h:70
void Attach(PBYTE Array, UINT Size)
Definition: RingBuffer.cpp:36
BYTE & operator[](UINT Index)
Definition: RingBuffer.cpp:222
bool GetStr(ASTR Buf, UINT BufLen)
Definition: RingBuffer.cpp:145
bool Full()
Definition: RingBuffer.h:53
unsigned char * PBYTE
Definition: Common.h:412
char * ASTR
Definition: Common.h:344
bool PutBlock(BYTE *Data, UINT nBytes)
Definition: RingBuffer.cpp:91
bool GetWord(WORD *Data)
Definition: RingBuffer.h:64
bool PutStr(ACSTR Str, UINT Len=0)
Definition: RingBuffer.cpp:169
bool PutDWord(DWORD Data)
Definition: RingBuffer.h:69
RingBuffer(PBYTE Array, UINT Size)
Definition: RingBuffer.cpp:15
UINT Unused()
Definition: RingBuffer.cpp:212
UINT Size()
Definition: RingBuffer.h:54
UINT Used()
Definition: RingBuffer.cpp:204
RingBuffer * PRingBuffer
Definition: RingBuffer.h:110
unsigned __int64 UINT64
Definition: Common.h:400
void Clear()
Definition: RingBuffer.cpp:183
bool GetBlock(BYTE *Data, UINT nBytes)
Definition: RingBuffer.cpp:118
Common include; Added types, small "ubiquitous" utilities, et c.
bool Put(BYTE Data)
Definition: RingBuffer.cpp:56
void Discard(UINT nBytes)
Definition: RingBuffer.cpp:189
bool Get(BYTE *Data)
Definition: RingBuffer.cpp:44
bool PutWord(WORD Data)
Definition: RingBuffer.h:68
unsigned char BYTE
Definition: Common.h:412
bool Empty()
Definition: RingBuffer.cpp:217