35 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			35 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2009 Jeremy Hughes.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: accessors alien.c-types alien.cxx.parser alien.marshall
							 | 
						||
| 
								 | 
							
								alien.inline.types classes.mixin classes.tuple kernel namespaces
							 | 
						||
| 
								 | 
							
								assocs sequences parser classes.parser alien.marshall.syntax
							 | 
						||
| 
								 | 
							
								interpolate locals effects io strings make vocabs.parser words
							 | 
						||
| 
								 | 
							
								generic fry quotations ;
							 | 
						||
| 
								 | 
							
								IN: alien.cxx
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<PRIVATE
							 | 
						||
| 
								 | 
							
								: class-mixin ( str -- word )
							 | 
						||
| 
								 | 
							
								    create-class-in [ define-mixin-class ] keep ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: class-tuple-word ( word -- word' )
							 | 
						||
| 
								 | 
							
								    "#" append create-in ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: define-class-tuple ( word mixin -- )
							 | 
						||
| 
								 | 
							
								    [ drop class-wrapper { } define-tuple-class ]
							 | 
						||
| 
								 | 
							
								    [ add-mixin-instance ] 2bi ;
							 | 
						||
| 
								 | 
							
								PRIVATE>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: define-c++-class ( name superclass-mixin -- )
							 | 
						||
| 
								 | 
							
								    [ [ class-tuple-word ] [ class-mixin ] bi dup ] dip
							 | 
						||
| 
								 | 
							
								    add-mixin-instance define-class-tuple ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: define-c++-method ( class-name generic name types effect virtual -- )
							 | 
						||
| 
								 | 
							
								    [ name % "_" % class-name { { CHAR: : CHAR: _ } } substitute % ] "" make           :> name'
							 | 
						||
| 
								 | 
							
								    effect [ in>> "self" suffix ] [ out>> ] bi <effect> :> effect'
							 | 
						||
| 
								 | 
							
								    types class-name "*" append suffix                  :> types'
							 | 
						||
| 
								 | 
							
								    effect in>> "," join                                :> args
							 | 
						||
| 
								 | 
							
								    class-name virtual [ "#" append ] unless current-vocab lookup                  :> class
							 | 
						||
| 
								 | 
							
								    SBUF" " clone dup [ I[ return self->${name}(${args});]I ] with-output-stream >string :> body
							 | 
						||
| 
								 | 
							
								    name' types' effect' body define-c-marshalled
							 | 
						||
| 
								 | 
							
								    class generic create-method name' current-vocab lookup 1quotation define ;
							 |