! 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>> ;