| 
									
										
										
										
											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 -- )
 | 
					
						
							|  |  |  |     [ "(>>" prepend ")" append ] 2dip
 | 
					
						
							|  |  |  |     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 -- )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ name>> "<" prepend ">" append create-in ] | 
					
						
							|  |  |  |         [ '[ _ new ] ] | 
					
						
							|  |  |  |         [ name>> '[ _ malloc-object >>underlying ] append ] | 
					
						
							|  |  |  |         [ 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 -- )
 | 
					
						
							|  |  |  |     name create-in :> class | 
					
						
							|  |  |  |     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 ;
 |