]> gitweb.factorcode.org Git - factor.git/blobdiff - core/alien/alien.factor
Slices over specialized arrays can now be passed to C functions, written to binary...
[factor.git] / core / alien / alien.factor
index 42f48f97aad2e6abce6a12165839dab549a0a569..3802147838e6844d95dfff8c068a5ed1791ab214 100644 (file)
@@ -1,30 +1,42 @@
 ! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs kernel math namespaces sequences system
-kernel.private byte-arrays arrays init ;
+kernel.private byte-arrays byte-vectors arrays init ;
 IN: alien
 
 PREDICATE: pinned-alien < alien underlying>> not ;
 
 UNION: pinned-c-ptr pinned-alien POSTPONE: f ;
 
-GENERIC: >c-ptr ( obj -- c-ptr ) flushable
+GENERIC: element-size ( seq -- n ) flushable
 
-M: c-ptr >c-ptr ; inline
+M: byte-array element-size drop 1 ; inline
 
-GENERIC: byte-length ( seq -- n ) flushable
+M: byte-vector element-size drop 1 ; inline
 
-M: byte-array byte-length length ; inline
+M: slice element-size seq>> element-size ; inline
 
-M: f byte-length drop 0 ; inline
+M: f element-size drop 1 ; inline
 
-: binary-object ( obj -- c-ptr n )
-    [ >c-ptr ] [ byte-length ] bi ; inline
+GENERIC: byte-length ( obj -- n ) flushable
+
+M: object byte-length [ length ] [ element-size ] bi * ; inline
+
+GENERIC: >c-ptr ( obj -- c-ptr ) flushable
+
+M: c-ptr >c-ptr ; inline
+
+M: slice >c-ptr
+    [ [ from>> ] [ element-size ] bi * ] [ seq>> >c-ptr ] bi
+    <displaced-alien> ; inline
 
 SLOT: underlying
 
 M: object >c-ptr underlying>> ; inline
 
+: binary-object ( obj -- c-ptr n )
+    [ >c-ptr ] [ byte-length ] bi ; inline
+
 GENERIC: expired? ( c-ptr -- ? ) flushable
 
 M: alien expired? expired>> ;