Coverage report: /development/source/library/com/dydra/gitlab/dydra-cgi/ffi/lisp/dydra-ndk/term_matrix.lisp

KindCoveredAll%
expression0275 0.0
branch08 0.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 (in-package :dydra-ndk)
2
 
3
 ;;; Term Matrix API: Foreign Symbols
4
 
5
 (defcvar ("dydra_term_matrix_sizeof" +term-matrix-sizeof+ :read-only t) :ulong)
6
 
7
 (defcfun ("dydra_term_matrix_parse_from_path" %%term-matrix-parse-from-path) :pointer (pathname :string))
8
 (defcfunwi ("dydra_term_matrix_clone" %%term-matrix-clone) :pointer (matrix-pointer :pointer))
9
 (defcfunwi ("dydra_term_matrix_construct" %%term-matrix-construct) :void (matrix-pointer :pointer) (row-count :ulong) (column-count :ulong))
10
 (defcfunwi ("dydra_term_matrix_destruct" %%term-matrix-destruct) :void (matrix-pointer :pointer))
11
 (defcfun ("dydra_term_matrix_retain_count" %%term-matrix-retain-count) :uint32 (matrix-pointer :pointer))
12
 (defcfun ("dydra_term_matrix_retain" %%term-matrix-retain) :uint32 (matrix-pointer :pointer))
13
 (defcfunwi ("dydra_term_matrix_release" %%term-matrix-release) :uint32 (matrix-pointer :pointer))
14
 
15
 (defcfun ("dydra_term_matrix_empty" %%term-matrix-empty) (:boolean :int8) (matrix-pointer :pointer))
16
 (defcfun ("dydra_term_matrix_size" %%term-matrix-size) :ulong (matrix-pointer :pointer))
17
 (defcfun ("dydra_term_matrix_row_capacity" %%term-matrix-row-capacity) :ulong (matrix-pointer :pointer))
18
 (defcfun ("dydra_term_matrix_row_count" %%term-matrix-row-count) :ulong (matrix-pointer :pointer))
19
 (defcfun ("dydra_term_matrix_row_size" %%term-matrix-row-size) :ulong (matrix-pointer :pointer))
20
 (defcfun ("dydra_term_matrix_column_count" %%term-matrix-column-count) :ulong (matrix-pointer :pointer))
21
 (defcfun ("dydra_term_matrix_column_name" %%term-matrix-column-name) :string (matrix-pointer :pointer) (column-index :ulong))
22
 (defcfun ("dydra_term_matrix_data" %%term-matrix-data) :pointer (matrix-pointer :pointer))
23
 (defcfun ("dydra_term_matrix_row_at" %%term-matrix-row-at) :pointer (matrix-pointer :pointer) (row-index :ulong))
24
 (defcfun ("dydra_term_matrix_get" %%term-matrix-get) :int64 (matrix-pointer :pointer) (row-index :ulong) (column-index :ulong))
25
 (defcfun ("dydra_term_matrix_set" %%term-matrix-set) :void (matrix-pointer :pointer) (row-index :ulong) (column-index :ulong) (element-value :int64))
26
 (defcfun ("dydra_term_matrix_resize" %%term-matrix-resize) :void (matrix-pointer :pointer) (row-count :ulong) (column-count :ulong))
27
 (defcfun ("dydra_term_matrix_clear" %%term-matrix-clear) :void (matrix-pointer :pointer))
28
 (defcfun ("dydra_term_matrix_clear_row" %%term-matrix-clear-row) :void (matrix-pointer :pointer) (row-index :ulong))
29
 (defcfun ("dydra_term_matrix_clear_column" %%term-matrix-clear-column) :void (matrix-pointer :pointer) (column-index :ulong))
30
 (defcfun ("dydra_term_matrix_fill" %%term-matrix-fill) :void (matrix-pointer :pointer) (element-value :int64))
