1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package org.perfidix.example;
31
32 import static org.junit.Assert.assertEquals;
33
34 import java.util.Random;
35 import java.util.Stack;
36
37 import org.junit.BeforeClass;
38 import org.junit.Test;
39 import org.perfidix.annotation.BeforeBenchClass;
40 import org.perfidix.annotation.BenchClass;
41
42 @BenchClass(runs = 100)
43 public class FastIntStackTest {
44
45 private static int[] data = new int[15];
46
47 @BeforeBenchClass
48 @BeforeClass
49 public static void beforeClass() {
50 for (int i = 0; i < data.length; i++) {
51 data[i] = new Random().nextInt();
52 }
53 }
54
55 @Test
56 public void myStackTest() {
57 final FastIntStack myStack = new FastIntStack();
58 for (int i = 0; i < data.length; i++) {
59 myStack.push(data[i]);
60 }
61 for (int i = data.length - 1; i > 0; i--) {
62 assertEquals(data[i], myStack.pop());
63 }
64 }
65
66 @Test
67 public void normalStackTest() {
68 final Stack<Integer> normalStack = new Stack<Integer>();
69 for (int i = 0; i < data.length; i++) {
70 normalStack.push(data[i]);
71 }
72 for (int i = data.length - 1; i > 0; i--) {
73 assertEquals(data[i], normalStack.pop().intValue());
74 }
75 }
76
77 final class FastIntStack {
78
79 private int[] stack;
80
81 private int size;
82
83 FastIntStack() {
84 stack = new int[32];
85 size = 0;
86 }
87
88 final void push(final int element) {
89 if (stack.length == size) {
90 int[] biggerStack = new int[stack.length << 1];
91 System.arraycopy(stack, 0, biggerStack, 0, stack.length);
92 stack = biggerStack;
93 }
94 stack[size++] = element;
95 }
96
97 final int peek() {
98 return stack[size - 1];
99 }
100
101 final int get(final int position) {
102 return stack[position];
103 }
104
105 final int pop() {
106 return stack[--size];
107 }
108
109 final void clear() {
110 size = 0;
111 }
112
113 final int size() {
114 return size;
115 }
116
117 }
118 }