1 /*
2 * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the <organization> nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE EARLIER MENTIONED AUTHORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #include "CircularBuffer.h"
29 #include "Printer.h"
30 #include <stddef.h>
31
CircularBuffer(int _capacity)32 CircularBuffer::CircularBuffer(int _capacity) :
33 index(0), outdex(0), capacity(_capacity), empty(true), full(false)
34 {
35 buffer = new int[(size_t) this->capacity];
36 }
37
~CircularBuffer()38 CircularBuffer::~CircularBuffer()
39 {
40 delete[] buffer;
41 }
42
IsEmpty()43 bool CircularBuffer::IsEmpty()
44 {
45 return empty;
46 }
47
IsFull()48 bool CircularBuffer::IsFull()
49 {
50 return full;
51 }
52
Put(int i)53 void CircularBuffer::Put(int i)
54 {
55 empty = false;
56 buffer[index] = i;
57 index = Next(index);
58 if (full) outdex = Next(outdex);
59 else if (index == outdex) full = true;
60 }
61
Get()62 int CircularBuffer::Get()
63 {
64 int result = -1;
65 full = false;
66
67 if (!empty) {
68 result = buffer[outdex];
69 outdex = Next(outdex);
70 if (outdex == index) empty = true;
71 }
72 return result;
73 }
74
Capacity()75 int CircularBuffer::Capacity()
76 {
77 return capacity;
78 }
79
Next(int i)80 int CircularBuffer::Next(int i)
81 {
82 if (++i >= capacity) i = 0;
83 return i;
84 }
85
Print(Printer * p)86 void CircularBuffer::Print(Printer* p)
87 {
88 p->Print("Circular buffer content:\n<");
89
90 int printIndex = outdex;
91 int count = index - outdex;
92
93 if (!empty && (index <= outdex)) count = capacity - (outdex - index);
94
95 for (int i = 0; i < count; i++) {
96 p->Print(buffer[printIndex]);
97 printIndex = Next(printIndex);
98 if (i + 1 != count) p->Print(", ");
99 }
100 p->Print(">\n");
101 }
102