Refine immutable strings.

This commit is contained in:
Stephen Chung
2020-05-25 17:01:39 +08:00
parent 99ea2b33c9
commit fca140ef55
6 changed files with 119 additions and 39 deletions

View File

@@ -1,5 +1,6 @@
use crate::def_package;
use crate::engine::{FUNC_TO_STRING, KEYWORD_DEBUG, KEYWORD_PRINT};
use crate::fn_native::shared_make_mut;
use crate::module::FuncReturn;
use crate::parser::{ImmutableString, INT};
@@ -41,8 +42,8 @@ def_package!(crate:BasicStringPackage:"Basic string utilities, including printin
lib.set_fn_1(KEYWORD_PRINT, |_: ()| Ok("".to_string()));
lib.set_fn_1(FUNC_TO_STRING, |_: ()| Ok("".to_string()));
lib.set_fn_1(KEYWORD_PRINT, |s: ImmutableString| Ok(s.clone()));
lib.set_fn_1(FUNC_TO_STRING, |s: ImmutableString| Ok(s.clone()));
lib.set_fn_1(KEYWORD_PRINT, |s: ImmutableString| Ok(s));
lib.set_fn_1(FUNC_TO_STRING, |s: ImmutableString| Ok(s));
reg_op!(lib, KEYWORD_DEBUG, to_debug, INT, bool, (), char, ImmutableString);
@@ -81,6 +82,10 @@ def_package!(crate:BasicStringPackage:"Basic string utilities, including printin
lib.set_fn_2(
"+",
|s: ImmutableString, ch: char| {
if s.is_empty() {
return Ok(ch.to_string().into());
}
let mut s = (*s).clone();
s.push(ch);
Ok(s)
@@ -89,23 +94,28 @@ def_package!(crate:BasicStringPackage:"Basic string utilities, including printin
lib.set_fn_2(
"+",
|s:ImmutableString, s2:ImmutableString| {
if s.is_empty() {
return Ok(s2);
} else if s2.is_empty() {
return Ok(s);
}
let mut s = (*s).clone();
s.push_str(s2.as_str());
Ok(s)
Ok(s.into())
},
);
lib.set_fn_2_mut("append", |s: &mut ImmutableString, ch: char| {
let mut copy = (**s).clone();
copy.push(ch);
*s = copy.into();
shared_make_mut(s).push(ch);
Ok(())
});
lib.set_fn_2_mut(
"append",
|s: &mut ImmutableString, s2: ImmutableString| {
let mut copy = (**s).clone();
copy.push_str(s2.as_str());
*s = copy.into();
if !s2.is_empty() {
shared_make_mut(s).push_str(s2.as_str());
}
Ok(())
}
);

View File

@@ -1,4 +1,5 @@
use crate::def_package;
use crate::fn_native::shared_make_mut;
use crate::module::FuncReturn;
use crate::parser::{ImmutableString, INT};
use crate::utils::StaticVec;
@@ -46,23 +47,19 @@ fn sub_string(s: ImmutableString, start: INT, len: INT) -> FuncReturn<ImmutableS
.into())
}
fn crop_string(s: &mut ImmutableString, start: INT, len: INT) -> FuncReturn<()> {
let mut copy = (**s).clone();
let offset = if copy.is_empty() || len <= 0 {
copy.clear();
*s = copy.into();
let offset = if s.is_empty() || len <= 0 {
shared_make_mut(s).clear();
return Ok(());
} else if start < 0 {
0
} else if (start as usize) >= copy.chars().count() {
copy.clear();
*s = copy.into();
} else if (start as usize) >= s.chars().count() {
shared_make_mut(s).clear();
return Ok(());
} else {
start as usize
};
let chars: StaticVec<_> = copy.chars().collect();
let chars: StaticVec<_> = s.chars().collect();
let len = if offset + (len as usize) > chars.len() {
chars.len() - offset
@@ -70,12 +67,10 @@ fn crop_string(s: &mut ImmutableString, start: INT, len: INT) -> FuncReturn<()>
len as usize
};
*s = chars
.iter()
.skip(offset)
.take(len)
.collect::<String>()
.into();
let copy = shared_make_mut(s);
copy.clear();
copy.extend(chars.iter().skip(offset).take(len));
Ok(())
}
@@ -171,21 +166,17 @@ def_package!(crate:MoreStringPackage:"Additional string utilities, including str
},
);
lib.set_fn_1_mut("clear", |s: &mut ImmutableString| {
*s = "".to_string().into();
shared_make_mut(s).clear();
Ok(())
});
lib.set_fn_2_mut("append", |s: &mut ImmutableString, ch: char| {
let mut copy = (**s).clone();
copy.push(ch);
*s = copy.into();
shared_make_mut(s).push(ch);
Ok(())
});
lib.set_fn_2_mut(
"append",
|s: &mut ImmutableString, add: ImmutableString| {
let mut copy = (**s).clone();
copy.push_str(add.as_str());
*s = copy.into();
shared_make_mut(s).push_str(add.as_str());
Ok(())
}
);
@@ -205,10 +196,13 @@ def_package!(crate:MoreStringPackage:"Additional string utilities, including str
lib.set_fn_2_mut(
"truncate",
|s: &mut ImmutableString, len: INT| {
if len >= 0 {
*s = (**s).clone().chars().take(len as usize).collect::<String>().into();
if len > 0 {
let chars: StaticVec<_> = s.chars().collect();
let copy = shared_make_mut(s);
copy.clear();
copy.extend(chars.into_iter().take(len as usize));
} else {
*s = "".to_string().into();
shared_make_mut(s).clear();
}
Ok(())
},
@@ -216,11 +210,10 @@ def_package!(crate:MoreStringPackage:"Additional string utilities, including str
lib.set_fn_3_mut(
"pad",
|s: &mut ImmutableString, len: INT, ch: char| {
let mut copy = (**s).clone();
let copy = shared_make_mut(s);
for _ in 0..copy.chars().count() - len as usize {
copy.push(ch);
}
*s = copy.into();
Ok(())
},
);