1 #include "WindowedFifo.h"
\r
6 WindowedFifo::WindowedFifo(unsigned size = 20) {
\r
7 //std::cout << "Create WindowedFifo." << std::endl;
\r
9 _buffer = new char[_size];
\r
15 //indicates whether Fifo is empty or full if _head == _tail
\r
17 _isHeadReserved = false;
\r
18 _isTailReserved = false;
\r
24 WindowedFifo::~WindowedFifo() {
\r
25 //std::cout << "Delete WindowedFifo." << std::endl;
\r
33 //std::cout << "Deleted WindowedFifo." << std::endl;
\r
39 unsigned WindowedFifo::reserve(void** dest, unsigned len) {
\r
40 char** destination = (char**)dest;
\r
41 //std::cout << "Attempt to reserve " << len << " bytes." << std::endl;
\r
43 //can only reserve once piece at a time
\r
44 if (_isHeadReserved) {
\r
49 //reserve at most as much memory as still available in the buffer
\r
50 unsigned write = (len <= _size - _use ? len : _size - _use);
\r
53 //if wrap-around in buffer: return only buffer for the
\r
54 //contiguous buffer space
\r
55 if (_head + write > _size) {
\r
56 write = _size - _head;
\r
59 _headRoom = (_head + write) == _size? 0 : _head + write;
\r
60 *destination = &(_buffer[_head]);
\r
61 _isHeadReserved = true;
\r
64 //std::cout << "Reserved " << write << " bytes." << std::endl;
\r
65 _writeReserve = write;
\r
72 void WindowedFifo::release() {
\r
73 if (_isHeadReserved) {
\r
74 //std::cout << "Released " << _headRoom - _head << " bytes." << std::endl;
\r
76 _use += _writeReserve;
\r
77 _isHeadReserved = false;
\r
84 unsigned WindowedFifo::capture(void **dest, unsigned len) {
\r
85 char** destination = (char**)dest;
\r
86 //std::cout << "Attempt to capture " << len << " bytes." << std::endl;
\r
88 if (_isTailReserved) {
\r
89 //std::cout << "Only one attempt to capture allowed." << std::endl;
\r
94 //capture at most as much data as available in the buffer
\r
95 unsigned read = (len <= _use ? len : _use);
\r
98 //if wrap-around in buffer: return only buffer for the
\r
99 //conntiguous buffer space
\r
100 if (_tail + read> _size) {
\r
101 read = _size - _tail;
\r
104 _tailRoom = (_tail + read) == _size ? 0 : _tailRoom = _tail + read;
\r
105 *destination = &(_buffer[_tail]);
\r
106 _isTailReserved = true;
\r
109 //std::cout << "Captured " << read << " bytes." << std::endl;
\r
111 _readReserve = read;
\r
118 void WindowedFifo::consume() {
\r
119 if (_isTailReserved) {
\r
120 //std::cout << "Consumed " << _tailRoom - _tail << " bytes." << std::endl;
\r
122 _use -= _readReserve;
\r
123 _isTailReserved = false;
\r
130 unsigned WindowedFifo::size() const {
\r
137 unsigned WindowedFifo::unused() const {
\r
138 return _size - _use;
\r
144 unsigned WindowedFifo::used() const {
\r
149 * Test the implementation
\r
152 #include <iostream>
\r
154 using namespace std;
\r
157 WindowedFifo *myFifo = new WindowedFifo(16);
\r
161 int x = myFifo->reserve((void**)&buf1, 8);
\r
165 int y = myFifo->capture((void**)&buf2, 8);
\r
166 std::cout << "read " << *buf2 << " " << *(buf2 + 1) << std::endl;
\r
169 for (int j = 0; j < 3; j++) {
\r
170 for (int i = 0; i < 6; i++) {
\r
171 std::cout << "write " << i << " to Fifo. ";
\r
172 int write = myFifo->reserve((void**)&buf1, sizeof(int));
\r
173 if (write == sizeof(int)) {
\r
176 std::cout << "used: " << std::setw(2) << myFifo->used()
\r
177 << ", unused: " << std::setw(2) << myFifo->unused()
\r
178 << ", size: " << std::setw(2) << myFifo->size()
\r
181 std::cout << std::endl;
\r
184 for (int i = 0; i < 16; i++) {
\r
186 int read = myFifo->capture((void**)&buf3, sizeof(char));
\r
187 if (read == sizeof(char)) {
\r
188 std::cout << "read " << (unsigned)*buf3 << " from Fifo ";
\r
189 std::cout << "used: " << std::setw(2) << myFifo->used()
\r
190 << ", unused: " << std::setw(2) << myFifo->unused()
\r
191 << ", size: " << std::setw(2) << myFifo->size()
\r
195 std::cout << "read nothing from Fifo." << std::endl;
\r