sequences: add a copy-unsafe that can be used sometimes.
parent
a34c113020
commit
7e2ff8864f
|
@ -59,11 +59,11 @@ HELP: immutable
|
||||||
|
|
||||||
HELP: new-sequence
|
HELP: new-sequence
|
||||||
{ $values { "len" "a non-negative integer" } { "seq" sequence } { "newseq" "a mutable sequence" } }
|
{ $values { "len" "a non-negative integer" } { "seq" sequence } { "newseq" "a mutable sequence" } }
|
||||||
{ $contract "Outputs a mutable sequence of length " { $snippet "n" } " which can hold the elements of " { $snippet "seq" } ". The initial contents of the sequence are undefined." } ;
|
{ $contract "Outputs a mutable sequence of length " { $snippet "len" } " which can hold the elements of " { $snippet "seq" } ". The initial contents of the sequence are undefined." } ;
|
||||||
|
|
||||||
HELP: new-resizable
|
HELP: new-resizable
|
||||||
{ $values { "len" "a non-negative integer" } { "seq" sequence } { "newseq" "a resizable mutable sequence" } }
|
{ $values { "len" "a non-negative integer" } { "seq" sequence } { "newseq" "a resizable mutable sequence" } }
|
||||||
{ $contract "Outputs a resizable mutable sequence with an initial capacity of " { $snippet "n" } " elements and zero length, which can hold the elements of " { $snippet "seq" } "." }
|
{ $contract "Outputs a resizable mutable sequence with an initial capacity of " { $snippet "len" } " elements and zero length, which can hold the elements of " { $snippet "seq" } "." }
|
||||||
{ $examples
|
{ $examples
|
||||||
{ $example "USING: prettyprint sequences ;" "300 V{ } new-resizable ." "V{ }" }
|
{ $example "USING: prettyprint sequences ;" "300 V{ } new-resizable ." "V{ }" }
|
||||||
{ $example "USING: prettyprint sequences ;" "300 SBUF\" \" new-resizable ." "SBUF\" \"" }
|
{ $example "USING: prettyprint sequences ;" "300 SBUF\" \" new-resizable ." "SBUF\" \"" }
|
||||||
|
|
|
@ -291,8 +291,9 @@ C: <copy> copy-state
|
||||||
[ [ dst-i>> + ] [ dst>> ] bi set-nth-unsafe ] 2bi ; inline
|
[ [ dst-i>> + ] [ dst>> ] bi set-nth-unsafe ] 2bi ; inline
|
||||||
|
|
||||||
: (copy) ( n copy -- dst )
|
: (copy) ( n copy -- dst )
|
||||||
over 0 <= [ nip dst>> ] [ [ 1 - ] dip [ ((copy)) ] [ (copy) ] 2bi ] if ;
|
over 0 <= [ nip dst>> ] [
|
||||||
inline recursive
|
[ 1 - ] dip [ ((copy)) ] [ (copy) ] 2bi
|
||||||
|
] if ; inline recursive
|
||||||
|
|
||||||
: subseq>copy ( from to seq -- n copy )
|
: subseq>copy ( from to seq -- n copy )
|
||||||
[ over - check-length swap ] dip
|
[ over - check-length swap ] dip
|
||||||
|
@ -305,6 +306,10 @@ C: <copy> copy-state
|
||||||
3dup bounds-check-head
|
3dup bounds-check-head
|
||||||
[ swap length + ] dip lengthen ; inline
|
[ swap length + ] dip lengthen ; inline
|
||||||
|
|
||||||
|
: copy-unsafe ( src i dst -- )
|
||||||
|
#! The check-length call forces partial dispatch
|
||||||
|
[ [ length check-length 0 ] keep ] 2dip <copy> (copy) drop ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: subseq ( from to seq -- subseq )
|
: subseq ( from to seq -- subseq )
|
||||||
|
@ -323,12 +328,10 @@ PRIVATE>
|
||||||
: but-last ( seq -- headseq ) 1 head* ;
|
: but-last ( seq -- headseq ) 1 head* ;
|
||||||
|
|
||||||
: copy ( src i dst -- )
|
: copy ( src i dst -- )
|
||||||
#! The check-length call forces partial dispatch
|
check-copy copy-unsafe ; inline
|
||||||
[ [ length check-length 0 ] keep ] 2dip
|
|
||||||
check-copy <copy> (copy) drop ; inline
|
|
||||||
|
|
||||||
M: sequence clone-like
|
M: sequence clone-like
|
||||||
[ dup length ] dip new-sequence [ 0 swap copy ] keep ; inline
|
[ dup length ] dip new-sequence [ 0 swap copy-unsafe ] keep ; inline
|
||||||
|
|
||||||
M: immutable-sequence clone-like like ; inline
|
M: immutable-sequence clone-like like ; inline
|
||||||
|
|
||||||
|
@ -337,8 +340,8 @@ M: immutable-sequence clone-like like ; inline
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: (append) ( seq1 seq2 accum -- accum )
|
: (append) ( seq1 seq2 accum -- accum )
|
||||||
[ [ over length ] dip copy ]
|
[ [ over length ] dip copy-unsafe ]
|
||||||
[ 0 swap copy ]
|
[ 0 swap copy-unsafe ]
|
||||||
[ ] tri ; inline
|
[ ] tri ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
@ -349,7 +352,7 @@ PRIVATE>
|
||||||
|
|
||||||
: 3append-as ( seq1 seq2 seq3 exemplar -- newseq )
|
: 3append-as ( seq1 seq2 seq3 exemplar -- newseq )
|
||||||
[ 3dup [ length ] tri@ + + ] dip [
|
[ 3dup [ length ] tri@ + + ] dip [
|
||||||
[ [ 2over [ length ] bi@ + ] dip copy ]
|
[ [ 2over [ length ] bi@ + ] dip copy-unsafe ]
|
||||||
[ (append) ] bi
|
[ (append) ] bi
|
||||||
] new-like ; inline
|
] new-like ; inline
|
||||||
|
|
||||||
|
@ -687,13 +690,13 @@ PRIVATE>
|
||||||
|
|
||||||
: prefix ( seq elt -- newseq )
|
: prefix ( seq elt -- newseq )
|
||||||
over [ over length 1 + ] dip [
|
over [ over length 1 + ] dip [
|
||||||
(1sequence) [ 1 swap copy ] keep
|
(1sequence) [ 1 swap copy-unsafe ] keep
|
||||||
] new-like ;
|
] new-like ;
|
||||||
|
|
||||||
: suffix ( seq elt -- newseq )
|
: suffix ( seq elt -- newseq )
|
||||||
over [ over length 1 + ] dip [
|
over [ over length 1 + ] dip [
|
||||||
[ [ over length ] dip set-nth-unsafe ] keep
|
[ [ over length ] dip set-nth-unsafe ] keep
|
||||||
[ 0 swap copy ] keep
|
[ 0 swap copy-unsafe ] keep
|
||||||
] new-like ;
|
] new-like ;
|
||||||
|
|
||||||
: suffix! ( seq elt -- seq ) over push ; inline
|
: suffix! ( seq elt -- seq ) over push ; inline
|
||||||
|
@ -792,7 +795,7 @@ PRIVATE>
|
||||||
: reverse ( seq -- newseq )
|
: reverse ( seq -- newseq )
|
||||||
[
|
[
|
||||||
dup [ length ] keep new-sequence
|
dup [ length ] keep new-sequence
|
||||||
[ 0 swap copy ] keep reverse!
|
[ 0 swap copy-unsafe ] keep reverse!
|
||||||
] keep like ;
|
] keep like ;
|
||||||
|
|
||||||
: sum-lengths ( seq -- n )
|
: sum-lengths ( seq -- n )
|
||||||
|
@ -818,7 +821,8 @@ PRIVATE>
|
||||||
over empty? [ nip concat-as ] [
|
over empty? [ nip concat-as ] [
|
||||||
[
|
[
|
||||||
2dup joined-length over new-resizable [
|
2dup joined-length over new-resizable [
|
||||||
[ [ push-all ] 2curry ] [ [ nip push-all ] 2curry ] 2bi
|
[ [ push-all ] 2curry ]
|
||||||
|
[ nip [ push-all ] curry ] 2bi
|
||||||
interleave
|
interleave
|
||||||
] keep
|
] keep
|
||||||
] dip like
|
] dip like
|
||||||
|
|
Loading…
Reference in New Issue