dol: initial dol commit
[jump.git] / dol / src / dol / visitor / protothread / lib / Fifo.cpp
1 #include "Fifo.h"\r
2 \r
3 /**\r
4  *\r
5  */\r
6 Fifo::Fifo(unsigned size = 18) {\r
7     //std::cout << "Create Fifo." << std::endl;\r
8     _size = size;\r
9     _buffer = new char[_size];\r
10     _use = 0; \r
11     _tail = 0;\r
12 }\r
13 \r
14 /**\r
15  *\r
16  */\r
17 Fifo::~Fifo() {\r
18     //std::cout << "Delete Fifo." << std::endl;\r
19     if (_buffer) {\r
20         delete _buffer;\r
21     }\r
22     _buffer = 0;\r
23     _use = 0; \r
24     _tail = 0;\r
25     //std::cout << "Deleted Fifo." << std::endl;\r
26 }\r
27 \r
28 /**\r
29  *\r
30  */\r
31 unsigned Fifo::read(void *destination, unsigned len) {\r
32     char* buffer = (char*)destination;\r
33     unsigned read = (len <= _use ? len : 0);\r
34     //std::cout << "Try to read " << len << " bytes from Fifo." << std::endl;\r
35 \r
36     if (_tail + read <= _size) {\r
37         memcpy(buffer, _buffer + _tail, read);\r
38     }\r
39     else {\r
40         memcpy(buffer, _buffer + _tail, _size - _tail);\r
41         memcpy(buffer + _size - _tail, _buffer, read - _size + _tail);\r
42     }\r
43 \r
44     _tail = (_tail + read) % _size;\r
45     _use -= read;\r
46     //std::cout << "Read " << read << " bytes from Fifo." << std::endl;\r
47     return read;\r
48 }\r
49 \r
50 /**\r
51  *\r
52  */\r
53 unsigned Fifo::write(const void *source, unsigned len) {\r
54     char* buffer = (char*)source;\r
55     unsigned write = (len <= unused() ? len : 0);\r
56     unsigned head = (_tail + _use) % _size;\r
57     //std::cout << "Try to write " << len << " bytes to Fifo." << std::endl;\r
58 \r
59     if (head + write <= _size) {\r
60         memcpy(_buffer + head, buffer, write);\r
61     }\r
62     else {\r
63         memcpy(_buffer + head, buffer, _size - head);\r
64         memcpy(_buffer, buffer + _size - head, write - _size + head);\r
65     }\r
66 \r
67     _use += write;\r
68     //std::cout << "Wrote " << write << " bytes to Fifo." << std::endl;\r
69     return write;\r
70 }\r
71 \r
72 /**\r
73  *\r
74  */\r
75 unsigned Fifo::size() const {\r
76     return (_size);\r
77 }\r
78 \r
79 /**\r
80  *\r
81  */\r
82 unsigned Fifo::unused() const {\r
83     return (_size) - _use;\r
84 }\r
85 \r
86 /**\r
87  *\r
88  */\r
89 unsigned Fifo::used() const {\r
90     return _use; \r
91 }\r
92 \r
93 /**\r
94  * Test the implementation\r
95  */\r
96 /*\r
97 int main() {\r
98     std::cout.width(5);\r
99     Fifo *myFifo = new Fifo();\r
100     for (int j = 0; j < 3; j++) {\r
101         for (int i = 0; i < 6; i++) {\r
102             std::cout << "write " << i << " to Fifo.    ";\r
103             int write = myFifo->write(&i, sizeof(int));\r
104             printf(" %d ", write);\r
105             if (write == sizeof(int)) {\r
106                 std::cout << "used: " << std::setw(2) << myFifo->used()\r
107                         << ", unused: " << std::setw(2) << myFifo->unused()\r
108                         << ", size: "  << std::setw(2) << myFifo->size()\r
109                         << std::endl;\r
110             } else {\r
111                 std::cout << std::endl;\r
112             }\r
113         }\r
114         for (int i = 0; i < 6; i++) {\r
115             int value;\r
116             int read = myFifo->read(&value, sizeof(int));\r
117             printf(" %d ", read);\r
118             if (read == sizeof(int)) {\r
119                 std::cout << "read " << value << "  from Fifo   ";\r
120                 std::cout << "used: " << std::setw(2) << myFifo->used()\r
121                         << ", unused: " << std::setw(2) << myFifo->unused()\r
122                         << ", size: "  << std::setw(2) << myFifo->size()\r
123                         << std::endl;\r
124             }\r
125         }\r
126     }\r
127     delete myFifo;\r
128     return 0;\r
129 }\r
130 */\r