31
 (defcfun ("dydra_term_matrix_fill_row" %%term-matrix-fill-row) :void (matrix-pointer :pointer) (row-index :ulong) (element-value :int64))
32
 (defcfun ("dydra_term_matrix_fill_column" %%term-matrix-fill-column) :void (matrix-pointer :pointer) (column-index :ulong) (element-value :int64))
33
 (defcfun ("dydra_term_matrix_drop_row" %%term-matrix-drop-row) :void (matrix-pointer :pointer) (row-index :ulong))
34
 (defcfun ("dydra_term_matrix_drop_rows" %%term-matrix-drop-rows) :void (matrix-pointer :pointer) (first-row-index :ulong) (last-row-index :ulong))
35
 (defcfun ("dydra_term_matrix_drop_column" %%term-matrix-drop-column) :void (matrix-pointer :pointer) (column-index :ulong))
36
 (defcfun ("dydra_term_matrix_drop_columns" %%term-matrix-drop-columns) :void (matrix-pointer :pointer) (first-column-index :ulong) (last-column-index :ulong))
37
 (defcfun ("dydra_term_matrix_prepend" %%term-matrix-prepend) :void (matrix-pointer :pointer) (other-pointer :pointer))
38
 (defcfun ("dydra_term_matrix_prepend_row" %%term-matrix-prepend-row) :long (matrix-pointer :pointer))
39
 (defcfun ("dydra_term_matrix_prepend_column" %%term-matrix-prepend-column) :long (matrix-pointer :pointer))
40
 (defcfun ("dydra_term_matrix_append" %%term-matrix-append) :void (matrix-pointer :pointer) (other-pointer :pointer))
41
 (defcfun ("dydra_term_matrix_append_row" %%term-matrix-append-row) :long (matrix-pointer :pointer))
42
 (defcfun ("dydra_term_matrix_append_column" %%term-matrix-append-column) :long (matrix-pointer :pointer))
43
 (defcfun ("dydra_term_matrix_rename_column" %%term-matrix-rename-column) :void (matrix-pointer :pointer) (column-index :ulong) (column-name :string))
44
 (defcfun ("dydra_term_matrix_sort" %%term-matrix-sort) :void (matrix-pointer :pointer) (reversed :boolean))
45
 (defcfun ("dydra_term_matrix_sort_by" %%term-matrix-sort-by) :void (matrix-pointer :pointer) (column-count :ulong) (column-indexes :pointer) (column-ordering :pointer))
46
 (defcfun ("dydra_term_matrix_print_to_fd" %%term-matrix-print-to-fd) :void (matrix-pointer :pointer) (fd :int))
47
 
48
 ;;; Term Matrix API: Constructors
49
 
50
 (defun make-term-matrix (&optional (row-count 0) (column-count 0))
51
   "Allocates a new matrix with the given dimensions."
52
   (declare (type fixnum row-count column-count))
53
   (let ((matrix-pointer (foreign-alloc :uint8 :count +term-matrix-sizeof+)))
54
     (declare (type foreign-pointer matrix-pointer))
55
     (%%term-matrix-construct matrix-pointer row-count column-count)
56
     matrix-pointer))
57
 
58
 ;;; Term Matrix API: Memory Management
59
 
60
 (defun term-matrix-construct (matrix-pointer &optional (row-count 0) (column-count 0))
61
   (declare (type foreign-pointer matrix-pointer))
62
   (with-checked-pointer (matrix-pointer)
63
     (%%term-matrix-construct matrix-pointer row-count column-count)))
64
 
65
 (defun term-matrix-destruct (matrix-pointer)
66
   (declare (type foreign-pointer matrix-pointer))
67
   (with-checked-pointer (matrix-pointer)
68
     (%%term-matrix-destruct matrix-pointer)))
69
 
