OSDN Git Service

Add new source files
[armadillo/armadillo1.git] / src / jp / sfjp / armadillo / io / ByteQueue.java
1 package jp.sfjp.armadillo.io;
2
3 public final class ByteQueue {
4
5     private static final int DEFAULT_CAPACITY = 8192;
6
7     private int p;
8     private int q; // len
9     private byte[] buffer;
10
11     public ByteQueue() {
12         this(DEFAULT_CAPACITY);
13     }
14
15     public ByteQueue(int initialiCapacity) {
16         this.p = 0;
17         this.q = 0;
18         this.buffer = new byte[initialiCapacity];
19     }
20
21     public int size() {
22         return this.q;
23     }
24
25     public void enqueue(byte[] bytes) {
26         enqueue(bytes, 0, bytes.length);
27     }
28
29     public void enqueue(byte[] bytes, int offset, int length) {
30         final int requiredLength = buffer.length - q;
31         if (length > requiredLength)
32             if (!ensureBuffer(length))
33                 throw new IllegalStateException("failed to ensure buffer");
34         System.arraycopy(bytes, offset, buffer, p + q, length);
35         q += length;
36     }
37
38     public byte[] dequeue(int length) {
39         byte[] bytes = new byte[length];
40         dequeue(bytes, 0, length);
41         return bytes;
42     }
43
44     public void dequeue(byte[] bytes) {
45         dequeue(bytes, 0, bytes.length);
46     }
47
48     public void dequeue(byte[] bytes, int offset, int length) {
49         if (q < length)
50             throw new IllegalStateException(String.format("required=%d, qsize=%d", length, q));
51         trimHead();
52         System.arraycopy(buffer, p, bytes, 0, length);
53         p += length;
54         q -= length;
55     }
56
57     public boolean ensureBuffer(int length) {
58         final int oldLength = buffer.length;
59         final int newSize;
60         if (length > DEFAULT_CAPACITY)
61             newSize = oldLength + (length / DEFAULT_CAPACITY + 1) * DEFAULT_CAPACITY;
62         else
63             newSize = oldLength + 8192;
64         byte[] bytes = new byte[newSize];
65         System.arraycopy(buffer, 0, bytes, 0, oldLength);
66         buffer = bytes;
67         return buffer.length >= length + q;
68     }
69
70     public void trimHead() {
71         if (p == 0)
72             return;
73         final int size = q - p;
74         if (size < DEFAULT_CAPACITY / 2 && buffer.length > DEFAULT_CAPACITY * 4) {
75             byte[] bytes = new byte[DEFAULT_CAPACITY];
76             System.arraycopy(buffer, p, bytes, 0, size);
77             buffer = bytes;
78         }
79         else {
80             byte[] bytes = new byte[size];
81             System.arraycopy(buffer, p, bytes, 0, size);
82             System.arraycopy(bytes, 0, buffer, 0, size);
83         }
84         p = 0;
85         q = size;
86     }
87
88 }