YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
FIFO.h
1
2#ifndef _FIFO_H_
3#define _FIFO_H_
4
5#include <cassert>
6#include <cstddef>
7
8template<typename T>
9class FIFO {
10public:
11 FIFO(size_t size)
12 : _buffer_size(size), _buffer(new T[_buffer_size]),
13 _need_wrap(_buffer + _buffer_size), _get_ptr(_buffer), _put_ptr(_buffer)
14 {
15 assert( _buffer != nullptr);
16 }
17
18 ~FIFO() {
19 delete [] _buffer;
20 }
21
22 bool get(T & data) volatile {
23 if (_get_ptr == _put_ptr) {
24 return false;
25 }
26 T * nextget = _get_ptr + 1;
27 if (nextget == _need_wrap) {
28 nextget = _buffer;
29 }
30 data = *_get_ptr;
31 _get_ptr = nextget;
32 return true;
33 }
34
35 bool put(const T & data) volatile {
36 T * nextput = _put_ptr + 1;
37 if (nextput == _need_wrap){
38 nextput = _buffer;
39 }
40 if (nextput == _get_ptr) {
41 return false;
42 } else {
43 *_put_ptr = data;
44 _put_ptr = nextput;
45 }
46 return true;
47 }
48
49 size_t available_get() volatile {
50 int res = _put_ptr - _get_ptr;
51 if (res < 0) {
52 res += _buffer_size;
53 }
54 return res;
55 }
56
57 size_t available_put() volatile {
58 return _buffer_size - available_get() - 1;
59 }
60
61 void clear() {
62 _get_ptr = _buffer;
63 _put_ptr = _buffer;
64 }
65
66private:
67
68 size_t _buffer_size;
69 T * _buffer;
70 T * _need_wrap;
71 T * _get_ptr;
72 T * _put_ptr;
73};
74
75#endif // _FIFO_H_ */
Definition FIFO.h:9