70
 (defun term-matrix-clone (matrix-pointer)
71
   (declare (type foreign-pointer matrix-pointer))
72
   (with-checked-pointer (matrix-pointer)
73
     (%%term-matrix-clone matrix-pointer)))
74
 
75
 (defun term-matrix-dispose (matrix-pointer)
76
   (declare (type foreign-pointer matrix-pointer))
77
   (with-checked-pointer (matrix-pointer)
78
     (when (zerop (%%term-matrix-release matrix-pointer))
79
       (%%term-matrix-destruct matrix-pointer)
80
       (foreign-free matrix-pointer))))
81
 
82
 (defun term-matrix-retain (matrix-pointer)
83
   (declare (type foreign-pointer matrix-pointer))
84
   (with-checked-pointer (matrix-pointer)
85
     (%%term-matrix-retain matrix-pointer)))
86
 
87
 (defun term-matrix-release (matrix-pointer)
88
   (declare (type foreign-pointer matrix-pointer))
89
   (with-checked-pointer (matrix-pointer)
90
     (%%term-matrix-release matrix-pointer)))
91
 
92
 ;;; Term Matrix API: Accessors
93
 
94
 (declaim (inline term-matrix-empty-p))
95
 (defun term-matrix-empty-p (matrix-pointer)
96
   (declare (type foreign-pointer matrix-pointer))
97
   (with-checked-pointer (matrix-pointer)
98
     (zerop (term-matrix-size matrix-pointer))))
99
     ;(%%term-matrix-empty matrix-pointer)))
100
 
101
 (declaim (inline term-matrix-size))
102
 (defun term-matrix-size (matrix-pointer)
103
   "Returns the total byte size of the data contained in the given term matrix."
104
   (declare (type foreign-pointer matrix-pointer))
105
   (with-checked-pointer (matrix-pointer)
106
     (%%term-matrix-size matrix-pointer)))
107
 
108
 (declaim (inline term-matrix-data-pointer))
109
 (defun term-matrix-data-pointer (matrix-pointer)
110
   (declare (type foreign-pointer matrix-pointer))
111
   (with-checked-pointer (matrix-pointer)
112
     (%%term-matrix-data matrix-pointer)))
113
 
114
 (declaim (inline term-matrix-row-count))
115
 (defun term-matrix-row-count (matrix-pointer)
116
   "Returns the number of rows in the given term matrix."
117
   (declare (type foreign-pointer matrix-pointer))
118
   (with-checked-pointer (matrix-pointer)
119
     (%%term-matrix-row-count matrix-pointer)))
120
 
121
 (declaim (inline term-matrix-row-size))
122
 (defun term-matrix-row-size (matrix-pointer)
123
   "Returns the bytes per row in the given matrix."
124
   (declare (type foreign-pointer matrix-pointer))
125
   (%%term-matrix-row-size matrix-pointer))
126
 
127
 (declaim (inline term-matrix-column-count))
128
 (defun term-matrix-column-count (matrix-pointer)
129
   "Returns the number of columns in the given term matrix."
130
   (declare (type foreign-pointer matrix-pointer))
131
   (with-checked-pointer (matrix-pointer)
132
     (%%term-matrix-column-count matrix-pointer)))
133
 
134
 (declaim (inline term-matrix-element-count))
135
 (defun term-matrix-element-count (matrix-pointer)
136
   "Returns (* (TERM-MATRIX-ROW-COUNT) (TERM-MATRIX-COLUMN-COUNT))."
137
   (* (term-matrix-row-count matrix-pointer)
138
      (term-matrix-column-count matrix-pointer)))
139
 
140
 (declaim (inline term-matrix-get))
141
 (defun term-matrix-get (matrix-pointer row-index column-index)
142
   "Returns the value of the specified matrix element."
143
   (declare (type foreign-pointer matrix-pointer)
144
            (type fixnum row-index column-index))
145
   (with-checked-pointer (matrix-pointer)
146
     (%%term-matrix-get matrix-pointer row-index column-index)))
