]> asedeno.scripts.mit.edu Git - cl-protobufs.git/commitdiff
wire-format: Introduce VARINT-LENGTH to replace LENGTH32 and LENGTH64
authorAlejandro R Sedeño <asedeno@google.com>
Fri, 5 Apr 2013 04:54:39 +0000 (00:54 -0400)
committerAlejandro R Sedeño <asedeno@google.com>
Wed, 29 May 2013 18:26:19 +0000 (14:26 -0400)
pkgdcl.lisp
wire-format.lisp

index 130d0ca43d020f01289f61d8f85a06ef4152f552..dde86a23e6d7dec92b3c9f4873832aacda208a4d 100644 (file)
    "ZIG-ZAG-DECODE64"
    "LENGTH32"
    "LENGTH64"
+   "VARINT-LENGTH"
    "SKIP-ELEMENT"
 
    ;; Utilities
index b2eb45fef883b52af2986abdc8ea839a26418eac..96130f7998bb846831c82926b2813365244ab0b2 100644 (file)
 (gen-length 32)
 (gen-length 64)
 
+(defun varint-length (val)
+  "Return the length that 'val' will take when encoded as a varint integer."
+  (declare #.$optimize-serialization)
+  (let ((val (ldb (byte 64 0) val))
+        (size 0))
+    (declare (type (unsigned-byte 64) val))
+    (declare (type fixnum size))
+    (loop do (setq val (ash val -7))
+             (iincf size)
+          until (zerop val))
+    size))
+
 
 ;;; Skipping elements
 ;;; This is called at the lowest level, so arg types are assumed to be correct