@@ -14,12 +14,10 @@ const nonCapture* = -1 .. -2
14
14
# XXX limit lookarounds to int8.high per regex
15
15
type CaptState* = uint8
16
16
const
17
- stsInitial = 0 .CaptState
18
- stsKeepAlive = 1 .CaptState
19
- stsRecyclable = 2 .CaptState
20
- stsRecycled = 3 .CaptState
21
- stsNotRecyclable = 4 .CaptState
22
- stsFrozen = 5 .CaptState .. CaptState.high
17
+ stsKeepAlive = 0 .CaptState
18
+ stsRecycle = 1 .CaptState
19
+ stsNotRecyclable = 2 .CaptState
20
+ stsFrozen = 3 .CaptState .. CaptState.high
23
21
24
22
type
25
23
# XXX int16 same as max parallel states or max regex len
@@ -81,72 +79,31 @@ func reset*(capts: var Capts3, groupsLen: int) =
81
79
func initCapts3* (groupsLen: int ): Capts3 =
82
80
reset(result , groupsLen)
83
81
84
- func check(curr, next: CaptState): bool =
85
- # # Check if transition from state curr to next is allowed
86
- result = case next:
87
- of stsInitial:
88
- curr == stsInitial or
89
- curr == stsRecycled or
90
- curr == stsNotRecyclable or
91
- curr in stsFrozen
92
- of stsKeepAlive:
93
- curr == stsInitial or
94
- curr == stsRecyclable
95
- of stsRecyclable:
96
- curr == stsInitial or
97
- curr == stsKeepAlive
98
- of stsRecycled:
99
- curr == stsRecyclable or
100
- curr == stsRecycled
101
- of stsNotRecyclable:
102
- curr == stsInitial or
103
- curr == stsKeepAlive or
104
- curr in stsFrozen
105
- else :
106
- doAssert next in stsFrozen
107
- curr == stsInitial or
108
- curr == stsKeepAlive or
109
- curr == stsRecyclable
110
-
111
- proc to(a: var CaptState, b: CaptState) {.inline.} =
112
- doAssert check(a, b), $ a.int & " " & $ b.int
113
- a = b
114
-
115
- func keepAlive* (capts: var Capts3, captIdx: CaptIdx) {.inline.} =
116
- template state: untyped = capts.states[captIdx]
117
- doAssert state != stsRecycled
118
- if state == stsInitial or
119
- state == stsRecyclable:
120
- state.to stsKeepAlive
121
-
122
82
func freeze* (capts: var Capts3): CaptState =
123
83
# # Freeze all in use capts.
124
84
# # Return freezeId
125
85
doAssert capts.freezeId < stsFrozen.b
126
86
inc capts.freezeId
127
87
result = capts.freezeId
128
88
for state in mitems capts.states:
129
- if state == stsInitial or
130
- state == stsKeepAlive or
131
- state == stsRecyclable:
132
- state.to result
89
+ if state == stsRecycle:
90
+ state = result
133
91
134
92
func unfreeze* (capts: var Capts3, freezeId: CaptState) =
135
93
doAssert freezeId in stsFrozen
136
94
doAssert freezeId == capts.freezeId, " Unordered freeze/unfreeze call"
137
95
for state in mitems capts.states:
138
96
if state == freezeId:
139
- state.to stsInitial
97
+ state = stsRecycle
140
98
dec capts.freezeId
141
99
142
100
func diverge* (capts: var Capts3, captIdx: CaptIdx): CaptIdx =
143
101
if capts.free.len > 0 :
144
102
result = capts.free.pop
145
- capts.states[result ].to stsInitial
146
103
else :
147
104
result = capts.len.CaptIdx
148
105
capts.s.setLen(capts.s.len+ capts.blockSize)
149
- capts.states.add stsInitial
106
+ capts.states.add stsRecycle
150
107
doAssert result == capts.states.len- 1
151
108
let idx = capts.blockIdx(result )
152
109
if captIdx != - 1 :
@@ -162,19 +119,20 @@ func recycle*(capts: var Capts3) =
162
119
# # Set initial/keepAlive entries to recyclable
163
120
capts.free.setLen 0
164
121
for i, state in mpairs capts.states:
165
- if state == stsRecyclable or
166
- state == stsRecycled:
122
+ if state == stsRecycle:
167
123
capts.free.add i.int16
168
- state.to stsRecycled
169
- if state == stsInitial or
170
- state == stsKeepAlive:
171
- state.to stsRecyclable
124
+ if state == stsKeepAlive:
125
+ state = stsRecycle
172
126
173
- func notRecyclable* (capts: var Capts3, captIdx: CaptIdx) =
174
- capts.states[captIdx].to stsNotRecyclable
127
+ func keepAlive* (capts: var Capts3, captIdx: CaptIdx) {.inline.} =
128
+ if capts.states[captIdx] == stsRecycle:
129
+ capts.states[captIdx] = stsKeepAlive
130
+
131
+ func notRecyclable* (capts: var Capts3, captIdx: CaptIdx) {.inline.} =
132
+ capts.states[captIdx] = stsNotRecyclable
175
133
176
134
func recyclable* (capts: var Capts3, captIdx: CaptIdx) {.inline.} =
177
- capts.states[captIdx].to stsInitial
135
+ capts.states[captIdx] = stsRecycle
178
136
179
137
func clear* (capts: var Capts3) =
180
138
capts.s.setLen 0
@@ -446,6 +404,7 @@ when isMainModule:
446
404
var captx1 = capts.diverge - 1
447
405
capts[captx1, 0 ] = 1 .. 1
448
406
capts[captx1, 1 ] = 2 .. 2
407
+ capts.keepAlive captx1
449
408
capts.recycle()
450
409
var captx2 = capts.diverge - 1
451
410
capts[captx2, 0 ] = 3 .. 3
@@ -464,7 +423,6 @@ when isMainModule:
464
423
doAssert capts[captx1, 0 ] == 1 .. 1
465
424
doAssert capts[captx1, 1 ] == 2 .. 2
466
425
capts.recycle()
467
- capts.recycle()
468
426
var captx2 = capts.diverge - 1
469
427
doAssert captx1 == captx2
470
428
doAssert capts[captx1, 0 ] == nonCapture
@@ -476,8 +434,8 @@ when isMainModule:
476
434
capts[captx1, 1 ] = 2 .. 2
477
435
doAssert capts[captx1, 0 ] == 1 .. 1
478
436
doAssert capts[captx1, 1 ] == 2 .. 2
479
- capts.recycle()
480
437
capts.keepAlive captx1
438
+ capts.recycle()
481
439
var captx2 = capts.diverge - 1
482
440
doAssert captx1 != captx2
483
441
doAssert capts[captx1, 0 ] == 1 .. 1
@@ -561,3 +519,4 @@ when isMainModule:
561
519
capts.recycle()
562
520
capts.recycle()
563
521
doAssert capts.free.len == 1
522
+ echo " ok"
0 commit comments