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: | 173 / 329 |
Version history: | 20 change(s) |
Referenced in: | [show references] |