/
bytes.clj
72 lines (62 loc) · 1.76 KB
/
bytes.clj
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
;; Copyright (c) Zachary Tellman. All rights reserved.
;; The use and distribution terms for this software are covered by the
;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;; which can be found in the file epl-v10.html at the root of this distribution.
;; By using this software in any fashion, you are agreeing to be bound by
;; the terms of this license.
;; You must not remove this notice, or any other, from this software.
(ns ^{:skip-wiki true}
gloss.data.bytes
(:use
[potemkin]
[gloss.core formats protocols])
(:require
[gloss.data.bytes.delimited :as delimited]
[gloss.data.bytes.core :as core]))
(import-fn core/byte-count)
(import-fn core/take-bytes)
(import-fn core/drop-bytes)
(import-fn core/take-contiguous-bytes)
(import-fn core/rewind-bytes)
(import-fn core/dup-bytes)
(import-fn core/duplicate)
(import-fn delimited/delimited-codec)
(import-fn delimited/wrap-delimited-sequence)
(import-fn delimited/delimited-bytes-codec)
(defn finite-byte-codec
[len]
(reify
Reader
(read-bytes [this b]
(if (< (byte-count b) len)
[false this b]
[true (take-bytes len b) (drop-bytes len b)]))
Writer
(sizeof [_]
len)
(write-bytes [_ _ v]
v)))
(defn wrap-finite-block
[prefix-codec codec]
(let [read-codec (compose-callback
prefix-codec
(fn [len b]
(if (zero? len)
[true nil b]
(read-bytes
(compose-readers
(finite-byte-codec len)
codec)
b))))]
(reify
Reader
(read-bytes [_ b]
(read-bytes read-codec b))
Writer
(sizeof [_]
nil)
(write-bytes [_ buf v]
(let [buf-seq (write-bytes codec nil v)]
(concat
(write-bytes prefix-codec nil (byte-count buf-seq))
buf-seq))))))