2009-07-07 03:44:34 -04:00
|
|
|
! Copyright (C) 2009 Jeremy Hughes.
|
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
|
USING: accessors alien.c-types alien.marshall arrays assocs
|
|
|
|
|
classes.tuple combinators destructors generalizations generic
|
2009-07-08 01:33:21 -04:00
|
|
|
kernel libc locals parser quotations sequences slots words
|
2009-09-17 23:07:21 -04:00
|
|
|
alien.structs lexer vocabs.parser fry effects alien.data ;
|
2009-07-07 03:44:34 -04:00
|
|
|
IN: alien.marshall.structs
|
|
|
|
|
|
2009-07-14 04:50:52 -04:00
|
|
|
<PRIVATE
|
2009-07-07 03:44:34 -04:00
|
|
|
: define-struct-accessor ( class name quot -- )
|
|
|
|
|
[ "accessors" create create-method dup make-inline ] dip define ;
|
|
|
|
|
|
|
|
|
|
: define-struct-getter ( class name word type -- )
|
2009-07-08 18:34:41 -04:00
|
|
|
[ ">>" append \ underlying>> ] 2dip
|
|
|
|
|
struct-field-unmarshaller \ call 4array >quotation
|
2009-07-07 03:44:34 -04:00
|
|
|
define-struct-accessor ;
|
|
|
|
|
|
|
|
|
|
: define-struct-setter ( class name word type -- )
|
2014-10-25 00:39:58 -04:00
|
|
|
[ "<<" append ] 2dip
|
2009-07-07 03:44:34 -04:00
|
|
|
marshaller [ underlying>> ] \ bi* roll 4array >quotation
|
|
|
|
|
define-struct-accessor ;
|
|
|
|
|
|
|
|
|
|
: define-struct-accessors ( class name type reader writer -- )
|
|
|
|
|
[ dup define-protocol-slot ] 3dip
|
|
|
|
|
[ drop swap define-struct-getter ]
|
|
|
|
|
[ nip swap define-struct-setter ] 5 nbi ;
|
|
|
|
|
|
2009-07-08 18:35:18 -04:00
|
|
|
: define-struct-constructor ( class -- )
|
|
|
|
|
{
|
2015-06-08 15:38:38 -04:00
|
|
|
[ name>> "<" prepend ">" append create-word-in ]
|
2009-07-08 18:35:18 -04:00
|
|
|
[ '[ _ new ] ]
|
2014-10-25 01:10:08 -04:00
|
|
|
[ name>> '[ _ malloc-struct >>underlying ] append ]
|
2009-07-08 18:35:18 -04:00
|
|
|
[ name>> 1array ]
|
|
|
|
|
} cleave { } swap <effect> define-declared ;
|
2009-07-14 04:50:52 -04:00
|
|
|
PRIVATE>
|
2009-07-08 18:35:18 -04:00
|
|
|
|
2009-07-07 03:44:34 -04:00
|
|
|
:: define-struct-tuple ( name -- )
|
2015-06-08 15:38:38 -04:00
|
|
|
name create-word-in :> class
|
2009-07-07 03:44:34 -04:00
|
|
|
class struct-wrapper { } define-tuple-class
|
2009-07-08 18:35:18 -04:00
|
|
|
class define-struct-constructor
|
2009-07-07 03:44:34 -04:00
|
|
|
name c-type fields>> [
|
|
|
|
|
class swap
|
|
|
|
|
{
|
2012-07-13 22:06:38 -04:00
|
|
|
[ name>> H{ { CHAR: space CHAR: - } } substitute ]
|
2009-07-07 03:44:34 -04:00
|
|
|
[ type>> ] [ reader>> ] [ writer>> ]
|
|
|
|
|
} cleave define-struct-accessors
|
|
|
|
|
] each ;
|
2009-07-08 01:33:21 -04:00
|
|
|
|
|
|
|
|
: define-marshalled-struct ( name vocab fields -- )
|
|
|
|
|
[ define-struct ] [ 2drop define-struct-tuple ] 3bi ;
|