-(defun list-store-insert
- (store position &optional data (iter (make-instance 'tree-iter)))
- (%list-store-insert store iter position)
- (when data (%tree-model-set store iter data))
+(defun list-store-insert (store position &optional data (iter (make-instance 'tree-iter)))
+ (etypecase data
+ (null (%list-store-insert store iter position))
+
+ (list (with-memory (gvalues (* (/ (length data) 2) +gvalue-size+))
+ (let ((columns
+ (loop
+ for (column value) on data by #'cddr
+ as index = (tree-model-column-index store column)
+ as type = (tree-model-get-column-type store index)
+ as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
+ do (gvalue-init gvalue type value)
+ collect index)))
+ (unwind-protect
+ (%list-store-insert-with-valuesv store iter position columns gvalues)
+ (loop
+ repeat (length columns)
+ as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
+ do (gvalue-unset gvalue))))))
+
+ (vector (with-memory (gvalues (* (length data) +gvalue-size+))
+ (let ((columns
+ (loop
+ for index below (length data)
+ as type = (tree-model-get-column-type store index)
+ as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
+ do (gvalue-init gvalue type (aref data index))
+ collect index)))
+ (unwind-protect
+ (%list-store-insert-with-valuesv store iter position columns gvalues))
+ (loop
+ repeat (length data)
+ as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
+ do (gvalue-unset gvalue))))))