-(defmacro gen-length (bits)
- "Generate 32- or 64-bit versions of integer length functions."
- (assert (and (plusp bits) (zerop (mod bits 8))))
- (let* (;; Given bits, can we use fixnums safely?
- (fixnump (<= bits (integer-length most-negative-fixnum)))
- (ash (if fixnump 'iash 'ash))
- (zerop-val (if fixnump '(i= val 0) '(zerop val))))
- `(defun ,(fintern "~A~A" 'length bits) (val)
- ,(format nil "Returns the length that 'val' will take when encoded as a ~A-bit integer." bits)
- (declare #.$optimize-serialization)
- (declare (type (unsigned-byte ,bits) val))
- (let ((size 0))
- (declare (type fixnum size))
- (loop do (progn
- (setq val (,ash val -7))
- (iincf size))
- until ,zerop-val)
- size))))
-
-(gen-length 32)
-(gen-length 64)
-