]> granicus.if.org Git - transmission/commitdiff
Fix bitfield bit removal, add more asserts, extend unit test
authorMike Gelfand <mikedld@mikedld.com>
Sun, 27 Dec 2015 16:34:47 +0000 (16:34 +0000)
committerMike Gelfand <mikedld@mikedld.com>
Sun, 27 Dec 2015 16:34:47 +0000 (16:34 +0000)
libtransmission/bitfield-test.c
libtransmission/bitfield.c

index 2479341a5df9bcda72b6b693fb340104ebf5256a..b9cbe243b5ce890cf1c5a8bfb6eded2fb3581af8 100644 (file)
@@ -78,7 +78,15 @@ test_bitfields (void)
   for (i=0; i<bitcount; i++)
     check (tr_bitfieldHas (&field, i));
 
+  /* test tr_bitfieldRem */
+  for (i=0; i<bitcount; i++)
+    if ((i % 7) != 0)
+      tr_bitfieldRem (&field, i);
+  for (i=0; i<bitcount; i++)
+    check (tr_bitfieldHas (&field, i) == (! (i % 7)));
+
   /* test tr_bitfieldRemRange in the middle of a boundary */
+  tr_bitfieldAddRange (&field, 0, 64);
   tr_bitfieldRemRange (&field, 4, 21);
   for (i=0; i<64; i++)
     check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 21)));
index cbf7afaa8c1504cf1561fbd960bc5a25e27acab7..d9cadbdc56ca9b2d63a0c9edae0f2ca146ec319c 100644 (file)
@@ -254,6 +254,8 @@ tr_bitfieldFreeArray (tr_bitfield * b)
 static void
 tr_bitfieldSetTrueCount (tr_bitfield * b, size_t n)
 {
+  assert (n <= b->bit_count);
+
   b->true_count = n;
 
   if (tr_bitfieldHasAll (b) || tr_bitfieldHasNone (b))
@@ -269,11 +271,23 @@ tr_bitfieldRebuildTrueCount (tr_bitfield * b)
 }
 
 static void
-tr_bitfieldIncTrueCount (tr_bitfield * b, int i)
+tr_bitfieldIncTrueCount (tr_bitfield * b, size_t i)
 {
+  assert (i <= b->bit_count);
+  assert (b->true_count <= b->bit_count - i);
+
   tr_bitfieldSetTrueCount (b, b->true_count + i);
 }
 
+static void
+tr_bitfieldDecTrueCount (tr_bitfield * b, size_t i)
+{
+  assert (i <= b->bit_count);
+  assert (b->true_count >= i);
+
+  tr_bitfieldSetTrueCount (b, b->true_count - i);
+}
+
 /****
 *****
 ****/
@@ -423,10 +437,10 @@ tr_bitfieldRem (tr_bitfield * b, size_t nth)
 {
   assert (tr_bitfieldIsValid (b));
 
-  if (!tr_bitfieldHas (b, nth) && tr_bitfieldEnsureNthBitAlloced (b, nth))
+  if (tr_bitfieldHas (b, nth) && tr_bitfieldEnsureNthBitAlloced (b, nth))
     {
       b->bits[nth >> 3u] &= (0xff7f >> (nth & 7u));
-      tr_bitfieldIncTrueCount (b, -1);
+      tr_bitfieldDecTrueCount (b, 1);
     }
 }
 
@@ -466,5 +480,5 @@ tr_bitfieldRemRange (tr_bitfield * b, size_t begin, size_t end)
         memset (b->bits + sb, 0, eb - sb);
     }
 
-  tr_bitfieldIncTrueCount (b, -diff);
+  tr_bitfieldDecTrueCount (b, diff);
 }