147
 
148
 ;;; Term Matrix API: Mutators
149
 
150
 (declaim (inline term-matrix-set))
151
 (defun term-matrix-set (matrix-pointer row-index column-index element-value)
152
   "Changes the value of the specified matrix element."
153
   (declare (type foreign-pointer matrix-pointer)
154
            (type fixnum row-index column-index element-value))
155
   (with-checked-pointer (matrix-pointer)
156
     (%%term-matrix-set matrix-pointer row-index column-index element-value)))
157
 
158
 (defun term-matrix-clear (matrix-pointer)
159
   "Sets all elements in the term matrix to contain the value zero.
160
    Does not change its dimensions."
161
   (declare (type foreign-pointer matrix-pointer))
162
   (%%term-matrix-clear matrix-pointer))
163
 
164
 (defun term-matrix-clear-row (matrix-pointer row-index)
165
   (declare (type foreign-pointer matrix-pointer)
166
            (type fixnum row-index))
167
   (%%term-matrix-clear-row matrix-pointer row-index))
168
 
169
 (defun term-matrix-clear-column (matrix-pointer column-index)
170
   (declare (type foreign-pointer matrix-pointer)
171
            (type fixnum column-index))
172
   (%%term-matrix-clear-column matrix-pointer column-index))
173
 
174
 (defun term-matrix-fill (matrix-pointer element-value)
175
   "Sets all elements in the matrix to contain the value zero. Does not
176
   change its dimensions."
177
   (declare (type foreign-pointer matrix-pointer)
178
            (type fixnum element-value))
179
   (with-checked-pointer (matrix-pointer)
180
     (%%term-matrix-fill matrix-pointer element-value)))
181
 
182
 (defun term-matrix-fill-row (matrix-pointer row-index element-value)
183
   (declare (type foreign-pointer matrix-pointer)
184
            (type fixnum row-index element-value))
185
   (with-checked-pointer (matrix-pointer)
186
     (%%term-matrix-fill-row matrix-pointer row-index element-value)))
187
 
188
 (defun term-matrix-fill-column (matrix-pointer column-index element-value)
189
   (declare (type foreign-pointer matrix-pointer)
190
            (type fixnum column-index element-value))
191
   (with-checked-pointer (matrix-pointer)
192
     (%%term-matrix-fill-column matrix-pointer column-index element-value)))
193
 
194
 (defun term-matrix-drop-column (matrix-pointer &optional column-index)
195
   (declare (type foreign-pointer matrix-pointer)
196
            (type (or fixnum null) column-index))
197
   (let ((column-index (or column-index
198
                           (1- (term-matrix-column-count matrix-pointer)))))
199
     (with-checked-pointer (matrix-pointer)
200
       (%%term-matrix-drop-column matrix-pointer column-index))
201
     column-index))
202
 
