]> gitweb.factorcode.org Git - factor.git/blob - core/sbufs/sbufs.factor
e45d98a3df1dfbbda1b59a93b98368fd010e5b91
[factor.git] / core / sbufs / sbufs.factor
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
6
7 TUPLE: sbuf
8 { underlying string }
9 { length array-capacity } ;
10
11 : <sbuf> ( n -- sbuf ) 0 <string> 0 sbuf boa ; inline
12
13 M: sbuf set-nth-unsafe
14     [ >fixnum ] [ >fixnum ] [ underlying>> ] tri* set-string-nth ;
15
16 M: sbuf new-sequence
17     drop [ 0 <string> ] [ >fixnum ] bi sbuf boa ;
18
19 : >sbuf ( seq -- sbuf ) SBUF" " clone-like ; inline
20
21 M: sbuf like
22     drop dup sbuf? [
23         dup string? [ dup length sbuf boa ] [ >sbuf ] if
24     ] unless ;
25
26 M: sbuf new-resizable drop <sbuf> ;
27
28 M: sbuf equal?
29     over sbuf? [ sequence= ] [ 2drop f ] if ;
30
31 M: string new-resizable drop <sbuf> ;
32
33 M: string like
34     drop dup string? [
35         dup sbuf? [
36             dup length over underlying>> length number= [
37                 underlying>> dup reset-string-hashcode
38             ] [
39                 >string
40             ] if
41         ] [
42             >string
43         ] if
44     ] unless ;
45
46 INSTANCE: sbuf growable