mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
builtins: ustring comparisons, concatenation and other functions
This commit is contained in:

committed by
Alexander Medvednikov

parent
fd68c44dfa
commit
ffcff9ebd4
@@ -725,22 +725,128 @@ pub fn (s string) ustring_tmp() ustring {
|
||||
return res
|
||||
}
|
||||
|
||||
fn (u ustring) eq(a ustring) bool {
|
||||
if u.len != a.len || u.s != a.s {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fn (u ustring) ne(a ustring) bool {
|
||||
return !u.eq(a)
|
||||
}
|
||||
|
||||
fn (u ustring) lt(a ustring) bool {
|
||||
return u.s < a.s
|
||||
}
|
||||
|
||||
fn (u ustring) le(a ustring) bool {
|
||||
return u.lt(a) || u.eq(a)
|
||||
}
|
||||
|
||||
fn (u ustring) gt(a ustring) bool {
|
||||
return !u.le(a)
|
||||
}
|
||||
|
||||
fn (u ustring) ge(a ustring) bool {
|
||||
return !u.lt(a)
|
||||
}
|
||||
|
||||
fn (u ustring) add(a ustring) ustring {
|
||||
mut res := ustring {
|
||||
s: u.s + a.s
|
||||
runes: new_array(0, u.s.len + a.s.len, sizeof(int))
|
||||
}
|
||||
mut j := 0
|
||||
for i := 0; i < u.s.len; i++ {
|
||||
char_len := utf8_char_len(u.s.str[i])
|
||||
res.runes << j
|
||||
i += char_len - 1
|
||||
j += char_len
|
||||
res.len++
|
||||
}
|
||||
for i := 0; i < a.s.len; i++ {
|
||||
char_len := utf8_char_len(a.s.str[i])
|
||||
res.runes << j
|
||||
i += char_len - 1
|
||||
j += char_len
|
||||
res.len++
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
pub fn (u ustring) index_after(p ustring, start int) int {
|
||||
if p.len > u.len {
|
||||
return -1
|
||||
}
|
||||
mut strt := start
|
||||
if start < 0 {
|
||||
strt = 0
|
||||
}
|
||||
if start > u.len {
|
||||
return -1
|
||||
}
|
||||
mut i := strt
|
||||
for i < u.len {
|
||||
mut j := 0
|
||||
mut ii := i
|
||||
for j < p.len && u.at(ii) == p.at(j) {
|
||||
j++
|
||||
ii++
|
||||
}
|
||||
if j == p.len {
|
||||
return i
|
||||
}
|
||||
i++
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// counts occurrences of substr in s
|
||||
pub fn (u ustring) count(substr ustring) int {
|
||||
if u.len == 0 || substr.len == 0 {
|
||||
return 0
|
||||
}
|
||||
if substr.len > u.len {
|
||||
return 0
|
||||
}
|
||||
mut n := 0
|
||||
mut i := 0
|
||||
for {
|
||||
i = u.index_after(substr, i)
|
||||
if i == -1 {
|
||||
return n
|
||||
}
|
||||
i += substr.len
|
||||
n++
|
||||
}
|
||||
return 0 // TODO can never get here - v doesn't know that
|
||||
}
|
||||
|
||||
pub fn (u ustring) substr(_start, _end int) string {
|
||||
start := u.runes[_start]
|
||||
end := if _end >= u.runes.len {
|
||||
if _start > _end || _start > u.len || _end > u.len || _start < 0 || _end < 0 {
|
||||
panic('substr($_start, $_end) out of bounds (len=$u.len)')
|
||||
}
|
||||
end := if _end >= u.len {
|
||||
u.s.len
|
||||
}
|
||||
else {
|
||||
u.runes[_end]
|
||||
}
|
||||
return u.s.substr(start, end)
|
||||
return u.s.substr(u.runes[_start], end)
|
||||
}
|
||||
|
||||
pub fn (u ustring) left(pos int) string {
|
||||
if pos >= u.len {
|
||||
return u.s
|
||||
}
|
||||
return u.substr(0, pos)
|
||||
}
|
||||
|
||||
pub fn (u ustring) right(pos int) string {
|
||||
if pos >= u.len {
|
||||
return ''
|
||||
}
|
||||
return u.substr(pos, u.len)
|
||||
}
|
||||
|
||||
@@ -752,6 +858,9 @@ fn (s string) at(idx int) byte {
|
||||
}
|
||||
|
||||
pub fn (u ustring) at(idx int) string {
|
||||
if idx < 0 || idx >= u.len {
|
||||
panic('string index out of range: $idx / $u.runes.len')
|
||||
}
|
||||
return u.substr(idx, idx + 1)
|
||||
}
|
||||
|
||||
|
@@ -423,3 +423,36 @@ fn test_quote() {
|
||||
a := `'`
|
||||
assert a.str() == '\''
|
||||
}
|
||||
|
||||
fn test_ustring_comparisons() {
|
||||
assert ('h€llô !'.ustring() == 'h€llô !'.ustring()) == true
|
||||
assert ('h€llô !'.ustring() == 'h€llô'.ustring()) == false
|
||||
assert ('h€llô !'.ustring() == 'h€llo !'.ustring()) == false
|
||||
|
||||
assert ('h€llô !'.ustring() != 'h€llô !'.ustring()) == false
|
||||
assert ('h€llô !'.ustring() != 'h€llô'.ustring()) == true
|
||||
|
||||
assert ('h€llô'.ustring() < 'h€llô!'.ustring()) == true
|
||||
assert ('h€llô'.ustring() < 'h€llo'.ustring()) == false
|
||||
assert ('h€llo'.ustring() < 'h€llô'.ustring()) == true
|
||||
|
||||
assert ('h€llô'.ustring() <= 'h€llô!'.ustring()) == true
|
||||
assert ('h€llô'.ustring() <= 'h€llô'.ustring()) == true
|
||||
assert ('h€llô!'.ustring() <= 'h€llô'.ustring()) == false
|
||||
|
||||
assert ('h€llô!'.ustring() > 'h€llô'.ustring()) == true
|
||||
assert ('h€llô'.ustring() > 'h€llô'.ustring()) == false
|
||||
|
||||
assert ('h€llô!'.ustring() >= 'h€llô'.ustring()) == true
|
||||
assert ('h€llô'.ustring() >= 'h€llô'.ustring()) == true
|
||||
assert ('h€llô'.ustring() >= 'h€llô!'.ustring()) == false
|
||||
}
|
||||
|
||||
fn test_ustring_count() {
|
||||
a := 'h€llôﷰ h€llô ﷰ'.ustring()
|
||||
assert (a.count('l'.ustring())) == 4
|
||||
assert (a.count('€'.ustring())) == 2
|
||||
assert (a.count('h€llô'.ustring())) == 2
|
||||
assert (a.count('ﷰ'.ustring())) == 2
|
||||
assert (a.count('a'.ustring())) == 0
|
||||
}
|
||||
|
Reference in New Issue
Block a user