Browse Source

putil: Fix reading/writing BitArray from/to bam file on 64-bit

Fixes #1181
rdb 4 years ago
parent
commit
5b30fa7adf
1 changed files with 18 additions and 8 deletions
  1. 18 8
      panda/src/putil/bitArray.cxx

+ 18 - 8
panda/src/putil/bitArray.cxx

@@ -909,10 +909,14 @@ normalize() {
  */
  */
 void BitArray::
 void BitArray::
 write_datagram(BamWriter *manager, Datagram &dg) const {
 write_datagram(BamWriter *manager, Datagram &dg) const {
-  dg.add_uint32(_array.size());
-  Array::const_iterator ai;
-  for (ai = _array.begin(); ai != _array.end(); ++ai) {
-    dg.add_uint32((*ai).get_word());
+  dg.add_uint32(_array.size() * (num_bits_per_word >> 5));
+
+  for (MaskType &item : _array) {
+    WordType word = item.get_word();
+    for (size_t i = 0; i < num_bits_per_word; i += 32) {
+      dg.add_uint32(word);
+      word >>= 32;
+    }
   }
   }
   dg.add_uint8(_highest_bits);
   dg.add_uint8(_highest_bits);
 }
 }
@@ -922,10 +926,16 @@ write_datagram(BamWriter *manager, Datagram &dg) const {
  */
  */
 void BitArray::
 void BitArray::
 read_datagram(DatagramIterator &scan, BamReader *manager) {
 read_datagram(DatagramIterator &scan, BamReader *manager) {
-  size_t num_words = scan.get_uint32();
-  _array = Array::empty_array(num_words);
-  for (size_t i = 0; i < num_words; ++i) {
-    _array[i] = WordType(scan.get_uint32());
+  size_t num_words32 = scan.get_uint32();
+  size_t num_bits = num_words32 << 5;
+
+  _array = Array::empty_array((num_bits + num_bits_per_word - 1) / num_bits_per_word);
+
+  for (size_t i = 0; i < num_bits; i += 32) {
+    int w = i / num_bits_per_word;
+    int b = i % num_bits_per_word;
+
+    _array[w].store(scan.get_uint32(), b, 32);
   }
   }
   _highest_bits = scan.get_uint8();
   _highest_bits = scan.get_uint8();
 }
 }