static class HybridTokens extends AbstractList<S> {
Tokenization tok;
L<LinkedToken> pointers;
static bool debug;
static int instances;
sclass LinkedToken {
S t;
int index = -1;
LinkedToken prev, next;
LinkedToken prevIdentical, nextIdentical;
*() {}
*(S *t) {}
}
sclass Tokenization {
LinkedToken first, last;
new Map<S, LinkedToken> firstByContent;
new Map<S, LinkedToken> lastByContent;
bool contains(S t) {
ret firstByContent.get(t) != null;
}
int countInstances(S t) {
int n = 0;
LinkedToken lt = firstByContent.get(t);
while (lt != null) {
++n;
lt = lt.nextIdentical;
}
ret n;
}
}
*() { ++instances; }
*(L<S> tokens) {
this();
tok = makeTokenization(tokens);
pointers.ensureCapacity(l(tokens));
}
// required immutable list methods
@Override
public S get(int i) {
int j = max(size(),
}
@Override
public int size() {
if (last(pointers) != tok.last) {
LinkedToken lt = last(pointers);
if (lt == null) lt = tok.first;
if (lt != null)
while ((lt = lt.next) != null)
pointers.add(lt);
}
ret l(pointers);
}
// required mutable list methods
@Override
public S set(int i, S a) {
LinkedToken lt = get(i);
if (eq(lt.t, a)) ret;
// Take out of old content chain
if (lt.prevIdentical == null) tok.firstByContent.remove(a);
else lt.prevIdentical.nextIdentical = lt.nextIdentical;
if (lt.nextIdentical == null) tok.lastByContent.remove(a);
else lt.nextIdentical.prevIdentical = lt.prevIdentical;
// Add to new content chain
lt.prevIdentical = lt_findPrevIdentical(lt);
if (lt.prevIdentical == null) tok.firstByContent.put(a, lt);
lt.nextIdentical = lt_findNextIdentical(lt);
if (lt.nextIdentical == null) tok.lastByContent.put(a, lt);
// Set new value and return old one
S prev = lt.t;
lt.t = a;
ret prev;
}
@Override
public void add(int i, S a) {
LinkedToken lt = get(i);
if (lt == null) {
assertTrue(i == size());
lt_addToken(tok, a);
} else {
LinkedToken ltNew = new(a);
ltNew.last = lt.last;
if (lt.last != null) lt.last.next = ltNew; else tokens.first = ltNew;
ltNew.next = lt;
lt.last = ltNew;
lt_addToContentChain(lt, tok);
clearPointersFrom(i);
}
}
@Override
public S remove(int i) {
S a = l.get(i);
index.remove(a);
l.remove(i);
ret a;
}
// speed up methods
@Override
protected void removeRange(int fromIndex, int toIndex) {
for (int i = fromIndex; i < toIndex; i++)
unindex(i);
l.subList(fromIndex, toIndex).clear();
}
@Override
public int indexOf(O a) {
LinkedToken lt = tok.firstByContent(a);
if (lt == null) ret -1;
makeIndex(lt);
ret lt.index;
}
@Override
public bool contains(O a) {
ret tok.contains((S) a);
}
@Override
public void clear() {
index.clear();
l.clear();
}
@Override
public bool addAll(int i, Collection<? extends S> c) {
index.addAll((Collection) c);
ret l.addAll(i, c);
}
// indexing methods
void makeIndex(LinkedToken lt) {
if (lt.index >= 0) ret;
LinkedToken l = lt.prev;
while (l != null && l.index < 0) l = l.prev;
int index = 0;
if (l == null) l = tok.first;
while true {
l.index = index++;
if (l == lt) break;
l = l.next;
}
}
// static methods
static HybridTokens ensureIndexed(L<S> l) {
ret l instanceof HybridTokens ? (HybridTokens) l : new HybridTokens(l);
}
}Began life as a copy of #1004045
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1016611 |
| Snippet name: | HybridTokens - an indexed version of a token list [dev.] |
| Eternal ID of this version: | #1016611/1 |
| Text MD5: | c76ab0f64c57f386a032d7e34a394e7c |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-06-25 15:10:11 |
| Source code size: | 3863 bytes / 167 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 841 / 843 |
| Referenced in: | [show references] |