]> asedeno.scripts.mit.edu Git - cl-protobufs.git/commitdiff
wire-format: Replace LENGTH32 and LENGTH64 with VARINT-LENGTH
authorAlejandro R Sedeño <asedeno@google.com>
Fri, 5 Apr 2013 05:01:37 +0000 (01:01 -0400)
committerAlejandro R Sedeño <asedeno@google.com>
Wed, 29 May 2013 18:26:19 +0000 (14:26 -0400)
serialize.lisp
tests/varint-tests.lisp
tests/wire-tests.lisp
wire-format.lisp

index 6160eada058dd65c011d80e399f3089be3814161..178d34b03a7fdc52685bf8d98a033e67b0aa714f 100644 (file)
                                      (doseq (v (if slot (read-slot object slot reader) (list object)))
                                        (let ((tag1 (make-tag $wire-type-start-group (proto-index field)))
                                              (tag2 (make-tag $wire-type-end-group   (proto-index field))))
-                                         (iincf size (length32 tag1))
+                                         (iincf size (varint-length tag1))
                                          (dolist (f (proto-fields msg))
                                            (do-field v msg f))
-                                         (iincf size (length32 tag2))))
+                                         (iincf size (varint-length tag2))))
                                      (doseq (v (if slot (read-slot object slot reader) (list object)))
                                        (let ((tag (make-tag $wire-type-string (proto-index field)))
                                              (len (or (cached-object-size v visited)
                                                       (object-size v msg visited))))
-                                         (iincf size (length32 tag))
-                                         (iincf size (length32 len))
+                                         (iincf size (varint-length tag))
+                                         (iincf size (varint-length len))
                                          (dolist (f (proto-fields msg))
                                            (do-field v msg f))))))
                                   ((typep msg 'protobuf-enum)
                                        (if (eq (proto-message-type msg) :group)
                                          (let ((tag1 (make-tag $wire-type-start-group (proto-index field)))
                                                (tag2 (make-tag $wire-type-end-group   (proto-index field))))
-                                           (iincf size (length32 tag1))
+                                           (iincf size (varint-length tag1))
                                            (dolist (f (proto-fields msg))
                                              (do-field v msg f))
-                                           (iincf size (length32 tag2)))
+                                           (iincf size (varint-length tag2)))
                                          (let ((tag (make-tag $wire-type-string (proto-index field)))
                                                (len (or (cached-object-size v visited)
                                                         (object-size v msg visited))))
-                                           (iincf size (length32 tag))
-                                           (iincf size (length32 len))
+                                           (iincf size (varint-length tag))
+                                           (iincf size (varint-length len))
                                            (dolist (f (proto-fields msg))
                                              (do-field v msg f)))))))
                                   ((typep msg 'protobuf-enum)
                                  `(,iterator (,vval ,reader)
                                     (let ((len (or (cached-object-size ,vval visited)
                                                    (object-size ,vval ,msg visited))))
-                                      (iincf ,vsize (length32 ,tag1))
+                                      (iincf ,vsize (varint-length ,tag1))
                                       (iincf ,vsize len)
                                       (iincf ,vsize ,tag2))))
                                (let ((tag (make-tag $wire-type-string index)))
                                  `(,iterator (,vval ,reader)
                                     (let ((len (or (cached-object-size ,vval visited)
                                                    (object-size ,vval ,msg visited))))
-                                      (iincf ,vsize (length32 ,tag))
-                                      (iincf ,vsize (length32 len))
+                                      (iincf ,vsize (varint-length ,tag))
+                                      (iincf ,vsize (varint-length len))
                                       (iincf ,vsize len)))))))
                            ((typep msg 'protobuf-enum)
                             (let ((tag (make-tag $wire-type-varint index)))
                                   (when ,vval
                                     (let ((len (or (cached-object-size ,vval visited)
                                                    (object-size ,vval ,msg visited))))
-                                      (iincf ,vsize (length32 ,tag1))
+                                      (iincf ,vsize (varint-length ,tag1))
                                       (iincf ,vsize len)
-                                      (iincf ,vsize (length32 ,tag2))))))
+                                      (iincf ,vsize (varint-length ,tag2))))))
                              (let ((tag (make-tag $wire-type-string index)))
                                `(let ((,vval ,reader))
                                   (when ,vval
                                     (let ((len (or (cached-object-size ,vval visited)
                                                    (object-size ,vval ,msg visited))))
-                                      (iincf ,vsize (length32 ,tag))
-                                      (iincf ,vsize (length32 len))
+                                      (iincf ,vsize (varint-length ,tag))
+                                      (iincf ,vsize (varint-length len))
                                       (iincf ,vsize len))))))))
                          ((typep msg 'protobuf-enum)
                           (let ((tag (make-tag $wire-type-varint index)))
index 4c00c339f5bd03b52b754bb4704273a2e6200f3e..1f1d1903e27330d438b904c217a5befa86e2c5c8 100644 (file)
 
 ;;; Varint unit tests
 
-(define-test length32-test ()
-  (assert-equal (length32 0) 1)
-  (assert-equal (length32 1) 1)
-  (assert-equal (length32 127) 1)
-  (assert-equal (length32 128) 2)
-  (assert-equal (length32 16383) 2)
-  (assert-equal (length32 16384) 3)
-  (assert-equal (length32 (ash 1 31)) 5))
-
-(define-test length64-test ()
-  (assert-equal (length64 0) 1)
-  (assert-equal (length64 1) 1)
-  (assert-equal (length64 127) 1)
-  (assert-equal (length64 128) 2)
-  (assert-equal (length64 16383) 2)
-  (assert-equal (length64 16384) 3)
-  (assert-equal (length64 (- (ash 1 21) 1)) 3)
-  (assert-equal (length64 (ash 1 21)) 4)
-  (assert-equal (length64 (ash 1 63)) 10))
+(define-test varint-length-test ()
+  (assert-equal (varint-length 0) 1)
+  (assert-equal (varint-length 1) 1)
+  (assert-equal (varint-length 127) 1)
+  (assert-equal (varint-length 128) 2)
+  (assert-equal (varint-length 16383) 2)
+  (assert-equal (varint-length 16384) 3)
+  (assert-equal (varint-length (ash 1 31)) 5)
+  (assert-equal (varint-length (- (ash 1 21) 1)) 3)
+  (assert-equal (varint-length (ash 1 21)) 4)
+  (assert-equal (varint-length (ash 1 63)) 10))
 
 
 (define-test uint32-test ()
 
 
 (define-test-suite varint-tests ()
-  (length32-test
-   length64-test
+  (varint-length-test
    uint32-test
    uint64-test
    powers-varint-test
index 3add1c9feb839915432e4982c8ab12584d85cf49..8b2765a24d7d62d7be5336854d65242eb6145078 100644 (file)
   (flet ((verify (encoder pairs)
            (loop for (input output) in pairs
                  do (assert-true (= (funcall encoder input) output)))))
-    (verify #'length32
-            '((#x0 1) (#x7f 1)                ; 0-7 bits
-              (#x80 2) (#x3fff 2)             ; 8-14 bits
-              (#x4000 3) (#x1fffff 3)         ; 15-21 bits
-              (#x200000 4) (#xfffffff 4)      ; 22-28 bits
-              (#x10000000 5) (#xffffffff 5))) ; 29-35 bits, though we'll actually stop at 32 bits.
-    (verify #'length64
+    (verify #'varint-length
             '((#x0 1) (#x7f 1)                                    ; 0-7 bits
               (#x80 2) (#x3fff 2)                                 ; 8-14 bits
               (#x4000 3) (#x1fffff 3)                             ; 15-21 bits
index 96130f7998bb846831c82926b2813365244ab0b2..b4840a9756a6ae2f9d9bcb52c2a4caab66464f1d 100644 (file)
   (declare (type (unsigned-byte 32) tag))
   (locally (declare #.$optimize-serialization)
     (ecase type
-      ((:int32 :uint32)
-       (i+ (length32 tag) (length32 (ldb (byte 32 0) val))))
-      ((:int64 :uint64)
-       (i+ (length32 tag) (length64 (ldb (byte 64 0) val))))
+      ((:int32 :uint32 :int64 :uint64)
+       (i+ (varint-length tag) (varint-length val)))
       ((:sint32)
-       (i+ (length32 tag) (length32 (zig-zag-encode32 val))))
+       (i+ (varint-length tag) (varint-length (zig-zag-encode32 val))))
       ((:sint64)
-       (i+ (length32 tag) (length64 (zig-zag-encode64 val))))
+       (i+ (varint-length tag) (varint-length (zig-zag-encode64 val))))
       ((:fixed32 :sfixed32)
-       (i+ (length32 tag) 4))
+       (i+ (varint-length tag) 4))
       ((:fixed64 :sfixed64)
-       (i+ (length32 tag) 8))
+       (i+ (varint-length tag) 8))
       ((:string)
        (let ((len (babel:string-size-in-octets val :encoding :utf-8)))
-         (i+ (length32 tag) (length32 len) len)))
+         (i+ (varint-length tag) (varint-length len) len)))
       ((:bytes)
        (let ((len (length val)))
-         (i+ (length32 tag) (length32 len) len)))
+         (i+ (varint-length tag) (varint-length len) len)))
       ((:bool)
-       (i+ (length32 tag) 1))
+       (i+ (varint-length tag) 1))
       ((:float)
-       (i+ (length32 tag) 4))
+       (i+ (varint-length tag) 4))
       ((:double)
-       (i+ (length32 tag) 8))
+       (i+ (varint-length tag) 8))
       ;; A few of our homegrown types
       ((:symbol)
        (let ((len (if (keywordp val)
                     (length (symbol-name val))
                     (i+ (length (package-name (symbol-package val))) 1 (length (symbol-name val))))))
-         (i+ (length32 tag) (length32 len) len)))
+         (i+ (varint-length tag) (varint-length len) len)))
       ((:date :time :datetime :timestamp)
-       (i+ (length32 tag) 8)))))
+       (i+ (varint-length tag) 8)))))
 
 (define-compiler-macro prim-size (&whole form val type tag)
   (setq type (fold-symbol type)
                      :string :bytes :bool :float :double))
     `(locally (declare #.$optimize-serialization)
        ,(ecase type
-          ((:int32)
-           `(i+ (length32 ,tag) (length32 (ldb (byte 32 0) ,val))))
-          ((:int64)
-           `(i+ (length32 ,tag) (length64 (ldb (byte 64 0) ,val))))
-          ((:uint32)
-           `(i+ (length32 ,tag) (length32 ,val)))
-          ((:uint64)
-           `(i+ (length32 ,tag) (length64 ,val)))
+          ((:int32 :int64 :uint32 :uint64)
+           `(i+ (varint-length ,tag) (varint-length ,val)))
           ((:sint32)
-           `(i+ (length32 ,tag) (length32 (zig-zag-encode32 ,val))))
+           `(i+ (varint-length ,tag) (varint-length (zig-zag-encode32 ,val))))
           ((:sint64)
-           `(i+ (length32 ,tag) (length64 (zig-zag-encode64 ,val))))
+           `(i+ (varint-length ,tag) (varint-length (zig-zag-encode64 ,val))))
           ((:fixed32 :sfixed32)
-           `(i+ (length32 ,tag) 4))
+           `(i+ (varint-length ,tag) 4))
           ((:fixed64 :sfixed64)
-           `(i+ (length32 ,tag) 8))
+           `(i+ (varint-length ,tag) 8))
           ((:string)
            `(let ((len (babel:string-size-in-octets ,val :encoding :utf-8)))
-              (i+ (length32 ,tag) (length32 len) len)))
+              (i+ (varint-length ,tag) (varint-length len) len)))
           ((:bytes)
            `(let ((len (length ,val)))
-              (i+ (length32 ,tag) (length32 len) len)))
+              (i+ (varint-length ,tag) (varint-length len) len)))
           ((:bool)
-           `(i+ (length32 ,tag) 1))
+           `(i+ (varint-length ,tag) 1))
           ((:float)
-           `(i+ (length32 ,tag) 4))
+           `(i+ (varint-length ,tag) 4))
           ((:double)
-           `(i+ (length32 ,tag) 8))))
+           `(i+ (varint-length ,tag) 8))))
     form))
 
 (defun packed-size (values type tag &optional vectorp)
                  (declare (type fixnum len))
                  (map () #'(lambda (val)
                              (iincf len (ecase type
-                                          ((:int32 :uint32) (length32 (ldb (byte 32 0) val)))
-                                          ((:int64 :uint64) (length64 (ldb (byte 64 0) val)))
-                                          ((:sint32) (length32 (zig-zag-encode32 val)))
-                                          ((:sint64) (length64 (zig-zag-encode64 val)))
+                                          ((:int32 :uint32 :int64 :uint64) (varint-length val))
+                                          ((:sint32) (varint-length (zig-zag-encode32 val)))
+                                          ((:sint64) (varint-length (zig-zag-encode64 val)))
                                           ((:fixed32 :sfixed32) 4)
                                           ((:fixed64 :sfixed64) 8)
                                           ((:bool)   1)
       (declare (type (unsigned-byte 32) len))
       ;; Two value: the full size of the packed object, and the size
       ;; of just the payload
-      (values (i+ (length32 tag) (length32 len) len) len))))
+      (values (i+ (varint-length tag) (varint-length len) len) len))))
 
 ;; The optimized serializers supply 'vectorp' so we can generate better code
 (define-compiler-macro packed-size (&whole form values type tag
                     (declare (type fixnum len))
                     (,(if vectorp 'dovector 'dolist) (val ,values)
                        (iincf len ,(ecase type
-                                     ((:int32) `(length32 (ldb (byte 32 0) val)))
-                                     ((:int64) `(length64 (ldb (byte 64 0) val)))
-                                     ((:uint32) `(length32 val))
-                                     ((:uint64) `(length64 val))
-                                     ((:sint32) `(length32 (zig-zag-encode32 val)))
-                                     ((:sint64) `(length64 (zig-zag-encode64 val)))
+                                     ((:int32 :uint32 :int64 :uint64) `(varint-length val))
+                                     ((:sint32) `(varint-length (zig-zag-encode32 val)))
+                                     ((:sint64) `(varint-length (zig-zag-encode64 val)))
                                      ((:fixed32 :sfixed32) `4)
                                      ((:fixed64 :sfixed64) `8)
                                      ((:bool)   `1)
                                      ((:double) `8))))
                     len)))
          (declare (type (unsigned-byte 32) len))
