(in-package :cl-smoke.qt.core) (defcfun cl-smoke-string-list-size :int (string-list :pointer)) (defcfun cl-smoke-string-list-at :pointer (string-list :pointer) (index :int)) (defcfun cl-smoke-free-string-list :void (string-list :pointer)) (defcfun cl-smoke-make-string-list :pointer) (defcfun cl-smoke-string-list-append :void (string-list :pointer) (string :pointer) (length :int)) (defun from-string-list (string-list) (let ((vector (make-array (cl-smoke-string-list-size string-list) :initial-element "" :element-type 'string))) (dotimes (index (length vector) vector) (setf (aref vector index) (cxx:data (make-instance 'qt:byte-array :pointer (cl-smoke-string-list-at string-list index))))))) (define-to-lisp-translation ("QStringList" "const QStringList&") from-string-list cl-smoke-free-string-list) (defun coerce-string-list (sequence) (let ((string-list (cl-smoke-make-string-list))) (map nil #'(lambda (string) (with-foreign-string ((data length) string :null-terminated-p nil) (cl-smoke-string-list-append string-list data length))) sequence) (make-cleanup-pointer string-list #'cl-smoke-free-string-list))) (defun string-list-p (sequence) (every #'stringp sequence)) (define-from-lisp-translation "const QStringList&" (and (vector string) (satisfies string-list-p)) coerce-string-list)