Skip to content

Commit 654e234

Browse files
committed
f expression Arc
1 parent 75417d3 commit 654e234

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

src/expression.rs

+16-13
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ use core::str::FromStr;
88
use crate::prelude::*;
99
use crate::{errstr, Error, MAX_RECURSION_DEPTH};
1010

11+
use sync::Arc;
12+
1113
#[derive(Debug)]
1214
/// A token of the form `x(...)` or `x`
1315
pub struct Tree<'a> {
1416
/// The name `x`
1517
name: &'a str,
1618
/// The comma-separated contents of the `(...)`, if any
17-
args: Vec<Tree<'a>>,
19+
args: Arc<[Tree<'a>]>,
1820
}
1921
// or_b(pk(A),pk(B))
2022
//
@@ -153,29 +155,26 @@ impl<'a> Tree<'a> {
153155
Found::Nothing => Ok((
154156
Tree {
155157
name: sl,
156-
args: vec![],
158+
args: Arc::new([]),
157159
},
158160
"",
159161
)),
160162
// Terminal
161163
Found::Comma(n) | Found::RBracket(n) => Ok((
162164
Tree {
163165
name: &sl[..n],
164-
args: vec![],
166+
args: Arc::new([]),
165167
},
166168
&sl[n..],
167169
)),
168170
// Function call
169171
Found::LBracket(n) => {
170-
let mut ret = Tree {
171-
name: &sl[..n],
172-
args: vec![],
173-
};
172+
let mut args = vec![];
174173

175174
sl = &sl[n + 1..];
176175
loop {
177176
let (arg, new_sl) = Tree::from_slice_delim(sl, depth + 1, delim)?;
178-
ret.args.push(arg);
177+
args.push(arg);
179178

180179
if new_sl.is_empty() {
181180
return Err(Error::ExpectedChar(closing_delim(delim)));
@@ -193,6 +192,10 @@ impl<'a> Tree<'a> {
193192
}
194193
}
195194
}
195+
let ret = Tree {
196+
name: &sl[..n],
197+
args: Arc::from(args),
198+
};
196199
Ok((ret, sl))
197200
}
198201
}
@@ -230,11 +233,11 @@ impl<'a> Tree<'a> {
230233
if !rest.contains(',') {
231234
let internal_key = Tree {
232235
name: rest,
233-
args: vec![],
236+
args: Arc::new([]),
234237
};
235238
return Ok(Tree {
236239
name: "tr",
237-
args: vec![internal_key],
240+
args: Arc::from([internal_key]),
238241
});
239242
}
240243
// use str::split_once() method to refactor this when compiler version bumps up
@@ -243,19 +246,19 @@ impl<'a> Tree<'a> {
243246

244247
let internal_key = Tree {
245248
name: key,
246-
args: vec![],
249+
args: Arc::new([]),
247250
};
248251
if script.is_empty() {
249252
return Ok(Tree {
250253
name: "tr",
251-
args: vec![internal_key],
254+
args: Arc::from([internal_key]),
252255
});
253256
}
254257
let (tree, rest) = Tree::from_slice_delim(script, 1, '{')?;
255258
if rest.is_empty() {
256259
Ok(Tree {
257260
name: "tr",
258-
args: vec![internal_key, tree],
261+
args: Arc::new([internal_key, tree]),
259262
})
260263
} else {
261264
Err(errstr(rest))

0 commit comments

Comments
 (0)