Warning: session_start(): open(/var/lib/php/sessions/sess_184qr34iip5r7mr3e5s23m3qm6, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass LineCompReader {
new LS literals;
new LPair pairs;
new LinkedHashMap> versions;
// takes text or gzipped input file
*(File f) {
temp BufferedReader reader = rawByteReader_possiblyGZipped(f);
load(reader);
}
*(BufferedReader reader) { load(reader); }
void load(BufferedReader reader) ctex {
S s = reader.readLine();
new Matches m;
if (!startsWith(s, "LINECOMP ", m)) fail("Not a LINECOMP file");
int nLiterals = parseInt(m.rest());
for i to nLiterals:
literals.add(assertNotNull(reader.readLine()));
while licensed {
s = reader.readLine();
if (s == null || contains(s, "=")) break;
try {
pairs.add(assertNotNull(listToPair(parseInts(splitAtSpace(s)))));
} on fail {
print("On line " + (nLiterals + l(pairs)));
}
}
while (contains(s, "=")) {
int i = indexOf(s, '=');
versions.put(takeFirst(s, i), parseInts(splitAtSpace(substring(s, i+1))));
s = reader.readLine();
}
}
Set versions() { ret keys(versions); }
S getText(S version) { ret textForVersion(version); }
S textForVersion(S version) {
L encoded = versions.get(version);
if (encoded == null) null;
new LS buf;
for (int idx : encoded)
decode(idx, buf);
ret myFromLines(buf);
}
S myFromLines(LS l) { ret fromLines_rtrim(l); }
void decode(int idx, LS buf) {
if (idx < l(literals))
buf.add(literals.get(idx));
else {
Pair p = pairs.get(idx-l(literals));
decode(p.a, buf);
decode(p.b, buf);
}
}
// That was it! The rest of this file is just for calculating some stats.
new Map lineCountsForPairs;
new Map byteCountsForPairs;
int lineCountForPointer(int idx) {
ret idx < l(literals) ? 1 : lineCountForPair(idx);
}
long byteCountForPointer(int idx) {
ret idx < l(literals) ? l(literals.get(idx))+1 : byteCountForPair(idx);
}
int lineCountForPair(int idx) {
Int c = lineCountsForPairs.get(idx);
if (c == null) {
Pair p = pairs.get(idx-l(literals));
c = lineCountForPointer(p.a) + lineCountForPointer(p.b);
lineCountsForPairs.put(idx, c);
}
ret c;
}
long byteCountForPair(int idx) {
Long c = byteCountsForPairs.get(idx);
if (c == null) {
Pair p = pairs.get(idx-l(literals));
c = byteCountForPointer(p.a) + byteCountForPointer(p.b);
byteCountsForPairs.put(idx, c);
}
ret c;
}
int lineCountForVersion(S version) {
L encoded = versions.get(version);
if (encoded == null) ret 0;
int n = 0;
for (int i : encoded) n += lineCountForPointer(i);
ret n;
}
long byteCountForVersion(S version) {
L encoded = versions.get(version);
if (encoded == null) ret 0;
long n = 0;
for (int i : encoded) n += byteCountForPointer(i);
ret max(0, n-1);
}
long totalByteCount() {
ret longSum(lambdaMap byteCountForVersion(versions()));
}
}