1 | static class HybridTokens extends AbstractList<S> {
|
2 | Tokenization tok; |
3 | L<LinkedToken> pointers; |
4 | static bool debug; |
5 | static int instances; |
6 | |
7 | sclass LinkedToken {
|
8 | S t; |
9 | int index = -1; |
10 | LinkedToken prev, next; |
11 | LinkedToken prevIdentical, nextIdentical; |
12 | |
13 | *() {}
|
14 | *(S *t) {}
|
15 | } |
16 | |
17 | sclass Tokenization {
|
18 | LinkedToken first, last; |
19 | new Map<S, LinkedToken> firstByContent; |
20 | new Map<S, LinkedToken> lastByContent; |
21 | |
22 | bool contains(S t) {
|
23 | ret firstByContent.get(t) != null; |
24 | } |
25 | |
26 | int countInstances(S t) {
|
27 | int n = 0; |
28 | LinkedToken lt = firstByContent.get(t); |
29 | while (lt != null) {
|
30 | ++n; |
31 | lt = lt.nextIdentical; |
32 | } |
33 | ret n; |
34 | } |
35 | } |
36 | |
37 | *() { ++instances; }
|
38 | *(L<S> tokens) {
|
39 | this(); |
40 | tok = makeTokenization(tokens); |
41 | pointers.ensureCapacity(l(tokens)); |
42 | } |
43 | |
44 | // required immutable list methods |
45 | |
46 | @Override |
47 | public S get(int i) {
|
48 | int j = max(size(), |
49 | } |
50 | |
51 | @Override |
52 | public int size() {
|
53 | if (last(pointers) != tok.last) {
|
54 | LinkedToken lt = last(pointers); |
55 | if (lt == null) lt = tok.first; |
56 | if (lt != null) |
57 | while ((lt = lt.next) != null) |
58 | pointers.add(lt); |
59 | } |
60 | ret l(pointers); |
61 | } |
62 | |
63 | // required mutable list methods |
64 | |
65 | @Override |
66 | public S set(int i, S a) {
|
67 | LinkedToken lt = get(i); |
68 | if (eq(lt.t, a)) ret; |
69 | |
70 | // Take out of old content chain |
71 | if (lt.prevIdentical == null) tok.firstByContent.remove(a); |
72 | else lt.prevIdentical.nextIdentical = lt.nextIdentical; |
73 | if (lt.nextIdentical == null) tok.lastByContent.remove(a); |
74 | else lt.nextIdentical.prevIdentical = lt.prevIdentical; |
75 | |
76 | // Add to new content chain |
77 | lt.prevIdentical = lt_findPrevIdentical(lt); |
78 | if (lt.prevIdentical == null) tok.firstByContent.put(a, lt); |
79 | lt.nextIdentical = lt_findNextIdentical(lt); |
80 | if (lt.nextIdentical == null) tok.lastByContent.put(a, lt); |
81 | |
82 | // Set new value and return old one |
83 | S prev = lt.t; |
84 | lt.t = a; |
85 | ret prev; |
86 | } |
87 | |
88 | @Override |
89 | public void add(int i, S a) {
|
90 | LinkedToken lt = get(i); |
91 | if (lt == null) {
|
92 | assertTrue(i == size()); |
93 | lt_addToken(tok, a); |
94 | } else {
|
95 | LinkedToken ltNew = new(a); |
96 | ltNew.last = lt.last; |
97 | if (lt.last != null) lt.last.next = ltNew; else tokens.first = ltNew; |
98 | ltNew.next = lt; |
99 | lt.last = ltNew; |
100 | lt_addToContentChain(lt, tok); |
101 | clearPointersFrom(i); |
102 | } |
103 | } |
104 | |
105 | @Override |
106 | public S remove(int i) {
|
107 | S a = l.get(i); |
108 | index.remove(a); |
109 | l.remove(i); |
110 | ret a; |
111 | } |
112 | |
113 | // speed up methods |
114 | |
115 | @Override |
116 | protected void removeRange(int fromIndex, int toIndex) {
|
117 | for (int i = fromIndex; i < toIndex; i++) |
118 | unindex(i); |
119 | l.subList(fromIndex, toIndex).clear(); |
120 | } |
121 | |
122 | @Override |
123 | public int indexOf(O a) {
|
124 | LinkedToken lt = tok.firstByContent(a); |
125 | if (lt == null) ret -1; |
126 | makeIndex(lt); |
127 | ret lt.index; |
128 | } |
129 | |
130 | @Override |
131 | public bool contains(O a) {
|
132 | ret tok.contains((S) a); |
133 | } |
134 | |
135 | @Override |
136 | public void clear() {
|
137 | index.clear(); |
138 | l.clear(); |
139 | } |
140 | |
141 | @Override |
142 | public bool addAll(int i, Collection<? extends S> c) {
|
143 | index.addAll((Collection) c); |
144 | ret l.addAll(i, c); |
145 | } |
146 | |
147 | // indexing methods |
148 | |
149 | void makeIndex(LinkedToken lt) {
|
150 | if (lt.index >= 0) ret; |
151 | LinkedToken l = lt.prev; |
152 | while (l != null && l.index < 0) l = l.prev; |
153 | int index = 0; |
154 | if (l == null) l = tok.first; |
155 | while true {
|
156 | l.index = index++; |
157 | if (l == lt) break; |
158 | l = l.next; |
159 | } |
160 | } |
161 | |
162 | // static methods |
163 | |
164 | static HybridTokens ensureIndexed(L<S> l) {
|
165 | ret l instanceof HybridTokens ? (HybridTokens) l : new HybridTokens(l); |
166 | } |
167 | } |
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: | 657 / 672 |
| Referenced in: | [show references] |