]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
include/small_encoding: rewrite small_{encode,decode}_signed_varint in terms of varint
authorSage Weil <sage@redhat.com>
Thu, 8 Sep 2016 14:26:29 +0000 (10:26 -0400)
committerSage Weil <sage@redhat.com>
Sun, 16 Oct 2016 14:32:49 +0000 (10:32 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/include/small_encoding.h

index 874bfa2f80a65ccb33063ec341044c52b3649016..4b8eee00c1845c719f9395ab0d012a0541789d8f 100644 (file)
@@ -40,39 +40,24 @@ inline void small_decode_varint(T& v, bufferlist::iterator& p)
 //
 // low bit = 1 = negative, 0 = positive
 // high bit of every byte indicates whether another byte follows.
-template<typename T>
-inline void small_encode_signed_varint(T v, bufferlist& bl) {
-  uint8_t byte = 0;
+inline void small_encode_signed_varint(int64_t v, bufferlist& bl) {
   if (v < 0) {
-    v = -v;
-    byte = 1;
-  }
-  byte |= (v & 0x3f) << 1;
-  v >>= 6;
-  while (v) {
-    byte |= 0x80;
-    ::encode(byte, bl);
-    byte = (v & 0x7f);
-    v >>= 7;
+    v = (-v << 1) | 1;
+  } else {
+    v <<= 1;
   }
-  ::encode(byte, bl);
+  small_encode_varint(v, bl);
 }
 
 template<typename T>
 inline void small_decode_signed_varint(T& v, bufferlist::iterator& p)
 {
-  uint8_t byte;
-  ::decode(byte, p);
-  bool negative = byte & 1;
-  v = (byte & 0x7e) >> 1;
-  int shift = 6;
-  while (byte & 0x80) {
-    ::decode(byte, p);
-    v |= (T)(byte & 0x7f) << shift;
-    shift += 7;
-  }
-  if (negative) {
-    v = -v;
+  int64_t i;
+  small_decode_varint(i, p);
+  if (i & 1) {
+    v = -(i >> 1);
+  } else {
+    v = i >> 1;
   }
 }