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

Fixes #1181
This commit is contained in:
rdb 2021-08-03 20:13:56 +02:00
parent d545dbd6eb
commit 5b30fa7adf

View File

@ -909,10 +909,14 @@ normalize() {
*/
void BitArray::
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);
}
@ -922,10 +926,16 @@ write_datagram(BamWriter *manager, Datagram &dg) const {
*/
void BitArray::
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();
}