Better Lisp vector to QList<*> conversion.
Annotate for file src/list.lisp
2010-01-10 tobias 1 (in-package :cl-smoke.qt-impl)
08:52:49 ' 2
2009-09-02 tobias 3 (defmacro define-qlist-wrapper (type-name element-type &optional c-name)
2010-01-10 tobias 4 (let* ((c-name (or c-name type-name))
08:52:49 ' 5 (type (string-upcase c-name))
' 6 (list-type (symbolicate 'qlist- type)))
' 7 `(progn
' 8 (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_size") :int
' 9 "Returns the size of LIST."
' 10 (list :pointer))
' 11 (defcfun ,(concatenate 'string "qt_smoke_free_list_" c-name) :void
' 12 "Frees LIST."
' 13 (list :pointer))
' 14 (defcfun ,(concatenate 'string "qt_smoke_make_list_" c-name) :pointer
' 15 "Makes a list.")
' 16 (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_at") :pointer
' 17 "Returns the a newly constructed copy of the element at position AT of LIST."
' 18 (list :pointer)
' 19 (index :int))
' 20 (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_append") :pointer
' 21 "Appends NEW-ELEMENT to LIST."
' 22 (list :pointer)
' 23 (new-element :pointer))
' 24 ;; To Lisp
' 25 ,@(loop for type-name in (ensure-list type-name) collect
' 26 `(defun ,(symbolicate 'from- type-name) (list-pointer)
' 27 (let ((vector (make-array (,(symbolicate 'qt-smoke-list-
' 28 type '-size)
' 29 list-pointer))))
' 30 (dotimes (index (length vector) vector)
' 31 (setf (aref vector index)
' 32 ;; FIXME the returned object is not wrapped by Smoke
' 33 ;; -> change this?
' 34 (smoke::object-to-lisp
' 35 (,(symbolicate 'qt-smoke-list-
' 36 type '-at)
' 37 list-pointer index)
' 38 (smoke::make-smoke-type *smoke-module*
' 39 ,type-name)))))))
' 40 ,@(loop for type-name in (ensure-list type-name) collect
' 41 `(define-to-lisp-translation
' 42 (,(format nil "const QList<~A>&" type-name)
' 43 ,(format nil "QList<~A>" type-name))
' 44 ,(symbolicate 'from- type-name)
' 45 ,(symbolicate 'qt-smoke-free-list- type)))
' 46 ;; From Lisp
' 47 (defun ,(symbolicate 'coerce- list-type) (list)
' 48 (let ((qlist (,(symbolicate 'qt-smoke-make-list- type))))
2009-09-02 tobias 49 (loop for element across list do
2010-01-10 tobias 50 (,(symbolicate 'qt-smoke-list- type '-append)
2009-09-02 tobias 51 qlist (pointer (make-instance ',element-type :args (list element)))))
2010-01-10 tobias 52 (make-cleanup-pointer
08:52:49 ' 53 qlist
' 54 (function ,(symbolicate 'qt-smoke-free-list- type)))))
2009-09-02 tobias 55 (defun ,(symbolicate list-type '-p) (list)
12:00:35 ' 56 (every #'(lambda (element)
' 57 (typep element ',element-type))
' 58 list))
2010-01-10 tobias 59 ,@(loop for type-name in (ensure-list type-name) collect
08:52:49 ' 60 `(define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
' 61 ,(format nil "QList<~A>" type-name))
2009-09-02 tobias 62 ;; FIXME allow sequence
12:00:35 ' 63 (and (vector ,element-type)
' 64 (satisfies ,(symbolicate list-type '-p)))
2010-01-10 tobias 65 ,(symbolicate 'coerce- list-type))))))
08:52:49 ' 66
2009-09-02 tobias 67 ;; FIXME it would be nice to have QList<QVariant> as fallback for any
12:00:35 ' 68 ;; list we can not convert otherwise. e.g.: '("a" 1)
' 69 (define-qlist-wrapper "QVariant" qt:variant)
' 70
' 71 (define-qlist-wrapper ("QObject*" "QWidget*") qt:object "void")
' 72 (define-qlist-wrapper "QByteArray" qt:byte-array)