Libraryless. Click here for Pure Java version (5835L/37K).
1 | sclass LineCompSemiCached implements AutoCloseable { |
2 | File f; // must be the raw text version |
3 | RandomAccessFile raf; |
4 | int[] literalOffsets; |
5 | int[] pairs; |
6 | Map<S, int[]> files; |
7 | S encoding = "UTF-8"; |
8 | transient Lock lock = lock(); |
9 | |
10 | *() {} |
11 | *(File f) { |
12 | if (isGZipFile(f)) fail("Must not be gzipped: " + f2s(f)); |
13 | init(f); |
14 | } |
15 | |
16 | LineCompReader init(File f) { |
17 | this.f = f; |
18 | LineCompReader reader = new(f); |
19 | literalOffsets = reader.literalOffsets; |
20 | pairs = intPairsToIntArray(reader.pairs); |
21 | files = mapValues toIntArray(reader.versions); |
22 | ret reader; |
23 | } |
24 | |
25 | void openFile { |
26 | lock lock; |
27 | if (raf == null) |
28 | raf = randomAccessFileForReading(f); |
29 | } |
30 | |
31 | S getLiteral(int i) { |
32 | openFile(); |
33 | int start = literalOffsets[i]; |
34 | ret bytesToString(raf_readFilePart(raf, start, literalOffsets[i+1]-start), encoding); |
35 | } |
36 | |
37 | public void close ctex { |
38 | if (raf != null) raf.close(); |
39 | } |
40 | |
41 | int nLiterals() { ret literalOffsets.length-1; } |
42 | |
43 | S getFile(S name) { |
44 | int[] encoded = files.get(name); |
45 | if (encoded == null) null; |
46 | new StringBuilder buf; |
47 | for (int idx : encoded) |
48 | decode(idx, buf); |
49 | ret str(buf); |
50 | } |
51 | |
52 | Set<S> files() { ret keys(files); } |
53 | |
54 | void decode(int idx, StringBuilder buf) { |
55 | if (idx < nLiterals()) { |
56 | if (empty(buf)) buf.append('\n'); |
57 | buf.append(getLiteral(idx)); |
58 | } else { |
59 | int idx2 = (idx-nLiterals())*2; |
60 | decode(pairs[idx2], buf); |
61 | decode(pairs[idx2+1], buf); |
62 | } |
63 | } |
64 | } |
Began life as a copy of #1028182
download show line numbers debug dex old transpilations
Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv
No comments. add comment
Snippet ID: | #1028795 |
Snippet name: | LineCompSemiCached - cache all except the literals |
Eternal ID of this version: | #1028795/13 |
Text MD5: | 1fc5778a65e85afb17059b3d73651f0a |
Transpilation MD5: | f45a576866b725e3459ffc5a04c5d518 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2020-07-16 14:45:33 |
Source code size: | 1566 bytes / 64 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 285 / 601 |
Version history: | 12 change(s) |
Referenced in: | [show references] |