@@ -8,13 +8,15 @@ use core::str::FromStr;
8
8
use crate :: prelude:: * ;
9
9
use crate :: { errstr, Error , MAX_RECURSION_DEPTH } ;
10
10
11
+ use sync:: Arc ;
12
+
11
13
#[ derive( Debug ) ]
12
14
/// A token of the form `x(...)` or `x`
13
15
pub struct Tree < ' a > {
14
16
/// The name `x`
15
17
name : & ' a str ,
16
18
/// The comma-separated contents of the `(...)`, if any
17
- args : Vec < Tree < ' a > > ,
19
+ args : Arc < [ Tree < ' a > ] > ,
18
20
}
19
21
// or_b(pk(A),pk(B))
20
22
//
@@ -153,29 +155,26 @@ impl<'a> Tree<'a> {
153
155
Found :: Nothing => Ok ( (
154
156
Tree {
155
157
name : sl,
156
- args : vec ! [ ] ,
158
+ args : Arc :: new ( [ ] ) ,
157
159
} ,
158
160
"" ,
159
161
) ) ,
160
162
// Terminal
161
163
Found :: Comma ( n) | Found :: RBracket ( n) => Ok ( (
162
164
Tree {
163
165
name : & sl[ ..n] ,
164
- args : vec ! [ ] ,
166
+ args : Arc :: new ( [ ] ) ,
165
167
} ,
166
168
& sl[ n..] ,
167
169
) ) ,
168
170
// Function call
169
171
Found :: LBracket ( n) => {
170
- let mut ret = Tree {
171
- name : & sl[ ..n] ,
172
- args : vec ! [ ] ,
173
- } ;
172
+ let mut args = vec ! [ ] ;
174
173
175
174
sl = & sl[ n + 1 ..] ;
176
175
loop {
177
176
let ( arg, new_sl) = Tree :: from_slice_delim ( sl, depth + 1 , delim) ?;
178
- ret . args . push ( arg) ;
177
+ args. push ( arg) ;
179
178
180
179
if new_sl. is_empty ( ) {
181
180
return Err ( Error :: ExpectedChar ( closing_delim ( delim) ) ) ;
@@ -193,6 +192,10 @@ impl<'a> Tree<'a> {
193
192
}
194
193
}
195
194
}
195
+ let ret = Tree {
196
+ name : & sl[ ..n] ,
197
+ args : Arc :: from ( args) ,
198
+ } ;
196
199
Ok ( ( ret, sl) )
197
200
}
198
201
}
@@ -230,11 +233,11 @@ impl<'a> Tree<'a> {
230
233
if !rest. contains ( ',' ) {
231
234
let internal_key = Tree {
232
235
name : rest,
233
- args : vec ! [ ] ,
236
+ args : Arc :: new ( [ ] ) ,
234
237
} ;
235
238
return Ok ( Tree {
236
239
name : "tr" ,
237
- args : vec ! [ internal_key] ,
240
+ args : Arc :: from ( [ internal_key] ) ,
238
241
} ) ;
239
242
}
240
243
// use str::split_once() method to refactor this when compiler version bumps up
@@ -243,19 +246,19 @@ impl<'a> Tree<'a> {
243
246
244
247
let internal_key = Tree {
245
248
name : key,
246
- args : vec ! [ ] ,
249
+ args : Arc :: new ( [ ] ) ,
247
250
} ;
248
251
if script. is_empty ( ) {
249
252
return Ok ( Tree {
250
253
name : "tr" ,
251
- args : vec ! [ internal_key] ,
254
+ args : Arc :: from ( [ internal_key] ) ,
252
255
} ) ;
253
256
}
254
257
let ( tree, rest) = Tree :: from_slice_delim ( script, 1 , '{' ) ?;
255
258
if rest. is_empty ( ) {
256
259
Ok ( Tree {
257
260
name : "tr" ,
258
- args : vec ! [ internal_key, tree] ,
261
+ args : Arc :: new ( [ internal_key, tree] ) ,
259
262
} )
260
263
} else {
261
264
Err ( errstr ( rest) )
0 commit comments