]> gitweb.factorcode.org Git - factor.git/blob - core/byte-vectors/byte-vectors.factor
e4bc48f69132bf7c938f6d066c2fdc6d7b012e75
[factor.git] / core / byte-vectors / byte-vectors.factor
1 ! Copyright (C) 2008 Slava Pestov.\r
2 ! See http://factorcode.org/license.txt for BSD license.\r
3 USING: arrays kernel kernel.private math sequences\r
4 sequences.private growable byte-arrays accessors ;\r
5 IN: byte-vectors\r
6 \r
7 TUPLE: byte-vector\r
8 { underlying byte-array }\r
9 { length array-capacity } ;\r
10 \r
11 : <byte-vector> ( n -- byte-vector )\r
12     (byte-array) 0 byte-vector boa ; inline\r
13 \r
14 : >byte-vector ( seq -- byte-vector )\r
15     >byte-array dup length byte-vector boa ;\r
16 \r
17 M: byte-vector like\r
18     drop dup byte-vector? [\r
19         dup byte-array?\r
20         [ dup length byte-vector boa ] [ >byte-vector ] if\r
21     ] unless ; inline\r
22 \r
23 M: byte-vector new-sequence\r
24     drop [ (byte-array) ] [ >fixnum ] bi byte-vector boa ; inline\r
25 \r
26 M: byte-vector equal?\r
27     over byte-vector? [ sequence= ] [ 2drop f ] if ;\r
28 \r
29 M: byte-vector contract 2drop ; inline\r
30 \r
31 M: byte-array like\r
32     #! If we have an byte-array, we're done.\r
33     #! If we have a byte-vector, and it's at full capacity,\r
34     #! we're done. Otherwise, call resize-byte-array, which is a\r
35     #! relatively fast primitive.\r
36     drop dup byte-array? [\r
37         dup byte-vector? [\r
38             [ length ] [ underlying>> ] bi\r
39             2dup length eq?\r
40             [ nip ] [ resize-byte-array ] if\r
41         ] [ >byte-array ] if\r
42     ] unless ; inline\r
43 \r
44 M: byte-array new-resizable drop <byte-vector> ; inline\r
45 \r
46 M: byte-vector new-resizable drop <byte-vector> ; inline\r
47 \r
48 INSTANCE: byte-vector growable\r