TickerQueue.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: package xeij;
14:
15: public class TickerQueue {
16:
17:
18:
19: public static abstract class Ticker {
20: Ticker () {
21: time = Long.MAX_VALUE;
22: }
23: long time;
24:
25:
26:
27:
28: abstract void tick ();
29: }
30:
31:
32:
33: static final int TKQ_S = 256;
34: static final Ticker[] tkqArray = new Ticker[TKQ_S];
35:
36:
37:
38:
39:
40:
41: static int tkqR;
42: static int tkqW;
43:
44: static final boolean TKQ_NULL = true;
45:
46:
47:
48: public static void tkqInit () {
49:
50: tkqR = 0;
51: tkqW = 0;
52: if (false) {
53: tkqTest ();
54: }
55: }
56:
57:
58:
59:
60: public static void tkqRun (long time) {
61: Ticker ticker;
62: while (tkqR != tkqW &&
63: (ticker = tkqArray[tkqR & (TKQ_S - 1)]).time <= time) {
64: ticker.time = Long.MAX_VALUE;
65: if (TKQ_NULL) {
66: tkqArray[tkqR & (TKQ_S - 1)] = null;
67: }
68: tkqR++;
69: ticker.tick ();
70: }
71: }
72:
73:
74:
75:
76: public static void tkqAdd (Ticker ticker, long time) {
77: tkqRemove (ticker);
78: if ((tkqW - tkqR) == TKQ_S) {
79: throw new Error ("tkqAdd: overflow");
80: }
81: ticker.time = time;
82: int w = tkqW;
83: Ticker t;
84: while (tkqR < w &&
85: time < (t = tkqArray[(w - 1) & (TKQ_S - 1)]).time) {
86: tkqArray[w & (TKQ_S - 1)] = t;
87: w--;
88: }
89: tkqArray[w & (TKQ_S - 1)] = ticker;
90: tkqW++;
91: }
92:
93:
94:
95:
96: public static void tkqRemove (Ticker ticker) {
97: if (ticker.time == Long.MAX_VALUE) {
98: return;
99: }
100: ticker.time = Long.MAX_VALUE;
101: int r = tkqR;
102: while (tkqArray[r & (TKQ_S - 1)] != ticker) {
103: r++;
104: }
105: while (tkqR < r) {
106: tkqArray[r & (TKQ_S - 1)] = tkqArray[(r - 1) & (TKQ_S - 1)];
107: r--;
108: }
109: if (TKQ_NULL) {
110: tkqArray[r & (TKQ_S - 1)] = null;
111: }
112: tkqR++;
113: }
114:
115:
116:
117: static void tkqTest () {
118:
119: int n = 200;
120: Ticker[] a = new Ticker[n];
121: for (int i = 0; i < n; i++) {
122: a[i] = new Ticker () {
123: @Override void tick () {
124: }
125: };
126: }
127:
128: for (int i = 0; i < n; i++) {
129: tkqAdd (a[i], i);
130: }
131: if (tkqW - tkqR != n) {
132: System.out.println ("tkqTest: error 1");
133: return;
134: }
135: for (int i = 0; i < n; i++) {
136: if (tkqArray[(tkqR + i) & (TKQ_S - 1)] != a[i]) {
137: System.out.println ("tkqTest: error 2");
138: return;
139: }
140: }
141:
142: for (int i = 0; i < n; i++) {
143: tkqRemove (a[i]);
144: }
145: if (tkqW - tkqR != 0) {
146: System.out.println ("tkqTest: error 3");
147: return;
148: }
149:
150: for (int i = 0; i < n; i++) {
151: tkqAdd (a[i], i);
152: }
153: if (tkqW - tkqR != n) {
154: System.out.println ("tkqTest: error 4");
155: return;
156: }
157: for (int i = 0; i < n; i++) {
158: if (tkqArray[(tkqR + i) & (TKQ_S - 1)] != a[i]) {
159: System.out.println ("tkqTest: error 5");
160: return;
161: }
162: }
163:
164: for (int i = 0; i < n; i++) {
165: tkqRemove (a[n - 1 - i]);
166: }
167: if (tkqW - tkqR != 0) {
168: System.out.println ("tkqTest: error 6");
169: return;
170: }
171:
172: for (int i = 0; i < n; i++) {
173: tkqAdd (a[n - 1 - i], n - 1 - i);
174: }
175: if (tkqW - tkqR != n) {
176: System.out.println ("tkqTest: error 7");
177: return;
178: }
179: for (int i = 0; i < n; i++) {
180: if (tkqArray[(tkqR + i) & (TKQ_S - 1)] != a[i]) {
181: System.out.println ("tkqTest: error 8");
182: return;
183: }
184: }
185:
186: for (int i = 0; i < n; i++) {
187: tkqRemove (a[i]);
188: }
189: if (tkqW - tkqR != 0) {
190: System.out.println ("tkqTest: error 9");
191: return;
192: }
193:
194: for (int i = 0; i < n; i++) {
195: tkqAdd (a[n - 1 - i], n - 1 - i);
196: }
197: if (tkqW - tkqR != n) {
198: System.out.println ("tkqTest: error 10");
199: return;
200: }
201: for (int i = 0; i < n; i++) {
202: if (tkqArray[(tkqR + i) & (TKQ_S - 1)] != a[i]) {
203: System.out.println ("tkqTest: error 11");
204: return;
205: }
206: }
207:
208: for (int i = 0; i < n; i++) {
209: tkqRemove (a[n - 1 - i]);
210: }
211: if (tkqW - tkqR != 0) {
212: System.out.println ("tkqTest: error 12");
213: return;
214: }
215: }
216:
217: }