1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.core.helpers;
15
16 import java.util.ArrayList;
17 import java.util.List;
18
19
20
21
22
23
24
25
26
27 public class CyclicBuffer<E> {
28
29 E[] ea;
30 int first;
31 int last;
32 int numElems;
33 int maxSize;
34
35
36
37
38
39
40
41
42
43 public CyclicBuffer(int maxSize) throws IllegalArgumentException {
44 if (maxSize < 1) {
45 throw new IllegalArgumentException("The maxSize argument (" + maxSize
46 + ") is not a positive integer.");
47 }
48 init(maxSize);
49 }
50
51 public CyclicBuffer(CyclicBuffer<E> other) {
52 this.maxSize = other.maxSize;
53 ea = (E[]) new Object[maxSize];
54 System.arraycopy(other.ea, 0, this.ea, 0, maxSize);
55 this.last = other.last;
56 this.first = other.first;
57 this.numElems = other.numElems;
58 }
59
60 @SuppressWarnings("unchecked")
61 private void init(int maxSize) {
62 this.maxSize = maxSize;
63 ea = (E[]) new Object[maxSize];
64 first = 0;
65 last = 0;
66 numElems = 0;
67 }
68
69
70
71
72 public void clear() {
73 init(this.maxSize);
74 }
75
76
77
78
79
80 public void add(E event) {
81 ea[last] = event;
82 if (++last == maxSize)
83 last = 0;
84
85 if (numElems < maxSize)
86 numElems++;
87 else if (++first == maxSize)
88 first = 0;
89 }
90
91
92
93
94
95
96 public E get(int i) {
97 if (i < 0 || i >= numElems)
98 return null;
99
100 return ea[(first + i) % maxSize];
101 }
102
103 public int getMaxSize() {
104 return maxSize;
105 }
106
107
108
109
110
111 public E get() {
112 E r = null;
113 if (numElems > 0) {
114 numElems--;
115 r = ea[first];
116 ea[first] = null;
117 if (++first == maxSize)
118 first = 0;
119 }
120 return r;
121 }
122
123 public List<E> asList() {
124 List<E> tList = new ArrayList<E>();
125 for(int i = 0; i < length(); i++) {
126 tList.add(get(i));
127 }
128 return tList;
129 }
130
131
132
133
134
135 public int length() {
136 return numElems;
137 }
138
139
140
141
142
143
144
145 @SuppressWarnings("unchecked")
146 public void resize(int newSize) {
147 if (newSize < 0) {
148 throw new IllegalArgumentException("Negative array size [" + newSize
149 + "] not allowed.");
150 }
151 if (newSize == numElems)
152 return;
153
154
155 E[] temp = (E[]) new Object[newSize];
156
157 int loopLen = newSize < numElems ? newSize : numElems;
158
159 for (int i = 0; i < loopLen; i++) {
160 temp[i] = ea[first];
161 ea[first] = null;
162 if (++first == numElems)
163 first = 0;
164 }
165 ea = temp;
166 first = 0;
167 numElems = loopLen;
168 maxSize = newSize;
169 if (loopLen == newSize) {
170 last = 0;
171 } else {
172 last = loopLen;
173 }
174 }
175 }