-         (values (i+ (length32 (the (unsigned-byte 32) ,tag)) (length32 len) len) len)))
+         (values (i+ (varint-length (the (unsigned-byte 32) ,tag)) (varint-length len) len) len)))
     form))
 
 (defun enum-size (val enum-values tag)
                (and e (proto-index e)))))
     (unless idx
       (serialization-error "There is no enum value for ~S" val))
-    (i+ (length32 tag) (length32 (ldb (byte 32 0) idx)))))
+    (i+ (varint-length tag) (varint-length (ldb (byte 32 0) idx)))))
 
 (defun packed-enum-size (values enum-values tag)
   "Returns the size in bytes that the enum values will take when serialized."
                                         (and e (proto-index e)))))
                              (unless idx
                                (serialization-error "There is no enum value for ~S" val))
-                             (iincf len (length32 (ldb (byte 32 0) idx))))) values)
+                             (iincf len (varint-length (ldb (byte 32 0) idx))))) values)
                len)))
     (declare (type (unsigned-byte 32) len))
     ;; Two value: the full size of the packed object, and the size
     ;; of just the payload
-    (values (i+ (length32 tag) (length32 len) len) len)))
+    (values (i+ (varint-length tag) (varint-length len) len) len)))
 
 \f
 ;;; Wire-level encoders