203
 (defun term-matrix-drop-columns (matrix-pointer column-indexes)
204
   (declare (type foreign-pointer matrix-pointer)
205
            (type list column-indexes))
206
   (with-checked-pointer (matrix-pointer)
207
     (let ((column-indexes (sort column-indexes #'>))) ;; descending order
208
       (dolist (column-index column-indexes)
209
         (%%term-matrix-drop-column matrix-pointer column-index))))
210
   (values))
211
 
212
 (defun term-matrix-append (matrix-pointer other-pointer)
213
   (declare (type foreign-pointer matrix-pointer other-pointer))
214
   (with-checked-pointers (matrix-pointer other-pointer)
215
     (%%term-matrix-append matrix-pointer other-pointer)))
216
 
217
 (defun term-matrix-append-row (matrix-pointer)
218
   (declare (type foreign-pointer matrix-pointer))
219
   (%%term-matrix-append-row matrix-pointer))
220
 
221
 (defun term-matrix-append-rows (matrix-pointer count)
222
   (declare (type foreign-pointer matrix-pointer)
223
            (type fixnum count))
224
   (let ((new-row-index (term-matrix-row-count matrix-pointer)))
225
     (term-matrix-resize matrix-pointer
226
                         (+ (term-matrix-row-count matrix-pointer) count)
227
                         (term-matrix-column-count matrix-pointer))
228
     new-row-index))
229
 
230
 (defun term-matrix-append-column (matrix-pointer)
231
   (declare (type foreign-pointer matrix-pointer))
232
   (%%term-matrix-append-column matrix-pointer))
233
 
234
 (defun term-matrix-append-columns (matrix-pointer count)
235
   (declare (type foreign-pointer matrix-pointer)
236
            (type fixnum count))
237
   (let ((new-column-index (term-matrix-column-count matrix-pointer)))
238
     (term-matrix-resize matrix-pointer
239
                         (term-matrix-row-count matrix-pointer)
240
                         (+ (term-matrix-column-count matrix-pointer) count))
241
     new-column-index))
242
 
243
 (defun term-matrix-resize (matrix-pointer row-count &optional column-count)
244
   "Changes the dimensions of the matrix, non-destructively when possible.
245
    New elements will be initialized to the value zero."
246
   (declare (type foreign-pointer matrix-pointer)
247
            (type fixnum row-count)
248
            (type (or fixnum null) column-count))
249
   (with-checked-pointer (matrix-pointer)
250
     (%%term-matrix-resize matrix-pointer row-count
251
                           (or column-count (term-matrix-column-count matrix-pointer)))))
252
 
253
 (defun term-matrix-sort (matrix-pointer &optional reversed)
254
   "Sorts all rows in the matrix in ascending or descending order."
255
   (declare (type foreign-pointer matrix-pointer)
256
            (type boolean reversed))
257
   (with-checked-pointer (matrix-pointer)
258
     (%%term-matrix-sort matrix-pointer reversed)))
259
 
260
 (defun term-matrix-sort-by (matrix-pointer column-indexes &optional row-count)
261
   "Sorts all rows in the matrix by the specified columns."
262
   (declare (type foreign-pointer matrix-pointer)
263
            (type list column-indexes)
264
            (type (or fixnum null) row-count))
265
   (when (null column-indexes)
266
     (cl:error "column indexes list cannot be empty"))
267
   (when row-count
268
     (term-matrix-resize matrix-pointer row-count
269
                         (term-matrix-column-count matrix-pointer)))
270
   (with-checked-pointer (matrix-pointer)
271
     (let ((column-count (term-matrix-column-count matrix-pointer))
272
           (column-indexes-count (length column-indexes)))
273
       (with-foreign-object (column-indexes-array :ulong column-indexes-count)
274
         (dotimes (i column-indexes-count)
275
           (let ((column-index (nth i column-indexes)))
276
             (cond ((< column-index 0)
277
                    (cl:error "column index out of bounds: ~d < 0"
278
                              column-index))
279
                   ((>= column-index column-count)
280
                    (cl:error "column index out of bounds: ~d > ~d"
281
                              column-index (1- column-count))))
282
             (setf (mem-aref column-indexes-array :ulong i)
283
                   column-index)))
284
         (%%term-matrix-sort-by matrix-pointer
285
                                column-indexes-count
286
                                column-indexes-array
287
                                (null-pointer))))))
288
 
289
 ;;; Term Matrix API: I/O
290
 
291
 ;;; Term Matrix API: Debugging
292
 
293
 (defun print-term-matrix (matrix-pointer &optional (stream *standard-output*))
294
   (declare (type foreign-pointer matrix-pointer))
295
   (print-unreadable-object (matrix-pointer stream :type nil :identity t)
296
     (format stream "DYDRA-NDK:TERM-MATRIX ~s x ~s"
297
             (term-matrix-row-count matrix-pointer)
298
             (term-matrix-column-count matrix-pointer))))