Merge branch 'master' of git://factorcode.org/git/factor
[factor/jcg.git] / core / sbufs / sbufs.factor
blob5590432ef4ca3908facee7aadd6fb31fcb704b26
1 ! Copyright (C) 2004, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel math strings sequences.private sequences
4 strings growable strings.private ;
5 IN: sbufs
7 TUPLE: sbuf
8 { underlying string }
9 { length array-capacity } ;
11 : <sbuf> ( n -- sbuf ) 0 <string> 0 sbuf boa ; inline
13 M: sbuf set-nth-unsafe
14     [ >fixnum ] [ >fixnum ] [ underlying>> ] tri* set-string-nth ;
16 M: sbuf new-sequence
17     drop [ 0 <string> ] [ >fixnum ] bi sbuf boa ;
19 : >sbuf ( seq -- sbuf ) SBUF" " clone-like ; inline
21 M: sbuf like
22     drop dup sbuf? [
23         dup string? [ dup length sbuf boa ] [ >sbuf ] if
24     ] unless ;
26 M: sbuf new-resizable drop <sbuf> ;
28 M: sbuf equal?
29     over sbuf? [ sequence= ] [ 2drop f ] if ;
31 M: string new-resizable drop <sbuf> ;
33 M: string like
34     #! If we have a string, we're done.
35     #! If we have an sbuf, and it's at full capacity, we're done.
36     #! Otherwise, call resize-string, which is a relatively
37     #! fast primitive.
38     drop dup string? [
39         dup sbuf? [
40             [ length ] [ underlying>> ] bi
41             2dup length eq?
42             [ nip dup reset-string-hashcode ] [ resize-string ] if
43         ] [ >string ] if
44     ] unless ;
46 INSTANCE: sbuf growable