Libraryless. Click here for Pure Java version (4986L/28K).
1 | // We effectively turn the stream into a non-blocking stream. |
2 | // There is the addition isEOF() to check whether an actual |
3 | // stream end has been reached (true) or whether we are just |
4 | // waiting for more data (false). |
5 | |
6 | // To make from ByteArraysPartialInputStream: |
7 | // Drop @Override |
8 | // short => byte |
9 | // ubyteToInt => id |
10 | // noElement => Int.MIN_VALUE |
11 | |
12 | sclass ArraysShortStream extends ShortInputStream {
|
13 | sclass State {
|
14 | long absolutePosition; |
15 | int ofs; |
16 | MinimalChain<short[]> chain; |
17 | |
18 | *(long *absolutePosition, int *ofs, MinimalChain<short[]> *chain) {}
|
19 | |
20 | short[] data() { ret chain!; }
|
21 | int nBytes() { ret l(data()); }
|
22 | bool exhausted() { ret ofs >= nBytes(); }
|
23 | |
24 | toString {
|
25 | ret withIdentity(this, "State" + bracketed( |
26 | renderVars(+ofs, +nBytes(), next := chain.next))); } |
27 | } |
28 | |
29 | bool debug, eof; |
30 | MinimalChain<short[]> last = new MinimalChain(null); |
31 | State state = new(0, 0, last); |
32 | long remaining; |
33 | State mark; |
34 | |
35 | public synchronized void readFully(short[] buf, int off, int n) throws IOException {
|
36 | if (debug) printFunctionCall readFully(buf, off, n); |
37 | if (n == 0) ret; |
38 | if (n > available()) |
39 | throw new EOFException(); |
40 | assertEquals(n, read(buf, off, n)); |
41 | } |
42 | |
43 | public synchronized int read(short[] buf, int off, int len) throws IOException {
|
44 | if (debug) printFunctionCall read(buf, off, len); |
45 | len = min(len, available()); |
46 | if (len == 0) ret -1; |
47 | int n = 0; |
48 | |
49 | while (state.chain != last) {
|
50 | int nChunk = state.nBytes(); |
51 | int inChunk = min(len, nChunk-state.ofs); |
52 | int copiedFrom = state.ofs, nBytes = state.nBytes(); |
53 | arraycopy(state.data(), copiedFrom, buf, off, inChunk); |
54 | n += inChunk; |
55 | off += inChunk; |
56 | len -= inChunk; |
57 | state.ofs += inChunk; |
58 | state.absolutePosition += inChunk; |
59 | remaining -= inChunk; |
60 | if (debug) printVars(nBytes := state.nBytes(), +copiedFrom, +nChunk, +inChunk, +n, +off, +len); |
61 | if (state.exhausted()) |
62 | state = new State(state.absolutePosition, 0, state.chain.next); |
63 | else |
64 | break; |
65 | } |
66 | |
67 | ret n; |
68 | } |
69 | |
70 | public synchronized int available() { ret clampToInt(remaining); }
|
71 | |
72 | public synchronized int read() throws IOException {
|
73 | if (debug) printFunctionCall read(); |
74 | while ping (true) {
|
75 | if (!state.exhausted()) {
|
76 | ++state.absolutePosition; |
77 | --remaining; |
78 | ret state.chain![state.ofs++]; |
79 | } |
80 | |
81 | if (state.chain.next == null) |
82 | ret noElement(); |
83 | |
84 | state = new State(0, 0, state.chain.next); |
85 | } |
86 | } |
87 | |
88 | static int noElement() { ret Int.MIN_VALUE; }
|
89 | |
90 | public synchronized void add aka write(short[] buffer) {
|
91 | if (empty(buffer)) ret; |
92 | remaining += l(buffer); |
93 | last.setNext(new MinimalChain(null)); |
94 | last.setElement(buffer); |
95 | last = last.next; |
96 | } |
97 | |
98 | public synchronized void addEOF() {
|
99 | eof = true; |
100 | } |
101 | |
102 | public synchronized bool isEOF() {
|
103 | ret state.chain == last && eof; |
104 | } |
105 | |
106 | public synchronized bool markSupported() { true; }
|
107 | |
108 | public synchronized void mark(int readLimit) {
|
109 | if (debug) printFunctionCall mark(readLimit); |
110 | // clone state |
111 | mark = new State(state.absolutePosition, state.ofs, state.chain); |
112 | ifdef ByteArraysPartialInputStream_debug |
113 | printVars(+mark); |
114 | endifdef |
115 | } |
116 | |
117 | public synchronized void reset() throws IOException {
|
118 | if (debug) printFunctionCall reset(); |
119 | if (mark == null) fail("Reset without mark");
|
120 | remaining += state.absolutePosition-mark.absolutePosition; |
121 | state = mark; |
122 | mark = null; |
123 | } |
124 | |
125 | synchronized S stats() { ret toStringWithFields(this); }
|
126 | |
127 | synchronized long remaining() { ret remaining; }
|
128 | synchronized long absolutePosition() { ret state.absolutePosition; }
|
129 | synchronized long endOfQueue() { ret absolutePosition()+remaining(); }
|
130 | } |
Began life as a copy of #1032911
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
| Snippet ID: | #1032918 |
| Snippet name: | ArraysShortStream - made from ByteArraysPartialInputStream |
| Eternal ID of this version: | #1032918/21 |
| Text MD5: | 1def5133a355e224ce493a7fc73a576f |
| Transpilation MD5: | dea4676b1cdb47c16c6c75e2c4a90bf8 |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2021-10-11 14:50:20 |
| Source code size: | 3955 bytes / 130 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 386 / 583 |
| Version history: | 20 change(s) |
| Referenced in: | [show references] |