Skip to content

Commit 181e11d

Browse files
Merge branch 'NanoComp:master' into master
2 parents 992c5af + 118b15c commit 181e11d

6 files changed

Lines changed: 310 additions & 1039 deletions

File tree

base/class.scm

Lines changed: 61 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,25 @@
174174
(property-type-name property)))
175175
(error "invalid value for property" (property-name property))))))
176176

177-
(define (make-class type-name parent . properties)
178-
(let ((new-class (list type-name parent properties)))
177+
(define (make-class type-name parent properties . opts)
178+
; opts is an alist of (option-name . option-value) pairs, e.g.
179+
; ((after-copy . mesh_after_copy) (after-destroy . mesh_after_destroy)).
180+
; Recognised options are 'after-copy and 'after-destroy, each a C function
181+
; name (symbol) that gen-ctl-io invokes from the generated <type>_copy /
182+
; <type>_destroy bodies. Unknown options are accepted and ignored to keep
183+
; this loosely versioned across libctl / gen-ctl-io / consumer combos.
184+
(let ((new-class (list type-name parent properties opts)))
179185
(set! class-list (cons new-class class-list))
180186
new-class))
181187
(define (class-type-name class) (first class))
182188
(define (class-parent class) (second class))
183189
(define (class-properties class) (third class))
190+
(define (class-options class)
191+
(if (>= (length class) 4) (fourth class) '()))
192+
(define (class-option class key)
193+
(assoc-ref (class-options class) key))
194+
(define (class-after-copy class) (class-option class 'after-copy))
195+
(define (class-after-destroy class) (class-option class 'after-destroy))
184196
(define (class-properties-all class)
185197
(append (class-properties class)
186198
(let ((parent (class-parent class)))
@@ -276,50 +288,59 @@
276288
; code above.
277289

278290
(defmacro-public define-class (class-name parent . properties)
279-
(let ((pdefs (map
280-
(lambda (p)
281-
(let ((name (cadr p))
282-
(type-name (cadddr p)))
283-
`(define ,name
284-
(type-property-value-constructor
285-
,type-name (quote ,name)))))
286-
(list-transform-positive properties
287-
(lambda (p) (eq? (car p) 'define-property)))))
288-
(ppdefs (map
291+
(let* ((class-option-form?
292+
(lambda (p) (and (pair? p)
293+
(memq (car p) '(after-copy after-destroy)))))
294+
(option-forms (list-transform-positive properties class-option-form?))
295+
(non-option-forms (list-transform-negative properties class-option-form?))
296+
(pdefs (map
289297
(lambda (p)
290298
(let ((name (cadr p))
291-
(type-name (cadddr p))
292-
(post-process-func (list-ref p 4)))
293-
`(define ,name (post-processing-constructor
294-
,post-process-func
295-
(type-property-value-constructor
296-
,type-name (quote ,name))))))
297-
(list-transform-positive properties
298-
(lambda (p)
299-
(eq? (car p) 'define-post-processed-property)))))
300-
(props (map
301-
(lambda (p)
302-
(cond
303-
((eq? (car p) 'define-property)
299+
(type-name (cadddr p)))
300+
`(define ,name
301+
(type-property-value-constructor
302+
,type-name (quote ,name)))))
303+
(list-transform-positive non-option-forms
304+
(lambda (p) (eq? (car p) 'define-property)))))
305+
(ppdefs (map
306+
(lambda (p)
304307
(let ((name (cadr p))
305-
(default (caddr p))
306308
(type-name (cadddr p))
307-
(constraints (cddddr p)))
308-
`(make-property (quote ,name) ,type-name ,default
309-
not-derived ,@constraints)))
310-
((eq? (car p) 'define-post-processed-property)
311-
(let ((name (cadr p))
312-
(default (caddr p))
313-
(type-name (cadddr p))
314-
(post-process-func (list-ref p 4))
315-
(constraints (cdr (cddddr p))))
316-
`(make-property (quote ,name) ,type-name ,default
317-
not-derived ,@constraints)))
318-
(else p)))
319-
properties)))
309+
(post-process-func (list-ref p 4)))
310+
`(define ,name (post-processing-constructor
311+
,post-process-func
312+
(type-property-value-constructor
313+
,type-name (quote ,name))))))
314+
(list-transform-positive non-option-forms
315+
(lambda (p)
316+
(eq? (car p) 'define-post-processed-property)))))
317+
(props (map
318+
(lambda (p)
319+
(cond
320+
((eq? (car p) 'define-property)
321+
(let ((name (cadr p))
322+
(default (caddr p))
323+
(type-name (cadddr p))
324+
(constraints (cddddr p)))
325+
`(make-property (quote ,name) ,type-name ,default
326+
not-derived ,@constraints)))
327+
((eq? (car p) 'define-post-processed-property)
328+
(let ((name (cadr p))
329+
(default (caddr p))
330+
(type-name (cadddr p))
331+
(post-process-func (list-ref p 4))
332+
(constraints (cdr (cddddr p))))
333+
`(make-property (quote ,name) ,type-name ,default
334+
not-derived ,@constraints)))
335+
(else p)))
336+
non-option-forms))
337+
(opt-args (map (lambda (o)
338+
`(cons (quote ,(car o)) (quote ,(cadr o))))
339+
option-forms)))
320340
`(begin
321341
,@pdefs
322342
,@ppdefs
323343
(define ,class-name (make-class (quote ,class-name)
324344
,parent
325-
,@props)))))
345+
(list ,@props)
346+
,@opt-args)))))

utils/ctl-io.scm

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,10 +397,19 @@
397397
(print "\n")
398398
(print "o->which_subclass = "
399399
(class-self-enum-name class) ";\n"))))
400+
(let ((hook (class-after-copy class)))
401+
(if hook (print hook "(o);\n")))
400402
(print "}\n\n"))
401403

402404
(define (output-class-copy-functions-header)
403405
(print "/******* class copy function prototypes *******/\n\n")
406+
(for-each
407+
(lambda (class)
408+
(let ((hook (class-after-copy class)))
409+
(if hook
410+
(print "extern void " hook "("
411+
(c-type-string (class-type-name class)) " *);\n"))))
412+
class-list)
404413
(for-each
405414
(lambda (class)
406415
(print "extern ") (class-copy-function-decl class "")
@@ -622,10 +631,19 @@
622631
(if (not (null? subclasses))
623632
(begin
624633
(print "{ }\n"))))
634+
(let ((hook (class-after-destroy class)))
635+
(if hook (print hook "(&o);\n")))
625636
(print "}\n\n"))
626637

627638
(define (output-class-destruction-functions-header)
628639
(print "/******* class destruction function prototypes *******/\n\n")
640+
(for-each
641+
(lambda (class)
642+
(let ((hook (class-after-destroy class)))
643+
(if hook
644+
(print "extern void " hook "("
645+
(c-type-string (class-type-name class)) " *);\n"))))
646+
class-list)
629647
(for-each
630648
(lambda (class)
631649
(print "extern ") (class-destroy-function-decl class "")

utils/ctlgeom-types.h

Lines changed: 0 additions & 210 deletions
This file was deleted.

0 commit comments

Comments
 (0)