diff options
Diffstat (limited to 'src/main/smp/sys/aryi64.smp')
| -rw-r--r-- | src/main/smp/sys/aryi64.smp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/main/smp/sys/aryi64.smp b/src/main/smp/sys/aryi64.smp index 98b72605..b9f1fbed 100644 --- a/src/main/smp/sys/aryi64.smp +++ b/src/main/smp/sys/aryi64.smp @@ -9,36 +9,36 @@ struct aryi64 { }; // Grow as needed - val _grow = { int len2 -> - if( len+len2 < buf# ) return self; - int newlen = buf# * 2; - while( len+len2 >= newlen ) newlen *= 2; + val _grow = { u32 len2 -> + if( len+len2 <= buf# ) return self; + u32 newlen = ary.capacity(buf#,len+len2); + if( !newlen ) libc._exit(1); // Length exceeds the array representation. i64[] !buf2 = new i64[newlen]; - for( int i=0; i<buf#; i++ ) + for( u32 i=0; i<len; i++ ) buf2[i] = buf[i]; buf = buf2; self; }; - // Add a i64 to aryu8 + // Add an i64 to aryi64 val add = { i64 c -> _grow(1).buf[len++] = c; self; }; - val get = { int index -> return buf[index]; }; + val get = { u32 index -> return buf[index]; }; // Write the bracketed array-list form to aryu8. val str = { -> // TODO: clunky default constructor syntax var str = new aryu8().add('['); - for( int i=0; i<len; i++ ) + for( u32 i=0; i<len; i++ ) str.num(buf[i]).add(',').add(' '); if( len ) str.undo(2); return str.add(']'); }; - val swap = { int i, int j -> + val swap = { u32 i, u32 j -> i64 tmp = buf[i]; buf[i] = buf[j]; buf[j] = tmp; @@ -75,8 +75,11 @@ val parseAryI64 = { u8[~] str -> return s.x == s.buf# ? nums : null; }; -val copy = { i64[] dst, int doff, i64[~] src, int soff, int len -> - for( int i=0; i<len; i++ ) +val copy = { i64[] dst, u32 doff, i64[~] src, u32 soff, u32 len -> + if( doff > dst# || soff > src# ) return dst; + if( len > dst# - doff ) len = dst# - doff; + if( len > src# - soff ) len = src# - soff; + for( u32 i=0; i<len; i++ ) dst[i+doff] = src[i+soff]; return dst; }; |
