forked from kraison/vivace-graph-v3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpcons.lisp
37 lines (33 loc) · 1.13 KB
/
pcons.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(in-package :graph-db)
(defstruct (pcons
(:constructor %make-pcons)
(:conc-name %pcons-)
(:print-function
(lambda (c s d)
(declare (ignore d))
(format s "#P(~A ~A (deleted-p ~A))"
(%pcons-car c) (%pcons-cdr c) (%pcons-deleted-p c)))))
car
cdr
deleted-p)
(defmethod serialize-pcons ((pcons pcons) heap)
(let ((address (allocate heap (+ 16 8 1))))
;; Serialize the id / pointer pair
(dotimes (i 16)
(set-byte heap
(+ i address)
(aref (%pcons-car pcons) i)))
(serialize-uint64 heap
(%pcons-cdr pcons)
(+ 16 address))
(let ((flags 0))
(when (%pcons-deleted-p pcons)
(setq flags (dpb 1 (byte 1 0) flags)))
(set-byte heap (+ 24 address) flags))
address))
(defgeneric deserialize-pcons (index-list address &optional buffer))
(defmethod mark-pcons-deleted ((pcons pcons) heap address)
(setf (%pcons-deleted-p pcons) t)
(let ((flags 0))
(setq flags (dpb 1 (byte 1 0) flags))
(set-byte heap (+ 24 address) flags)))